Що таке обмеження розміру / etc / hosts?


44

Як я можу визначити чи встановити обмеження розміру /etc/hosts? Скільки він може мати?


64
... Я думаю, що в момент, коли це стає справді хвилюванням, а не академічною цікавістю, ви далеко пройшли точку, коли було б розумніше створити приватний сервер DNS з точки зору продуктивності та ремонту.
Шадур

5
Я здивований, що ви запитуєте. Чому ви очікуєте деякого точного та важкого змістовного обмеження розміру у файлах конфігурації?
Базиль Старинкевич

3
@BasileStarynkevitch я запитав, оскільки файл хостів ~ 2 Мб не працював на моєму маршрутизаторі, але проблема полягала в тому, що я не зітхнув dnsmasq, щоб перечитати файл хостів.
Геремія

2
@Geremia мій файл хостів - 500 мільйонів, 15 000+ записів, жодних проблем. Завжди найкраще визначити першопричину вашої проблеми та вирішити її спочатку
bsd

3
Ви використовуєте свій хост-файл для блокування IP-адрес? Якщо так, вам слід використовувати iptables з ipset. Один лише використання iptables призведе до значного успіху в продуктивності, проте при ipset список майже 500 000 ips має незначний вплив.
кібернард

Відповіді:


57

Проблемні ефекти включають повільну роздільну здатність імені хоста (хіба що ОС якось перетворює лінійний список у структуру швидшого пошуку?) Та потенціал для дивної взаємодії із tabзавершенням роботи оболонки задовго до досягнення значущого розміру файлу.

Наприклад! Якщо ви помістите 500 000 записів на хост/etc/hosts

# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts

що стосується науки, tabзавершення імені хоста за замовчуванням у ZSH займає близько 25 секунд у моїй системі, щоб повернути запит на завершення (надано, це на ноутбуці 2008 року з 5400 об / хв, але все ж).


21

Я не думаю, що це обмеження розміру щодо кількості рядків.

До DNS (який був введений в експлуатацію в 1985 році) саме цей файл послужив єдиним засобом для пошуку імен хоста, тому я припускаю, що це означає, що цей файл повинен мати тисячі або хоча б сотні записів мати можливість підтримувати найбільш добре з’єднані Інтернет-вузли до 1985 року.

Ось приклад 1985 року (формат дещо змінився): http://jim.rees.org/apollo-archive/hosts.txt У цьому файлі 1680 рядків, з яких 1325 - хост-рядки. Решта 355 рядків порожні, коментарі, мережі або шлюзи 1 .

Єдиним реальним обмеженням, яке я міг знайти, було те, що в деяких системах окремі рядки обмежені менше BUFSIZсимволів (1024 на моїй машині OpenBSD).

Якщо у вас є декілька кількох записів /etc/hosts, слід замість цього створити локальний сервер імен, але це моя особиста думка.


1 Дякую Джеффу Шаллеру, що розкопав це.


Перед DNS, я не думаю, що це було звичайним для перетворення повної таблиці хостів в Інтернет у /etc/hostsформат. Більшість систем Unix навіть не були в Інтернеті, і навіть якщо це була машина, їй не знадобився повний стіл хостів, лише жменька машин, з якими потрібно було поговорити. Я був би здивований, якби було багато машин з більш ніж 100 записами.
Бармар

13

Як я можу визначити обмеження розміру / etc / hosts?

Це звичайний файл, тому ліміт повинен відповідати базовим обмеженням файлової системи (який би сам був обмежений кількістю дисків за ним) за вирахуванням місця, що використовується будь-якими іншими файлами в тій же (можливо, root ( /)) файловій системі:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (з типовим розміром блоку 4KiB)
  • xfs: 500 TiB

Як я можу встановити обмеження розміру / etc / hosts?

Оскільки це файл, що редагується вручну, лише вручну:

sed -i '100,$d' /etc/hosts

(для видалення рядків 100 і більше).


3
Правда в принципі, але обмеження файлової системи (наприклад, терабайт) практично не мають значення.
Базиль Старинкевич

11

Обмеження розміру застосовується лише при розподілі статичних буферів. gethostbyname(3), який аналізує записи в /etc/hosts, не виділяє статичні буфери - і ніколи не має. Оригінальний випуск 1983 року алгоритму BSD 4.3 показує файл з відкритим файлом, в той час як синтаксичний аналіз, закритий файл:

sethostent(0);
while (p = gethostent()) {
    if (strcmp(p->h_name, name) == 0)
        break;
    for (cp = p->h_aliases; *cp != 0; cp++)
        if (strcmp(*cp, name) == 0)
            goto found;
}
found:
endhostent();

Сучасні реалізації зберігають цю спадщину в усіх життєвих аспектах.

У будь-якому випадку *hostentсімейство функцій зберігає вказівник на поточний рядок у файлі. sethostentвідкриває файл і встановлює положення вказівника на файл. gethostentотримує дані та просуває вказівник. endhostentзакриває покажчик файлу. Бібліотека GNU C пропонує ретельне посилання на ці функції.

Як ви могли здогадатися з впровадження, записи, що виникають раніше у файлі, вирішуються швидше. Якщо файл ваших хостів величезний, це вступає в гру.

Отже, незалежно від того, наскільки великий файл, ОС буде споживати його. Однак врешті-решт, ви досягнете обмежень файлової системи (відповідно до відповіді Джеффа Шалера ). У вас також є максимальні обмеження розміру рядка (відповідно до відповіді Кусалананда ). Але, врешті-решт, ви можете зробити його настільки великим, як хочете. Але, будь ласка, не варто.


2
На жаль, glibc та linux, на жаль, не так просто. Якщо ви викликаєте gethostbyname і система налаштована відповідно (за замовчуванням у багатьох системах), вона замість зчитування / etc / host зателефонує nscd. Я не маю уявлення, чи буде nscd кешувати лише хіти у файлі чи намагатиметься кешувати його в цілому. У пізньому випадку у вас буде обмеження на
рамковий

1
Версія 4.3BSD тут . Він підтримував dbm-хешовану версію / etc / hosts. IIRC, dbm наклав деякі обмеження розміру, які можуть спричинити збій спроб створення хешованих db.
Марк Плотнік

2

... Я зламав свій мозок, і все життя я не можу придумати жодної ситуації чи обставини, коли ви звертаєтесь до будь-якого питання щодо обмеження розміру /etc/hosts- у вас виникнуть практичні проблеми, такі як серйозні Виконання продуктивності для getaddrinfo()сімейства системних дзвінків, що всі повинні проконсультуватися з файлом, перш ніж вирішити, чи надсилати запит DNS, нічого не говорити про проблеми з підтримкою плоского текстового файлу такого розміру.

Я підозрюю, що те, що ми маємо тут, - це неспроможність спілкуватися на більш високому рівні. Яку проблему ви намагаєтеся вирішити з гігантським /etc/hostsфайлом? Я майже впевнений, що є краще рішення, ніж це.


8
Деякі люди використовують hostsфайл для чорного списку оголошень / зловмисного програмного забезпечення / відстеження / тощо. В інтернеті є кураторні списки, я використовую 41k рядків та розміром 1,1 Мб.
Берт

Можливо, для продуктивності було б краще використовувати продуктивність dnsmasq- див., Наприклад, dnsgate (який я ще не пробував).
reinierpost

У шахти є 1,7 Мб з 57k лініями. Ви можете отримати свій величезний /etc/hostsфайл з hostingfile.org
летить

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.