Как я могу определить или установить предел размера /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
, не выделяет статические буферы - и никогда не имеет. Исходная версия алгоритма 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 огромен, это вступает в игру.
Таким образом, независимо от размера файла, ОС будет его использовать. В конце концов, однако, вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера ). У вас также есть максимальные пределы размера линии (согласно ответу Кусалананды ). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но, пожалуйста, не надо.
... Я ломал голову, и ради жизни я не могу вспомнить ни одной ситуации или обстоятельства, при которых вы бы подошли к какому-либо вопросу ограничения размера /etc/hosts
- вы столкнулись бы с практическими проблемами, такими как серьезные снижение производительности getaddrinfo()
семейства системных вызовов, которым все должны обратиться к файлу, прежде чем решить, следует ли отправлять DNS-запрос, не говоря уже о проблемах с сохранением плоского текстового файла такого размера.
Я подозреваю, что то, что мы имеем здесь, это неспособность общаться на более высоком уровне. Какую проблему вы пытаетесь решить с помощью гигантского /etc/hosts
файла? Я почти уверен, что есть лучшее решение, чем это.
hosts
файл для черного списка рекламы / вредоносных программ / отслеживания / и т. Д. В интернете есть кураторские списки, я использую 41 тыс. Строк и 1,1 МБ.
dnsmasq
для этого - см., Например, dnsgate (который я не пробовал).
/etc/hosts
файл с hostsfile.org