Perché le modifiche a / etc / hosts hanno effetto immediato?


18

Le modifiche al /etc/hostsfile sembrano avere effetto immediato. Sono curioso dell'implementazione. Quale magia viene utilizzata per ottenere questa funzione?

  1. Chiedi a Ubuntu: dopo aver modificato / etc / hosts quale servizio deve essere riavviato?
  2. Supporto NetApp: funzionamento del file / etc / hosts

5
Solo una nota sulla velocità del file hosts è in genere minuscola, raramente sopra qualche KB. Molto probabilmente è più piccolo della libreria compilata utilizzata per leggere il file. Un piccolo file usato regolarmente rimarrà spesso memorizzato nella cache. Quindi, anche se il file fosse letto per ogni richiesta, l'overhead per farlo sarebbe minimo (cioè molto veloce).
Philip Couling,

2
Relative unix.stackexchange.com/questions/388875/... al commento di Filippo :)
Jeff Schaller

Risposte:


27

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.


1
Potresti approfondire ciò che lo snippet fa per favore? Quello che mi interessa è come le modifiche si riflettono immediatamente nel codice in esecuzione (dovrebbe essere parte della rete nel sistema operativo giusto?).
Rudwna,

7
@rudwna: Vuol dire: "Ogni volta che un nome host deve essere cercato, il risolutore (parte della libreria C) apre / etc / hosts e lo legge. Quindi se il contenuto del file cambia tra letture, la lettura successiva utilizzerà i nuovi contenuti ".
Dirkt

3
Anche @rudwna, riguardo al "codice in esecuzione", il motivo per cui si notano immediatamente delle modifiche è che molti programmi standard non memorizzano nella cache gli indirizzi (o hanno una strategia di memorizzazione nella cache intelligente che ascolta gli aggiornamenti su / etc / hosts). Esistono sicuramente programmi là fuori che NON vedranno immediatamente le modifiche a / etc / hosts e dovranno essere riavviati. Dipende interamente da chi ha scritto il codice. Non c'è nulla di magico in / etc / hosts stesso.
SamYonnou,

9

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.


1
Ma potrebbe usare una versione del file memorizzata nella cache (diciamo, analizzata e nella memoria principale) /etc/hosts. Perché non utilizza una versione cache?
Peter Mortensen,

2
@PeterMortensen perché il sistema operativo memorizza già nella cache l'accesso ai file e gestisce anche le scritture correttamente.
Michael Borgwardt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.