Alterações no /etc/hosts
arquivo parecem entrar em vigor imediatamente. Estou curioso sobre a implementação. Que mágica é usada para alcançar esse recurso?
Alterações no /etc/hosts
arquivo parecem entrar em vigor imediatamente. Estou curioso sobre a implementação. Que mágica é usada para alcançar esse recurso?
Respostas:
A mágica é abrir o /etc/hosts
arquivo 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/hosts
sempre 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/hosts
mistura ao mix (por exemplo, o dnsmasq
servidor DNS), podem estar usando inotify(7)
para monitorar alterações nos /etc/hosts
arquivos e relê-los somente se necessário.
Navegadores e outros aplicativos não farão isso. Eles abrirão e lerão /etc/hosts
toda 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.
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 hosts
linha. Ele diz: "Ao resolver um nome de host, primeiro leia o /etc/hosts
arquivo 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.
/etc/hosts
. Por que não está usando uma versão em cache?