Les modifications apportées au /etc/hosts
fichier semblent prendre effet immédiatement. Je suis curieux de la mise en œuvre. Quelle magie est utilisée pour réaliser cette fonctionnalité?
Les modifications apportées au /etc/hosts
fichier semblent prendre effet immédiatement. Je suis curieux de la mise en œuvre. Quelle magie est utilisée pour réaliser cette fonctionnalité?
Réponses:
La magie ouvre le /etc/hosts
fichier 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/hosts
chaque 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/hosts
au mélange (par exemple, le dnsmasq
serveur 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/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
(...)
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.
/etc/hosts
. Pourquoi n'utilise-t-il pas une version mise en cache?