Los cambios en el /etc/hosts
archivo parecen surtir efecto de inmediato. Tengo curiosidad por la implementación. ¿Qué magia se usa para lograr esta característica?
Los cambios en el /etc/hosts
archivo parecen surtir efecto de inmediato. Tengo curiosidad por la implementación. ¿Qué magia se usa para lograr esta característica?
Respuestas:
La magia es abrir el /etc/hosts
archivo y leerlo:
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)
función, que es la única interfaz de resolución de nombres estándar, se abrirá y leerá /etc/hosts
cada vez que se llame para resolver un nombre de host.
Las aplicaciones más sofisticadas que no usan el estándar getaddrinfo(3)
, pero que de alguna manera se agregan /etc/hosts
a la mezcla (por ejemplo, el dnsmasq
servidor DNS) pueden estar usando inotify(7)
para monitorear los cambios en los /etc/hosts
archivos y volver a leerlo solo si es necesario.
Los navegadores y otras aplicaciones similares no lo harán. Se abrirán y leerán /etc/hosts
cada vez que necesiten resolver un nombre de host, incluso si no están utilizando el solucionador de libc directamente, sino que están replicando su funcionamiento por otros medios.
La resolución de nombres, entre otras cosas, es administrada por /etc/nsswitch.conf
. Aquí hay un extracto:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
Tenga en cuenta la hosts
línea. Dice: "Al resolver un nombre de host, primero lea el /etc/hosts
archivo para buscar el nombre de host, si no lo encuentra, ejecute una consulta DNS, si no lo encuentra, intente con el nombre de host del sistema configurado localmente".
Así que aquí está el por qué es tan rápido. Tenga en cuenta que no depende de los servicios de red en la máquina, por lo que no hay servicio para reiniciar o recargar.
/etc/hosts
. ¿Por qué no está usando una versión en caché?