Зміни у /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. Чому не використовується кешована версія?