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

76

Depois de atualizar o /etc/network/interfaces com algo muito semelhante ao abaixo, como obtenho o /etc/resolv.conf para atualizar? Eu tentei (como root) resolver -u , service networking restart mas eles não funcionaram. Eu também consertei o symlink para resolv.conf e tentei resolver -u novamente. Finalmente, em frustração, reiniciei, o que corrigiu o problema reconstruindo /etc/resolv.conf .

Ubuntu 12.04, servidor de 64 bits, todos os últimos patches 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
    
por nslntmnx 03.12.2012 / 13:59

9 respostas

91

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

O comando resolvconf -u atualiza apenas resolv.conf do banco de dados do resolvconf. Você precisa atualizar o banco de dados.

Para atualizar o banco de dados, você deve chamar o resolvconf com a opção -a ou -d . Isso acontece nos bastidores quando você executa ifup ou ifdown. Então, normalmente, como acontece com qualquer outra mudança no /etc/network/interfaces , para ativar as mudanças nas opções do dns- * você tem que ifdown a interface em questão e, se for novamente. Ou você pode reiniciar.

Se você quiser fazer alterações em uma interface sem o fazer o downdown (talvez porque você está administrando a máquina remotamente e esteja conectada através dessa interface, natch) então você pode obter o mesmo resultado executando o resolvconf diretamente da linha de comando. . Isso requer um pouco mais de conhecimento da semântica do resolvconf. Suponha que a estrofe relevante / e / n / i 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 estas opções do dns- * você executa o resolvconf da seguinte maneira (sim, com novas linhas na string canalizada 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 questão, isso 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 mais informações.

    
por jdthood 03.12.2012 / 20:23
19

Embora a página de manual não esteja instalada por padrão, ela é documentada por meio da opção de atualização de scripts, apenas execute:

sudo resolvconf -u
    
por user267617 10.04.2014 / 23:32
3

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

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

Observe que isso deve estar em uma linha dividida com; (o separador de linha de comando do linux). Você não deve perder sua conexão atual. A exceção é fazer um erro de digitação no arquivo de interfaces. Se isso acontecer, ifup falhará e você terá que ter acesso físico ou outra ethxx conexão.

    
por sparky 24.01.2015 / 00:14
2

service resolvconf restart irá gerar /etc/resolv.conf sem muita confusão.

    
por Kamran 10.02.2016 / 15:03
0

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

Edite o /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 na interface sem reiniciar ou recarregar.

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

A propósito, a última resposta do BDenis nesta lista realmente funciona no lugar do último comando analisando o arquivo /etc/network/interfaces e inserindo essas linhas no comando sudo resolvconf -a eth0 Na verdade, é metade da resposta e um ótimo exemplo de análise de sed. Se você quiser ver como isso é feito, basta executar a primeira parte do comando e observá-lo analisar o arquivo /etc/network/interfaces e cuspir todas as informações necessárias para executar o comando sudo resolvconf -a eth0 :

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

Observe que isso produziria a mesma saída do comando:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Contanto que o arquivo /etc/network/interfaces esteja configurado com essas 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
    
por user3199107 22.06.2015 / 23:37
0

Resposta simples:

Basta instalar o resolvconf. apt install resolvconf

Depois disso, ifup eth0 atualiza o DNS em etc/resolv.conf , de acordo com a linha dns-nameservers em /etc/network/interfaces .

    
por trogne 03.05.2017 / 01:14
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.

    
por jbgeek 08.09.2017 / 01:21
0

Em 18.04, o seguinte funciona de forma confiável (executado como root):

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

Importante: Verifique se você tem o pacote resolvconf instalado.
Não parece ser por padrão, e sem isso algumas (!) Mudanças de /etc/network/interfaces são silenciosamente ignoradas (por exemplo, dns-* ).

    
por Raphael 09.05.2018 / 13:49
-2

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
    
por BDenis 09.10.2014 / 15:07