¿Por qué los cambios en / etc / hosts entran en vigencia de inmediato?

18

Los cambios en el /etc/hostsarchivo parecen surtir efecto de inmediato. Tengo curiosidad por la implementación. ¿Qué magia se usa para lograr esta característica?

  1. Pregúntele a Ubuntu: después de modificar / etc / hosts, ¿qué servicio debe reiniciarse?
  2. Soporte de NetApp: cómo funciona el archivo / etc / hosts
Rudwna
fuente
55
Solo una nota sobre la velocidad del archivo de hosts es típicamente pequeño, rara vez por encima de unos pocos KB. Es muy probable que sea más pequeño que la biblioteca compilada utilizada para leer el archivo. Un archivo pequeño usado regularmente a menudo permanecerá en la memoria caché. Entonces, incluso si el archivo se leyera para cada solicitud, la sobrecarga para hacerlo sería mínima (es decir, muy rápida).
Philip Couling
2
Relacionando unix.stackexchange.com/questions/388875/… con el comentario de Philip :)
Jeff Schaller

Respuestas:

27

La magia es abrir el /etc/hostsarchivo 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/hostscada 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/hostsa la mezcla (por ejemplo, el dnsmasqservidor DNS) pueden estar usando inotify(7)para monitorear los cambios en los /etc/hostsarchivos 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/hostscada 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.

Mosvy
fuente
1
¿Podría dar más detalles sobre lo que hace el fragmento, por favor? Lo que me interesa es cómo los cambios se reflejan inmediatamente en el código en ejecución (¿debería ser parte de la red en el sistema operativo, verdad?).
Rudwna
77
@rudwna: Quiere decir: "Cada vez que se necesita buscar un nombre de host, el solucionador (parte de la biblioteca C) está abriendo / etc / hosts y lo lee. Entonces, si el contenido del archivo cambia entre lecturas, la siguiente lectura usará los nuevos contenidos ".
dirkt
3
@rudwna también, con respecto al "código en ejecución", la razón por la que ve cambios de inmediato es que muchos programas estándar no almacenan en caché las direcciones (o tienen alguna estrategia inteligente de almacenamiento en caché que escucha las actualizaciones de / etc / hosts). Ciertamente, existen programas que NO verán cambios de inmediato en / etc / hosts y deben reiniciarse. Depende completamente de quien escribió el código. No hay nada mágico en / etc / hosts en sí.
SamYonnou
9

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 hostslínea. Dice: "Al resolver un nombre de host, primero lea el /etc/hostsarchivo 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.

dr01
fuente
1
Pero podría usar una versión de archivo en caché (digamos, analizada y en memoria principal) /etc/hosts. ¿Por qué no está usando una versión en caché?
Peter Mortensen
2
@PeterMortensen porque el sistema operativo ya almacena en caché el acceso a los archivos e incluso maneja las escrituras correctamente.
Michael Borgwardt