Por que as alterações no / etc / hosts entram em vigor imediatamente?

18

Alterações no /etc/hostsarquivo parecem entrar em vigor imediatamente. Estou curioso sobre a implementação. Que mágica é usada para alcançar esse recurso?

  1. Pergunte ao Ubuntu: Depois de modificar o / etc / hosts, que serviço precisa ser reiniciado?
  2. Suporte da NetApp: Como o arquivo / etc / hosts funciona
Rudwna
fonte
5
Apenas uma observação sobre a velocidade do arquivo hosts geralmente é pequena, raramente acima de alguns KB. Provavelmente é menor que a biblioteca compilada usada para ler o arquivo. Um pequeno arquivo usado regularmente geralmente fica armazenado em cache na memória. Portanto, mesmo se o arquivo fosse lido para cada solicitação, a sobrecarga para isso seria mínima (ou seja: muito rápida).
Philip Couling
2
Relacionando unix.stackexchange.com/questions/388875/… ao comentário de Philip :)
Jeff Schaller

Respostas:

27

A mágica é abrir o /etc/hostsarquivo e lê-lo:

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

A getaddrinfo(3)função, que é a única interface de resolução de nomes padrão, será aberta e lida /etc/hostssempre que for chamada para resolver um nome de host.

Aplicativos mais sofisticados que não estão usando o padrão getaddrinfo(3), mas que ainda estão adicionando alguma /etc/hostsmistura ao mix (por exemplo, o dnsmasqservidor DNS), podem estar usando inotify(7)para monitorar alterações nos /etc/hostsarquivos e relê-los somente se necessário.

Navegadores e outros aplicativos não farão isso. Eles abrirão e lerão /etc/hoststoda vez que precisarem resolver um nome de host, mesmo que não estejam usando o resolvedor da libc diretamente, mas estejam replicando seu funcionamento por outros meios.

mosvy
fonte
11
Você poderia elaborar mais sobre o que o snippet faz por favor? O que me interessa é como as alterações são refletidas imediatamente no código em execução (deve fazer parte da rede no sistema operacional, certo?).
rudwna 25/06
7
@rudwna: Ele quer dizer: "Toda vez que um nome de host precisa ser consultado, o resolvedor (parte da biblioteca C) está abrindo o / etc / hosts e o lê. Portanto, se o conteúdo do arquivo mudar entre as leituras, a próxima leitura será usada o novo conteúdo ".
dirkt 25/06
3
@rudwna também, em relação ao "código em execução", a razão pela qual você vê alterações imediatamente é que muitos programas padrão não armazenam em cache endereços (ou eles têm alguma estratégia de cache inteligente que escuta atualizações em / etc / hosts). Certamente existem programas por aí que NÃO verão imediatamente alterações no / etc / hosts e precisam ser reiniciados. Depende inteiramente de quem escreveu o código. Não há nada de mágico no / etc / hosts.
SamYonnou 25/06
9

A resolução de nomes, entre outras coisas, é gerenciada por /etc/nsswitch.conf. Aqui está um trecho:

passwd:     files sss
shadow:     files sss
group:      files sss
hosts:      files dns myhostname
(...) 

Observe a hostslinha. Ele diz: "Ao resolver um nome de host, primeiro leia o /etc/hostsarquivo para procurar o nome do host, se não for encontrado, execute uma consulta DNS, se não for encontrado, tente o nome do host do sistema configurado localmente".

Então aqui está o porquê de ser tão rápido. Observe que ele não depende dos serviços de rede da máquina, portanto, não há serviço para reiniciar ou recarregar.

dr01
fonte
11
Mas poderia usar uma versão em cache (digamos, analisada e na memória principal) do arquivo /etc/hosts. Por que não está usando uma versão em cache?
Peter Mortensen
2
@PeterMortensen porque o sistema operacional já armazena em cache o acesso ao arquivo e até lida com as gravações corretamente.
Michael Borgwardt 26/06