¿Cómo obtengo resolvconf para regenerar resolv.conf después de cambiar / etc / network / interfaces?

92

Después de actualizar /etc/network/interfacescon algo muy similar al siguiente, ¿cómo puedo /etc/resolv.confactualizar? Lo intenté (como root) resolver -u, service networking restartpero no funcionaron. También arreglé el enlace simbólico resolv.confe intenté resolver -unuevamente. Finalmente, frustrado, reinicié, lo que solucionó el problema mediante la reconstrucción /etc/resolv.conf.

Ubuntu 12.04, servidor de 64 bits, todos los últimos parches instalados.

Ejemplo /etc/network/interfaces:

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameservers 192.168.3.45 192.168.8.10
nslntmnx
fuente
¿Qué intentabas hacer que resolv.conf te impedía hacer?
kingmilo

Respuestas:

106

service networking restart No siempre es una forma confiable de actualizar todas las interfaces.

El resolvconf -ucomando solo se actualiza resolv.confdesde la propia base de datos de resolvconf. Necesita actualizar la base de datos.

Para actualizar la base de datos, debe llamar a resolvconf con la opción -ao -d. Eso sucede detrás de escena cuando ejecutas ifup o ifdown. Entonces, normalmente, como con cualquier otro cambio a /etc/network/interfaces, para activar los cambios en las opciones dns- *, debe desactivar la interfaz en cuestión y volver a activarla. O puedes reiniciar.

Si desea realizar cambios en una interfaz sin desactivarla (tal vez porque está administrando la máquina de forma remota y está conectado a través de esa interfaz, natch), puede obtener el mismo resultado ejecutando resolvconf directamente desde la línea de comandos. Esto requiere un poco más de conocimiento de la semántica de resolvconf. Suponga que la estrofa / e / n / i relevante es

iface IIII FFFF static
    address ...
    ...
    dns-nameservers X.X.X.X Y.Y.Y.Y
    dns-search SSSS

donde FFFF es una familia de direcciones ("inet" o "inet6").

Para activar estas opciones dns- *, ejecute resolvconf de la siguiente manera (sí, con nuevas líneas en la cadena canalizadas a resolvconf).

echo "nameserver X.X.X.X
nameserver Y.Y.Y.Y
search SSSS" | sudo resolvconf -a IIII.FFFF

Para la estrofa dada en la pregunta, esto sería lo siguiente.

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

Consulte la página del manual resolvconf (8) y el archivo README del paquete resolvconf (/usr/share/doc/resolvconf/README.gz) para obtener más información.

jdthood
fuente
"No hacer" el reinicio de la red de servicio "; esa no es una forma confiable de reducir todas las interfaces". Funciona bien para mi. Es bueno saber la forma limpia de hacerlo.
Aki
11
Si no debe hacer "reinicio de red de servicio", ¿puedo sugerirle que no lo ponga en la primera línea de esta pregunta? Cuando buscaba una solución apresuradamente, lo primero que hice fue copiar y pegar el primer comando que vi.
Robin Winslow
44
@RobinWinslow +1 por alegrarme el día
Pete
8
Esta respuesta es de la persona que se ha desarrollado resolvconf :)
heemayl
2
Para reiniciar / releer /etc/network/interfaces, puede hacer eso ifdown eth0 && ifup eth0:; funciona incluso en una sesión ssh remota.
Pierre-Damien
5

Para aquellos de ustedes que administran sus servidores de forma remota, pueden:

  1. actualizar la dns-nameserverslínea en/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Tenga en cuenta que esto tiene que estar en una línea dividida con; (el separador de línea de comando de Linux). Ni siquiera deberías perder tu conexión actual. La excepción es hacer un error tipográfico en el archivo de interfaces. Si esto sucede ifup, fallará y tendrá que tener acceso físico u otra ethxxconexión.

chispeante
fuente
2

service resolvconf restartregenerará el /etc/resolv.confarchivo sin mucho alboroto.

