Modifications apportées à /etc/hosts
le fichier semble prendre effet immédiatement. Je suis curieux de la mise en œuvre. Quelle magie est utilisée pour réaliser cette fonctionnalité?
La magie est d'ouvrir le fichier /etc/hosts
Et de le lire:
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 fonction getaddrinfo(3)
, qui est l'interface de résolution de nom standard niquement, va simplement s'ouvrir et lire /etc/hosts
Chaque fois qu'elle est 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 ajoutent quand même /etc/hosts
Au mixage (par exemple le serveur DNS dnsmasq
) peuvent utiliser inotify(7)
pour surveiller les modifications apportées aux fichiers /etc/hosts
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/hosts
Chaque 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.
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
(...)
Notez la ligne hosts
. 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.