Comment faire en sorte que resolvconf régénère resolv.conf après avoir modifié / etc / network / interfaces?

92

Après avoir mis /etc/network/interfacesà jour avec quelque chose de très similaire à ci-dessous, comment puis-je mettre /etc/resolv.confà jour? J'ai essayé (en tant que root) resolver -u, service networking restartmais ils n'ont pas fonctionné. J'ai également corrigé le lien symbolique resolv.confet réessayé resolver -u. Finalement, frustré, j'ai redémarré, ce qui a résolu le problème en reconstruisant /etc/resolv.conf.

Ubuntu 12.04, serveur 64 bits, tous les derniers correctifs installés.

Exemple /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
la source
Qu'essayiez-vous de faire que resolv.conf vous empêche de faire?
kingmilo

Réponses:

106

service networking restart n’est pas toujours un moyen fiable de réduire toutes les interfaces.

La resolvconf -ucommande ne met resolv.confà jour que depuis la propre base de données de resolvconf. Vous devez mettre à jour la base de données.

Pour mettre à jour la base de données, vous devez appeler resolvconf avec l' option -aou -d. Cela se produit dans les coulisses lorsque vous exécutez ifup ou ifdown. Ainsi, normalement, comme pour toute autre modification apportée à /etc/network/interfaces, pour activer les modifications des options dns- *, vous devez désactiver l'interface en question et la réactiver. Ou vous pouvez redémarrer.

Si vous souhaitez modifier une interface sans la supprimer (peut-être parce que vous administrez la machine à distance et que vous êtes connecté via cette interface, natch), vous pouvez obtenir le même résultat en exécutant resolvconf directement à partir de la ligne de commande. Cela nécessite un peu plus de connaissance de la sémantique de resolvconf. Supposons que la strophe / e / n / i pertinente est

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

où FFFF est une famille d'adresses ("inet" ou "inet6").

Pour activer ces options dns- *, exécutez resolvconf comme suit (oui, avec des lignes nouvelles dans la chaîne acheminée vers resolvconf).

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

Pour la strophe donnée dans la question, ce serait la suivante.

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

Consultez la page de manuel resolvconf (8) et le fichier README du paquet resolvconf (/usr/share/doc/resolvconf/README.gz) pour plus d'informations.

jdthood
la source
"Ne faites pas" redémarrage du réseau de service ", ce n'est pas un moyen fiable de réduire toutes les interfaces." Fonctionne bien pour moi. Bon à savoir la façon propre de le faire cependant.
Aki
11
Si vous ne devriez pas faire "redémarrage du réseau de service", puis-je vous suggérer de ne pas le mettre dans la première ligne de cette question? Lorsque j'ai rapidement cherché une solution, la première chose que j'ai faite a été de copier et coller la première commande que j'ai vue.
Robin Winslow
4
@RobinWinslow +1 pour avoir fait ma journée
Pete
8
Cette réponse provient de la personne elle-même qui a développé resolvconf :)
heemayl
2
Pour redémarrer / Relire /etc/network/interfaces, vous pouvez le faire: ifdown eth0 && ifup eth0; cela fonctionne même dans une session ssh distante.
Pierre-Damien
5

Pour ceux d'entre vous qui gèrent vos serveurs à distance, vous pouvez:

  1. mettre à jour la dns-nameserversligne dans/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Notez que cela doit être sur une ligne divisée avec; (le séparateur de ligne de commande linux). Vous ne devriez même pas perdre votre connexion actuelle. L'exception fait une faute de frappe dans le fichier d'interfaces. Si cela se produit ifupéchouera et vous devrez avoir un accès physique ou une autre ethxxconnexion.

pétillant
la source
2

service resolvconf restartva régénérer le /etc/resolv.conffichier sans grande difficulté.

Kamran
la source
2
Je reçoisFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
commande terminée mais pas régénérée /etc/resolv.confsur le serveur ubuntu 14.04
Jossef Harush
1

Cette réponse est similaire à celle ci-dessus, mais utilise l'exemple de configuration des questions pour répondre à la question. De plus, cela explique pourquoi les deux commandes sont nécessaires.

Modifier /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

Ces modifications ne seront effectuées que si vous redémarrez ou rechargez le fichier de configuration:

Pour mettre à jour le fichier d'interface en direct, il est nécessaire d'exécuter la commande suivante:

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

Cela permet une mise à jour de l'interface sans redémarrage ni rechargement.

Toutefois, les modifications de commande ci-dessus seront perdues après un redémarrage si les modifications /etc/network/interfacesne sont pas apportées.

A propos, la dernière réponse de BDenis dans cette liste fonctionne réellement à la place de la dernière commande en analysant le /etc/network/interfacesfichier et en canalisant ces lignes dans la commande. sudo resolvconf -a eth0 C'est en fait la moitié de la réponse et un très bon exemple d'analyse inline sed. Si vous voulez voir comment cela fonctionne, exécutez simplement la première partie de la commande et regardez-la analyser le /etc/network/interfacesfichier et extraire toutes les informations nécessaires pour exécuter la sudo resolvconf -a eth0commande:

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

Notez que cela produirait le même résultat que la commande:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Si le /etc/network/interfacesfichier est configuré avec ces informations:

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
utilisateur3199107
la source
Malheureusement, je ne peux pas utiliser ça. Mon interface étant gérée par le gestionnaire de réseau et DHCP, son ajout /etc/network/interfacesn’est donc pas une option valide dans ce cas. (Ubuntu 14.04)
Tino
1

Réponse simple:

Installez simplement resolvconf. apt install resolvconf

Après cela, ifup eth0met à jour le DNS dans etc/resolv.conf, en fonction de la dns-nameserversligne /etc/network/interfaces.

Trogne
la source
interface inconnue. Tout le monde sait vraiment comment obscurcir les détails ici ... Je pense que nous devrions viser à conteneuriser toutes les commandes. Script complet pour chacun, pas de prose.
mathtick
1

Le 18.04, fonctionne comme suit de manière fiable (exécuté en tant que root):

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

Important: Assurez-vous que le paquet est resolvconfinstallé.
Cela ne semble pas être le cas par défaut, et sans elle, certains changements (!) /etc/network/interfacesSont ignorés en silence (par exemple dns-*).

Raphaël
la source
0

Cela a fonctionné pour moi:

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

Ajuste en accord.

Jbgeek
la source
0

Sur la version de bureau d'Ubuntu 18.04, où il n'y a pas de service networkinget resolvconfn'est pas installé par défaut, j'ai réussi à régénérer resolv.confen redémarrant network-manager:

sudo service network-manager restart
Ruslan
la source
-3

Aussi, vous pouvez essayer cette commande:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
la source
3
Pouvez-vous expliquer pourquoi cette commande devrait fonctionner?
mardi
1
Cela ne fonctionne pas correctement si vous avez plus d'une adresse IP de serveur de noms dans la ligne dns-nameserver IP1 IP2. La ligne doit alors être répétée resolv.conf, mais ne l’est pas.
Tino
De plus, /etc/network/interfacesutilise dns-nameservers(notez le sà la fin) tout en resolvconfutilisant nameserver. La commande ne s'en occupe pas. Et même si tout était correct, le pipeline sed | grep | sedne serait certainement pas le moyen le plus efficace.
Melebius