Почему изменения в / etc / hosts вступают в силу немедленно?

18

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

  1. Спросите Ubuntu: после изменения / etc / hosts какую службу нужно перезапустить?
  2. Поддержка NetApp: как работает файл / etc / hosts
rudwna
источник
5
Просто заметка о скорости файла hosts обычно крошечная, редко превышает несколько КБ. Скорее всего, он меньше, чем скомпилированная библиотека, используемая для чтения файла. Небольшой регулярно используемый файл часто остается в кэше. Таким образом, даже если файл будет прочитан для каждого запроса, накладные расходы для этого будут минимальными (то есть: очень быстрыми).
Филипп Коулинг
2
Относительно unix.stackexchange.com/questions/388875/... на комментарий Филиппа :)
Джефф Schaller

Ответы:

27

Волшебство открывает /etc/hostsфайл и читает его:

strace -e trace=file wget -O /dev/null http://www.google.com http://www.facebook.com http://unix.stackexchange.com 2>&1 | grep hosts
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 5
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4

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

Более сложные приложения, которые не используют стандарт getaddrinfo(3), но все еще каким-то образом добавляют /etc/hostsк миксу (например, dnsmasqDNS-сервер), могут использовать inotify(7)для отслеживания изменений в /etc/hostsфайлах и перечитывать их только при необходимости.

Браузеры и другие подобные приложения этого не сделают. Они будут открываться и читать /etc/hostsкаждый раз, когда им нужно разрешить имя хоста, даже если они не используют распознаватель libc напрямую, а реплицируют его работу другими способами.

mosvy
источник
1
Не могли бы вы подробнее рассказать о том, что делает фрагмент, пожалуйста? Что меня интересует, так это то, как изменения немедленно отражаются в работающем коде (должна быть сетевая часть в ОС, верно?).
рудна
7
@rudwna: Он имеет в виду: «Каждый раз, когда нужно найти имя хоста, распознаватель (часть библиотеки C) открывает / etc / hosts и читает его. Поэтому, если содержимое файла меняется между чтениями, при следующем чтении будет использоваться новое содержание ".
dirkt
3
@rudwna также, что касается «запуска кода», причина, по которой вы видите изменения немедленно, заключается в том, что многие стандартные программы не кэшируют адреса (или у них есть некоторая интеллектуальная стратегия кэширования, которая прослушивает обновления в / etc / hosts). Конечно, есть программы, которые НЕ будут сразу же видеть изменения в / etc / hosts и должны быть перезапущены. Это полностью зависит от того, кто написал код. В самом файле / etc / hosts нет ничего волшебного.
SamYonnou
9

Разрешение имен, помимо прочего, управляется /etc/nsswitch.conf. Вот выдержка:

passwd:     files sss
shadow:     files sss
group:      files sss
hosts:      files dns myhostname
(...) 

Обратите внимание на hostsстроку. В нем говорится: «При разрешении имени хоста сначала прочитайте /etc/hostsфайл для поиска имени хоста, если он не найден, затем запустите DNS-запрос, если не найден, то попробуйте локально сконфигурированное имя хоста системы».

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

dr01
источник
1
Но он может использовать кэшированную (скажем, проанализированную и в основной памяти) версию файла /etc/hosts. Почему он не использует кэшированную версию?
Питер Мортенсен
2
@PeterMortensen, потому что ОС уже кэширует доступ к файлу и даже правильно обрабатывает записи.
Майкл Боргвардт