Изменения в /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к миксу (например, dnsmasqDNS-сервер), могут использовать 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. Почему он не использует кэшированную версию?