Каков предел размера / etc / hosts?


44

Как я могу определить или установить предел размера /etc/hosts? Сколько строк это может иметь?


64
... Я думаю , что в момент , когда это становится фактическое беспокойство , а не академическое любопытство вы далеко прошли точку , где было бы разумнее создать частный сервер DNS с точки зрения производительности и ремонтопригодности.
Шадур

5
Я удивлен, что вы спрашиваете. Почему вы ожидаете какого-то точного и жесткого значимого ограничения на размер файлов конфигурации?
Старынкевич,

3
@BasileStarynkevitch Я спросил, потому что файл хоста ~ 2 МБ не работал на моем маршрутизаторе, но проблема заключалась в том, что я не вздохнул dnsmasq, чтобы перечитать файл хостов.
Джеремия

2
@Geremia мой хост-файл 500M, более 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, не выделяет статические буферы - и никогда не имеет. Исходная версия алгоритма BSD 4.3 1983 года показывает открытый файл, а строка анализа - шаблон закрытого файла:

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 предлагает подробное описание этих функций.

Как можно догадаться из реализации, записи, находящиеся ранее в файле, разрешаются быстрее. Если ваш файл hosts огромен, это вступает в игру.

Таким образом, независимо от размера файла, ОС будет его использовать. В конце концов, однако, вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера ). У вас также есть максимальные пределы размера линии (согласно ответу Кусалананды ). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но, пожалуйста, не надо.


2
Использование glibc и linux, к сожалению, не так просто. Если вы вызываете gethostbyname и система настроена соответствующим образом (по умолчанию на многих системах), то вместо чтения / etc / host вызовет nscd. Я понятия не имею, будет ли NSCD кэшировать только попадания в файл или попытаться кэшировать его целиком. В последнем случае у вас будет ограничение оперативной памяти для размера файла (при условии, что конфигурация nscd допускает столько записей)
PlasmaHH

1
Версия 4.3BSD находится здесь . Он поддерживал версию / etc / hosts с хэшем в dbm. IIRC, dbm наложил некоторые ограничения на размер, что может привести к неудаче при попытках создания хэшированной БД.
Марк Плотник

2

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

Я подозреваю, что то, что мы имеем здесь, это неспособность общаться на более высоком уровне. Какую проблему вы пытаетесь решить с помощью гигантского /etc/hostsфайла? Я почти уверен, что есть лучшее решение, чем это.


8
Некоторые люди используют hostsфайл для черного списка рекламы / вредоносных программ / отслеживания / и т. Д. В интернете есть кураторские списки, я использую 41 тыс. Строк и 1,1 МБ.
Берт

Вероятно, было бы лучше использовать производительность dnsmasqдля этого - см., Например, dnsgate (который я не пробовал).
reinierpost

Мой имеет 1,7 МБ с 57k строк. Вы можете получить ваш огромный /etc/hostsфайл с hostsfile.org
пенополистирол летать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.