Le modifiche al /etc/hostsfile sembrano avere effetto immediato. Sono curioso dell'implementazione. Quale magia viene utilizzata per ottenere questa funzione?
Le modifiche al /etc/hostsfile sembrano avere effetto immediato. Sono curioso dell'implementazione. Quale magia viene utilizzata per ottenere questa funzione?
Risposte:
La magia sta aprendo il /etc/hostsfile 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/hostsogni 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/hostsal mix (ad esempio il dnsmasqserver DNS) potrebbero utilizzare inotify(7)per monitorare le modifiche ai /etc/hostsfile e rileggerlo solo se necessario.
I browser e altre applicazioni simili non lo faranno. Si apriranno e leggeranno /etc/hostsogni 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 hostslinea. Dice: "Quando si risolve un nome host, leggere prima il /etc/hostsfile 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?