Le modifiche al /etc/hosts
file sembrano avere effetto immediato. Sono curioso dell'implementazione. Quale magia viene utilizzata per ottenere questa funzione?
Le modifiche al /etc/hosts
file sembrano avere effetto immediato. Sono curioso dell'implementazione. Quale magia viene utilizzata per ottenere questa funzione?
Risposte:
La magia sta aprendo il /etc/hosts
file e leggendolo:
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)
funzione, che è l' unica interfaccia di risoluzione dei nomi standard, si aprirà e leggerà /etc/hosts
ogni volta che viene chiamata per risolvere un nome host.
Le applicazioni più sofisticate che non utilizzano lo standard getaddrinfo(3)
, ma che in qualche modo stanno ancora aggiungendo /etc/hosts
al mix (ad esempio il dnsmasq
server DNS) potrebbero utilizzare inotify(7)
per monitorare le modifiche ai /etc/hosts
file e rileggerlo solo se necessario.
I browser e altre applicazioni simili non lo faranno. Si apriranno e leggeranno /etc/hosts
ogni volta che dovranno risolvere un nome host, anche se non stanno usando direttamente il risolutore di libc, ma stanno replicando il suo funzionamento con altri mezzi.
La risoluzione dei nomi, tra le altre cose, è gestita da /etc/nsswitch.conf
. Ecco un estratto:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
Nota la hosts
linea. Dice: "Quando si risolve un nome host, leggere prima il /etc/hosts
file per cercare il nome host, se non trovato, quindi eseguire una query DNS, se non trovato, provare il nome host di sistema configurato localmente".
Quindi ecco perché è così veloce. Si noti che non dipende dai servizi di rete sulla macchina, quindi non è necessario riavviare o ricaricare alcun servizio.
/etc/hosts
. Perché non utilizza una versione cache?