Kamran
fuente
2
ObtengoFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
comando completado pero no regenerado /etc/resolv.confen el servidor ubuntu 14.04
Jossef Harush
1

Esta respuesta es similar a la anterior pero usa la configuración de ejemplo de preguntas para responder la pregunta. Además, esto explica por qué ambos comandos son necesarios.

Editar /etc/network/interfaces:

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameserver 192.168.3.45
    dns-nameserver 192.168.8.10

Estos cambios no tendrán lugar a menos que reinicie o vuelva a cargar el archivo de configuración:

Para actualizar el archivo de interfaces en vivo, es necesario ejecutar el siguiente comando:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

Esto permite una actualización de la interfaz sin necesidad de reiniciar o volver a cargar.

Sin embargo, los cambios de comando anteriores se perderán después de un reinicio si /etc/network/interfacesno se realizan los cambios en el .

Por cierto, la última respuesta de BDenis en esta lista realmente funciona en lugar del último comando al analizar el /etc/network/interfacesarchivo y canalizar esas líneas en el comando. sudo resolvconf -a eth0 En realidad, es la mitad de la respuesta y un muy buen ejemplo de análisis de sed en línea. Si desea ver cómo lo hace, simplemente ejecute la primera parte del comando y observe cómo analiza el /etc/network/interfacesarchivo y escupe toda la información necesaria que necesita para ejecutar el sudo resolvconf -a eth0comando:

sed 's/#.*$//' /etc/network/interfaces | grep dns- | sed 's/dns-//g'

Tenga en cuenta que esto produciría la misma salida que el comando:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Siempre que el /etc/network/interfacesarchivo esté configurado con esta información:

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameserver 192.168.3.45 
    dns-nameserver 192.168.8.10
usuario3199107
fuente
Lamentablemente no puedo usar eso. Mi interfaz es administrada por el administrador de red y DHCP, por lo que agregarla no /etc/network/interfaceses una opción válida en ese caso. (Ubuntu 14.04)
Tino
1

Respuesta simple:

Simplemente instale resolvconf. apt install resolvconf

Después de eso, ifup eth0actualiza el dns en etc/resolv.conf, de acuerdo con la dns-nameserverslínea en /etc/network/interfaces.

Trogne
fuente
interfaz desconocida Todos realmente saben cómo ofuscar los detalles aquí ... Creo que deberíamos tratar de contener todos los comandos. Guión completo para cada uno, sin prosa.
mathtick el
1

En 18.04, lo siguiente funciona de manera confiable (ejecutarse como root):

systemctl stop networking
ip address flush dev <device> # just to be safe
systemctl start networking

Importante: asegúrese de tener el paquete resolvconfinstalado.
No parece ser por defecto, y sin él algunos (!) Cambios /etc/network/interfacesse ignoran silenciosamente (por ejemplo dns-*).

Rafael
fuente
0

Esto funcionó para mí:

sed -re '/nameservers|dns-search/ !d' -e 's/dns-nameservers/nameserver/' -e 's/dns-search/search/' /etc/network/interfaces  | resolvconf -a eth0.inet && resolvconf -u

Ajustar en consecuencia.

jbgeek
fuente
0

En la versión de escritorio de Ubuntu 18.04, donde no hay servicio networkingy resolvconfno está instalado por defecto, he logrado regenerar resolv.confreiniciando network-manager:

sudo service network-manager restart
Ruslan
fuente
-3

También puedes probar este comando:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
fuente
3
¿Puedes explicar por qué este comando debería funcionar?
αғsнιη
1
Esto no funciona correctamente si tiene más de una IP de servidor de nombres en la línea dns-nameserver IP1 IP2. La línea debe repetirse resolv.conf, pero no lo es.
Tino
Además, /etc/network/interfacesutiliza dns-nameservers(observe sel final) mientras que resolvconfutiliza nameserver. El comando no se ocupa de eso. E incluso si todo fuera correcto, la tubería sed | grep | seddefinitivamente no sería la forma más eficiente.
Melebius