Чому зміни в / etc / hosts набувають чинності негайно?


18

Зміни у /etc/hostsфайлі, начебто, набувають чинності негайно. Мені цікаво про реалізацію. Яка магія використовується для досягнення цієї особливості?

  1. Запитайте Ubuntu: Після зміни / etc / hosts яку службу потрібно перезапустити?
  2. Підтримка NetApp: як працює файл / etc / hosts

5
Просто примітка про швидкість файлу хостів, як правило, крихітна, рідко вище кількох КБ. Це, швидше за все, менше, ніж складена бібліотека, яка використовується для читання файлу. Невеликий регулярно використовуваний файл часто залишатиметься в пам'яті. Тож навіть якби файл читався для кожного запиту, накладні витрати для цього були б мінімальними (тобто: дуже швидко).
Філіп Кулінг

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, але реплікують його роботу іншими способами.


1
Не могли б ви детальніше розібратися про те, що робити фрагмент? Мене цікавить те, як зміни негайно відображаються у запущеному коді (чи має бути мережева частина в ОС правильно?).
rudwna

7
@rudwna: Він означає: "Кожен раз, коли потрібно шукати ім'я хоста, роздільник (частина бібліотеки С) відкриває / 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, якщо його не знайдено, то спробуйте локально налаштоване ім'я хоста".

Тож ось чому це так швидко. Зверніть увагу, що це не залежить від мережевих служб на пристрої, тому немає служби перезапустити або перезавантажити.


1
Але він може використовувати кешовану (скажімо, проаналізовану та в основній пам'яті) версію файлу /etc/hosts. Чому не використовується кешована версія?
Пітер Мортенсен

2
@PeterMortensen, тому що ОС вже кешує доступ до файлів і навіть обробляє записи правильно.
Майкл Боргвардт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.