Изменения в /etc/hosts
файле, кажется, вступают в силу немедленно. Мне любопытно о реализации. Какая магия используется для достижения этой функции?
Изменения в /etc/hosts
файле, кажется, вступают в силу немедленно. Мне любопытно о реализации. Какая магия используется для достижения этой функции?
Ответы:
Волшебство открывает /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
к миксу (например, dnsmasq
DNS-сервер), могут использовать inotify(7)
для отслеживания изменений в /etc/hosts
файлах и перечитывать их только при необходимости.
Браузеры и другие подобные приложения этого не сделают. Они будут открываться и читать /etc/hosts
каждый раз, когда им нужно разрешить имя хоста, даже если они не используют распознаватель libc напрямую, а реплицируют его работу другими способами.
Разрешение имен, помимо прочего, управляется /etc/nsswitch.conf
. Вот выдержка:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
Обратите внимание на hosts
строку. В нем говорится: «При разрешении имени хоста сначала прочитайте /etc/hosts
файл для поиска имени хоста, если он не найден, затем запустите DNS-запрос, если не найден, то попробуйте локально сконфигурированное имя хоста системы».
Вот почему это так быстро. Обратите внимание, что это не зависит от сетевых служб на машине, поэтому нет службы для перезапуска или перезагрузки.
/etc/hosts
. Почему он не использует кэшированную версию?