Como obtenho o resolvconf para gerar novamente o resolv.conf depois de alterar o / etc / network / interfaces?

92

Depois de atualizar /etc/network/interfacescom algo muito semelhante ao abaixo, como faço /etc/resolv.confpara atualizar? Eu tentei (como root) resolver -u, service networking restartmas eles não funcionaram. Também corrigi o link simbólico resolv.confe tentei resolver -unovamente. Finalmente, frustrado, reiniciei, o que solucionou o problema ao reconstruir /etc/resolv.conf.

Ubuntu 12.04, servidor de 64 bits, todos os patches mais recentes instalados.

Exemplo /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
fonte
O que você estava tentando fazer com o resolv.conf estava impedindo você de fazer?
kingmilo

Respostas:

106

service networking restart nem sempre é uma maneira confiável de baixar todas as interfaces.

O resolvconf -ucomando é atualizado somente a resolv.confpartir do próprio banco de dados do resolvconf. Você precisa atualizar o banco de dados.

Para atualizar o banco de dados, é necessário chamar resolvconf com a opção -aou -d. Isso acontece nos bastidores quando você executa ifup ou ifdown. Portanto, normalmente, como em qualquer outra alteração de /etc/network/interfaces, para ativar as alterações nas opções dns- *, é necessário desmontar a interface em questão e instalá-la novamente. Ou você pode reiniciar.

Se você deseja fazer alterações em uma interface sem desativá-la (talvez porque você esteja administrando a máquina remotamente e por estar conectado por essa interface, natch), poderá obter o mesmo resultado executando o resolvconf diretamente na linha de comando. Isso requer um pouco mais de conhecimento da semântica do resolvconf. Suponha que a estrofe / e / n / i relevante seja

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

onde FFFF é uma família de endereços ("inet" ou "inet6").

Para ativar essas opções dns- *, execute o resolvconf da seguinte maneira (sim, com novas linhas na cadeia de caracteres direcionada para o resolvconf).

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

Para a estrofe dada na pergunta, seria o seguinte.

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

Consulte a página de manual resolvconf (8) e o arquivo README do pacote resolvconf (/usr/share/doc/resolvconf/README.gz) para obter mais informações.

jdthood
fonte
"Não faça" a reinicialização da rede de serviço "; essa não é uma maneira confiável de reduzir todas as interfaces". Funciona bem para mim. É bom saber a maneira limpa de fazê-lo.
Aki
11
Se você não deve "reiniciar a rede de serviço", posso sugerir que você não a coloque na primeira linha desta pergunta? Ao procurar apressadamente uma solução, a primeira coisa que fiz foi copiar e colar o primeiro comando que vi.
Robin Winslow
4
@RobinWinslow +1 por fazer o meu dia
Pete
8
Esta resposta é da própria pessoa que desenvolveu resolvconf :)
heemayl
2
Para reiniciar / reler /etc/network/interfaces, você pode fazer isso ifdown eth0 && ifup eth0:; funciona mesmo em uma sessão ssh remota.
Pierre-Damien
5

Para aqueles que gerenciam seus servidores remotamente, você pode:

  1. atualize a dns-nameserverslinha/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Observe que isso deve estar em uma linha dividida por; (o separador de linha de comando linux). Você não deve nem perder sua conexão atual. A exceção está cometendo um erro de digitação no arquivo de interfaces. Se isso acontecer ifupfalhará e você terá que ter acesso físico ou outra ethxxconexão.

brilhante
fonte
2

service resolvconf restartirá regenerar o /etc/resolv.confarquivo sem muito barulho.

Kamran
fonte
2
Eu receboFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
comando concluído, no entanto, não regenerado /etc/resolv.confno servidor ubuntu 14.04
Jossef Harush 17/18
1

Essa resposta é semelhante à acima, mas usa a configuração de exemplo de perguntas para responder à pergunta. Além disso, isso explica por que os dois comandos são necessários.

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

Essas alterações não ocorrerão, a menos que você reinicie ou recarregue o arquivo de configuração:

Para atualizar o arquivo de interfaces ao vivo, é necessário executar o seguinte comando:

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

Isso permite uma atualização da interface sem uma reinicialização ou recarregamento.

No entanto, as alterações do comando acima serão perdidas após uma reinicialização, se as alterações /etc/network/interfacesnão forem feitas.

A propósito, a última resposta do BDenis nesta lista realmente funciona no lugar do último comando, analisando o /etc/network/interfacesarquivo e canalizando essas linhas para o comando. sudo resolvconf -a eth0 Na verdade, é metade da resposta e um bom exemplo de análise sediada em linha. Se você quiser ver como isso funciona, basta executar a primeira parte do comando e assistir ao analisar o /etc/network/interfacesarquivo e cuspir todas as informações necessárias para executar o sudo resolvconf -a eth0comando:

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

Observe que isso produziria o mesmo resultado que o comando:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Desde que o /etc/network/interfacesarquivo esteja configurado com estas informações:

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
user3199107
fonte
Infelizmente não pode usar isso. Minha interface é gerenciada pelo gerenciador de rede e pelo DHCP, portanto, adicioná-la a /etc/network/interfacesnão é uma opção válida nesse caso. (Ubuntu 14.04)
Tino
1

Resposta simples:

Basta instalar o resolvconf. apt install resolvconf

Depois disso, ifup eth0atualiza o DNS etc/resolv.conf, de acordo com a dns-nameserverslinha /etc/network/interfaces.

trogne
fonte
interface desconhecida. Todo mundo realmente sabe como ofuscar os detalhes aqui ... Acho que devemos procurar conter todos os comandos. Script completo para cada um, sem prosa.
mathtick
1

No 18.04, o seguinte funciona de maneira confiável (executada como raiz):

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

Importante: Verifique se você tem o pacote resolvconfinstalado.
Por padrão, não parece que, e sem ela, algumas alterações (!) /etc/network/interfacesSão ignoradas silenciosamente (por exemplo dns-*).

Rafael
fonte
0

Isso funcionou para mim:

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 de acordo.

jbgeek
fonte
0

Na versão desktop do Ubuntu 18.04, onde não há serviço networkinge resolvconfnão está instalado por padrão, consegui me regenerar resolv.confreiniciando network-manager:

sudo service network-manager restart
Ruslan
fonte
-3

Além disso, você pode tentar este comando:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
fonte
3
Você pode explicar por que esse comando deve funcionar?
αғsнιη
11
Isso não funcionará corretamente se você tiver mais de um IP de servidor de nomes na linha dns-nameserver IP1 IP2. A linha deve ser repetida resolv.conf, mas não é.
Tino
Além disso, /etc/network/interfacesusa dns-nameservers(observe sno final) enquanto resolvconfusa nameserver. O comando não lida com isso. E mesmo que tudo estivesse correto, o pipeline sed | grep | seddefinitivamente não seria a maneira mais eficiente.
Melebius