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

Вы можете сохранить его как массив, а не строку, чтобы использовать позже во многих случаях, и позволить подстановке произойти, когда вы его определите. В вашем случае, например:

k=(~/code/public/*/*.launch)
for i in "${k[@]}"; do

или в более позднем примере, вам потребуется eval некоторые строки

dirs=(~/code/private/* ~/code/public/*)
for i in "${dirs[@]}"; do
    for j in $exclude; do
        eval "for k in $i/$j; do tmutil addexclusion \"\$k\"; done"
    done
done
44
28.08.2017, 19:03
5 ответов

Проблемные эффекты включают медленное разрешение имени хоста (, если ОС каким-то образом не преобразует линейный список в более быструю структуру поиска -в -? )и возможность неожиданного взаимодействия с оболочкой вкладка завершение задолго до того, как будет достигнут какой-либо значимый размер файла.

Например! Если разместить 500 000 записей хостов в/etc/hosts

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

для науки, имя хоста по умолчанию вкладка завершение в ZSH занимает около ~25 секунд в моей системе, чтобы вернуть запрос на завершение (предоставлено, это на ноутбуке 2008 года с 5400 об/мин диск, но все же ).

58
27.01.2020, 19:34

Я не думаю, что у него есть ограничение по количеству строк.

До использования DNS (в 1985 году )именно этот файл служил единственным средством для поиска имен хостов, поэтому я предполагаю, что это означает, что файл должен иметь тысячи или, по крайней мере, сотни записей, чтобы иметь возможность поддерживать наиболее -подключенные интернет-узлы до -1985 года.

Вот пример из 1985 года (формат несколько изменился):http://jim.rees.org/apollo-archive/hosts.txtВ этом файле 1680 строк, из которых 1325 строк хоста. Остальные 355 строк пустые, комментарии, сети или шлюзы 1 .

Единственное реальное ограничение, которое я смог найти, заключалось в том, что в некоторых системах отдельные строки ограничены менее чем BUFSIZсимволами (1024 на моей машине с OpenBSD ).

Если у вас более пары записей в /etc/hosts, вам следует подумать о настройке локального сервера имен, но это мое личное мнение.


1Спасибо Джеффу Шаллеру за то, что раскопал это.

21
27.01.2020, 19:34

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

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

2
27.01.2020, 19:34

Ограничения по размеру применяются только при выделении статических буферов. 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 огромен, это вступает в игру.

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

11
27.01.2020, 19:34

How can I determine the size limit of /etc/hosts?

Это обычный файл, поэтому ограничение будет соответствовать ограничениям базовой файловой системы (, которые сами будут ограничены количеством дисков позади него )за вычетом пространства, используемого любыми другими файлами в том же (вероятно корневая(/))файловая система:

  • доб 2/3 :2 ТиБ
  • ext4 :16 ТиБ (с размером блока по умолчанию 4 КБ)
  • XFS :500 ТиБ

How can I set the size limit of /etc/hosts?

Так как это редактируемый вручную -файл, только вручную:

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

(для удаления строк 100 и далее ).

13
27.01.2020, 19:34

Теги

Похожие вопросы