Pourquoi les modifications apportées à / etc / hosts prennent-elles effet immédiatement?

18

Les modifications apportées au /etc/hostsfichier semblent prendre effet immédiatement. Je suis curieux de la mise en œuvre. Quelle magie est utilisée pour réaliser cette fonctionnalité?

  1. Demandez à Ubuntu: Après avoir modifié / etc / hosts, quel service doit être redémarré?
  2. Prise en charge de NetApp: fonctionnement du fichier / etc / hosts
Rudwna
la source
5
Juste une note sur la vitesse du fichier hosts est généralement minuscule, rarement supérieure à quelques Ko. Elle est probablement plus petite que la bibliothèque compilée utilisée pour lire le fichier. Un petit fichier régulièrement utilisé restera souvent en mémoire cache. Ainsi, même si le fichier était lu pour chaque demande, la surcharge pour le faire serait minime (c'est-à-dire: très rapide).
Philip Couling
2
Relative unix.stackexchange.com/questions/388875/... au commentaire de Philip :)
Jeff Schaller

Réponses:

27

La magie ouvre le /etc/hostsfichier et le lit:

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

La getaddrinfo(3)fonction, qui est la seule interface de résolution de nom standard, s'ouvrira et lira /etc/hostschaque fois qu'elle sera appelée pour résoudre un nom d'hôte.

Des applications plus sophistiquées qui n'utilisent pas la norme getaddrinfo(3), mais qui continuent à s'ajouter /etc/hostsau mélange (par exemple, le dnsmasqserveur DNS) peuvent être utilisées inotify(7)pour surveiller les modifications apportées au/etc/hosts fichiers et les relire uniquement si nécessaire.

Les navigateurs et autres applications de ce type ne le feront pas. Ils s'ouvriront et liront /etc/hostschaque fois qu'ils auront besoin de résoudre un nom d'hôte, même s'ils n'utilisent pas directement le résolveur de libc, mais répliquent son fonctionnement par d'autres moyens.

mosvy
la source
1
Pourriez-vous nous en dire plus sur ce que fait l'extrait s'il vous plaît? Ce qui m'intéresse, c'est comment les changements se reflètent immédiatement dans le code en cours d'exécution (devrait faire partie du réseau dans le système d'exploitation, non?).
rudwna
7
@rudwna: Il signifie: "Chaque fois qu'un nom d'hôte doit être recherché, le résolveur (une partie de la bibliothèque C) ouvre / etc / hosts et le lit. Donc, si le contenu du fichier change entre les lectures, la lecture suivante utilisera le nouveau contenu ".
dirkt
3
@rudwna également, en ce qui concerne le "code en cours d'exécution", la raison pour laquelle vous voyez des changements immédiatement est que de nombreux programmes standard ne mettent pas en cache les adresses (ou qu'ils ont une stratégie de mise en cache intelligente qui écoute les mises à jour vers / etc / hosts). Il existe certainement des programmes qui ne verront PAS immédiatement les modifications apportées à / etc / hosts et doivent être redémarrés. C'est entièrement à celui qui a écrit le code. / Etc / hosts n'a rien de magique.
SamYonnou
9

La résolution de noms, entre autres, est gérée par /etc/nsswitch.conf. En voici un extrait:

passwd:     files sss
shadow:     files sss
group:      files sss
hosts:      files dns myhostname
(...) 

Noter la hosts ligne. Il dit: "Lors de la résolution d'un nom d'hôte, lisez d'abord/etc/hosts fichier pour rechercher le nom d'hôte, s'il n'est pas trouvé, exécutez une requête DNS, s'il n'est pas trouvé, essayez le nom d'hôte du système configuré localement".

Voici donc pourquoi c'est si rapide. Notez qu'il ne dépend pas des services réseau sur la machine, il n'y a donc pas de service pour redémarrer ou recharger.

dr01
la source
1
Mais il pourrait utiliser une version mise en cache (par exemple, analysée et dans la mémoire principale) du fichier /etc/hosts. Pourquoi n'utilise-t-il pas une version mise en cache?
Peter Mortensen
2
@PeterMortensen car le système d'exploitation met déjà en cache l'accès aux fichiers et gère même correctement les écritures.
Michael Borgwardt