Änderungen an der /etc/hosts
Datei scheinen sofort wirksam zu werden. Ich bin gespannt auf die Umsetzung. Welche Magie wird verwendet, um diese Funktion zu erreichen?
Änderungen an der /etc/hosts
Datei scheinen sofort wirksam zu werden. Ich bin gespannt auf die Umsetzung. Welche Magie wird verwendet, um diese Funktion zu erreichen?
Antworten:
Die Magie öffnet die /etc/hosts
Datei und liest sie:
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
Die getaddrinfo(3)
Funktion, die die einzige Standardschnittstelle zur Namensauflösung ist, wird /etc/hosts
jedes Mal geöffnet und gelesen, wenn sie zur Auflösung eines Hostnamens aufgerufen wird.
Anspruchsvollere Anwendungen, die nicht den Standard verwenden getaddrinfo(3)
, aber /etc/hosts
die Mischung dennoch irgendwie ergänzen (z. B. der dnsmasq
DNS-Server) inotify(7)
, überwachen möglicherweise Änderungen an den /etc/hosts
Dateien und lesen sie nur dann erneut, wenn dies erforderlich ist.
Browser und andere solche Anwendungen tun dies nicht. Sie öffnen und lesen /etc/hosts
jedes Mal, wenn sie einen Hostnamen auflösen müssen, auch wenn sie den libc-Resolver nicht direkt verwenden, sondern dessen Funktionsweise auf andere Weise replizieren.
Die Namensauflösung wird unter anderem von verwaltet /etc/nsswitch.conf
. Hier ist ein Auszug:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
Beachten Sie die hosts
Linie. Es heißt: "Wenn Sie einen Hostnamen auflösen, lesen Sie zuerst die /etc/hosts
Datei, um nach dem Hostnamen zu suchen. Wenn sie nicht gefunden wird, führen Sie eine DNS-Abfrage aus. Wenn sie nicht gefunden wird, versuchen Sie es mit dem lokal konfigurierten System-Hostnamen."
Deshalb ist es hier so schnell. Beachten Sie, dass dies nicht von den Netzwerkdiensten auf dem Computer abhängt, sodass kein Dienst zum Neustarten oder erneuten Laden verfügbar ist.
/etc/hosts
. Warum wird keine zwischengespeicherte Version verwendet?