Warum werden Änderungen an / etc / hosts sofort wirksam?

18

Änderungen an der /etc/hostsDatei scheinen sofort wirksam zu werden. Ich bin gespannt auf die Umsetzung. Welche Magie wird verwendet, um diese Funktion zu erreichen?

  1. Ubuntu fragen: Nach dem Ändern von / etc / hosts, welcher Dienst muss neu gestartet werden?
  2. NetApp Support: Funktionsweise der Datei / etc / hosts
rudwna
quelle
5
Nur eine Anmerkung zur Geschwindigkeit: Die Hosts-Datei ist normalerweise winzig, selten größer als ein paar KB. Es ist wahrscheinlich kleiner als die kompilierte Bibliothek, die zum Lesen der Datei verwendet wird. Eine kleine Datei, die regelmäßig verwendet wird, bleibt häufig im Arbeitsspeicher zwischengespeichert. Selbst wenn die Datei für jede Anforderung gelesen würde, wäre der Aufwand dafür minimal (dh sehr schnell).
Philip Couling
2
Im Zusammenhang unix.stackexchange.com/questions/388875/... Philipps Kommentar :)
Jeff Schaller

Antworten:

27

Die Magie öffnet die /etc/hostsDatei 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/hostsjedes 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/hostsdie Mischung dennoch irgendwie ergänzen (z. B. der dnsmasqDNS-Server) inotify(7), überwachen möglicherweise Änderungen an den /etc/hostsDateien und lesen sie nur dann erneut, wenn dies erforderlich ist.

Browser und andere solche Anwendungen tun dies nicht. Sie öffnen und lesen /etc/hostsjedes 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.

Mosvy
quelle
1
Könnten Sie bitte näher erläutern, was das Snippet bewirkt? Was mich interessiert ist, wie sich die Änderungen sofort in laufendem Code widerspiegeln (sollte das Netzwerk Teil des Betriebssystems sein?).
Rudwna
7
@rudwna: Er meint: "Jedes Mal, wenn ein Hostname nachgeschlagen werden muss, öffnet der Resolver (Teil der C-Bibliothek) / etc / hosts und liest ihn. Wenn sich der Inhalt der Datei zwischen den Lesevorgängen ändert, wird der nächste Lesevorgang verwendet die neuen Inhalte ".
25.
3
@rudwna auch, in Bezug auf "Code ausführen", der Grund, warum Sie Änderungen sofort sehen, ist, dass viele Standardprogramme keine Adressen zwischenspeichern (oder sie haben eine intelligente Caching-Strategie, die auf Aktualisierungen von / etc / hosts wartet). Es gibt sicherlich Programme, die Änderungen an / etc / hosts NICHT sofort sehen und neu gestartet werden müssen. Es liegt ganz bei dem, der den Code geschrieben hat. Es ist nichts Magisches an / etc / hosts.
SamYonnou
9

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 hostsLinie. Es heißt: "Wenn Sie einen Hostnamen auflösen, lesen Sie zuerst die /etc/hostsDatei, 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.

dr01
quelle
1
Es könnte jedoch eine zwischengespeicherte (z. B. geparste und im Hauptspeicher befindliche) Version der Datei verwendet werden /etc/hosts. Warum wird keine zwischengespeicherte Version verwendet?
Peter Mortensen
2
@PeterMortensen, da das Betriebssystem den Dateizugriff bereits zwischenspeichert und sogar Schreibvorgänge korrekt verarbeitet.
Michael Borgwardt