Як я можу визначити чи встановити обмеження розміру /etc/hosts
? Скільки він може мати?
Як я можу визначити чи встановити обмеження розміру /etc/hosts
? Скільки він може мати?
Відповіді:
Проблемні ефекти включають повільну роздільну здатність імені хоста (хіба що ОС якось перетворює лінійний список у структуру швидшого пошуку?) Та потенціал для дивної взаємодії із tabзавершенням роботи оболонки задовго до досягнення значущого розміру файлу.
Наприклад! Якщо ви помістите 500 000 записів на хост/etc/hosts
# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts
що стосується науки, tabзавершення імені хоста за замовчуванням у ZSH займає близько 25 секунд у моїй системі, щоб повернути запит на завершення (надано, це на ноутбуці 2008 року з 5400 об / хв, але все ж).
Я не думаю, що це обмеження розміру щодо кількості рядків.
До DNS (який був введений в експлуатацію в 1985 році) саме цей файл послужив єдиним засобом для пошуку імен хоста, тому я припускаю, що це означає, що цей файл повинен мати тисячі або хоча б сотні записів мати можливість підтримувати найбільш добре з’єднані Інтернет-вузли до 1985 року.
Ось приклад 1985 року (формат дещо змінився): http://jim.rees.org/apollo-archive/hosts.txt У цьому файлі 1680 рядків, з яких 1325 - хост-рядки. Решта 355 рядків порожні, коментарі, мережі або шлюзи 1 .
Єдиним реальним обмеженням, яке я міг знайти, було те, що в деяких системах окремі рядки обмежені менше BUFSIZ
символів (1024 на моїй машині OpenBSD).
Якщо у вас є декілька кількох записів /etc/hosts
, слід замість цього створити локальний сервер імен, але це моя особиста думка.
1 Дякую Джеффу Шаллеру, що розкопав це.
/etc/hosts
формат. Більшість систем Unix навіть не були в Інтернеті, і навіть якщо це була машина, їй не знадобився повний стіл хостів, лише жменька машин, з якими потрібно було поговорити. Я був би здивований, якби було багато машин з більш ніж 100 записами.
Як я можу визначити обмеження розміру / etc / hosts?
Це звичайний файл, тому ліміт повинен відповідати базовим обмеженням файлової системи (який би сам був обмежений кількістю дисків за ним) за вирахуванням місця, що використовується будь-якими іншими файлами в тій же (можливо, root ( /
)) файловій системі:
Як я можу встановити обмеження розміру / etc / hosts?
Оскільки це файл, що редагується вручну, лише вручну:
sed -i '100,$d' /etc/hosts
(для видалення рядків 100 і більше).
Обмеження розміру застосовується лише при розподілі статичних буферів. 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 пропонує ретельне посилання на ці функції.
Як ви могли здогадатися з впровадження, записи, що виникають раніше у файлі, вирішуються швидше. Якщо файл ваших хостів величезний, це вступає в гру.
Отже, незалежно від того, наскільки великий файл, ОС буде споживати його. Однак врешті-решт, ви досягнете обмежень файлової системи (відповідно до відповіді Джеффа Шалера ). У вас також є максимальні обмеження розміру рядка (відповідно до відповіді Кусалананда ). Але, врешті-решт, ви можете зробити його настільки великим, як хочете. Але, будь ласка, не варто.
... Я зламав свій мозок, і все життя я не можу придумати жодної ситуації чи обставини, коли ви звертаєтесь до будь-якого питання щодо обмеження розміру /etc/hosts
- у вас виникнуть практичні проблеми, такі як серйозні Виконання продуктивності для getaddrinfo()
сімейства системних дзвінків, що всі повинні проконсультуватися з файлом, перш ніж вирішити, чи надсилати запит DNS, нічого не говорити про проблеми з підтримкою плоского текстового файлу такого розміру.
Я підозрюю, що те, що ми маємо тут, - це неспроможність спілкуватися на більш високому рівні. Яку проблему ви намагаєтеся вирішити з гігантським /etc/hosts
файлом? Я майже впевнений, що є краще рішення, ніж це.
hosts
файл для чорного списку оголошень / зловмисного програмного забезпечення / відстеження / тощо. В інтернеті є кураторні списки, я використовую 41k рядків та розміром 1,1 Мб.
dnsmasq
- див., Наприклад, dnsgate (який я ще не пробував).
/etc/hosts
файл з hostingfile.org