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