Raspberry Pi 3 - eth0 erroneamente chamado 'enx…'

28

Meu novo dispositivo RPi 3 (yay) foi inicializado recentemente com uma Ethernet desativada.

Então eu assisti /etc/networks/interfacese vi a linha:

auto eth0
iface eth0 inet dhcp

ifup eth0Infelizmente, a chamada deu a seguinte mensagem:

eth0 No such device
No hardware found

Então eu verifiquei o meu ifconfig -ae vi um dispositivo estranho:

enx*MACADDRESS* Link encap:Ethernet HWaddr **:**:**:**:**:**

Tentar mudar /etc/networks/interfacespara o nome resultou em uma rede funcionando. Como posso mudar o nome do dispositivo novamente eth0?

PS: não tenho nenhum 70-persistent-net.rulesarquivo fyi. O SO é o Ubuntu MATE 15.10

Obrigado.

Tom Siwik
fonte
Verifique o arquivo> / etc / iftab Mine states: enxb827 .... mac xx: xx: xx: xx: xx: xx arp 1 wlan0 mac xx: xx: xx: xx: xx: xx arp 1

Respostas:

16

Eu tive esse problema ao executar o Debian armhf no Raspberry Pi 2, você pode alterar o nome da interface criando o arquivo /etc/udev/rules.d/70-persistent-net.rules e colocando isso em

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:ac:6f:65:31:e5", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

substitua b8: ac: 6f: 65: 31: e5 pelo seu endereço MAC eth0, reinicie e ele se tornará eth0; talvez você não tenha acesso à Internet após a reinicialização porque em / etc / network / interfaces está definindo a interface errada, basta alterar enx * para eth0

Edit: Este não é um problema, mas um novo esquema de nomeação de interface "Predictable Interface Names", você deve adaptar e usar isso em vez de tentar revertê-lo para os antigos.

SandPox
fonte
3
graças a @UnSined eu olhei mais e encontrado, que eu tinha de acrescentar: ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules. É basicamente desabilitar o nome da coisa. Funciona agora .. obrigado!
Tom Siwik
Usuário é @Ficertyn agora ... clareza para os leitores felizes dos docs chapéu vermelho
Tom Siwik
11
Eu tive que remover a KERNEL=="eth*"entrada para que isso funcionasse.
Roger Dueck 04/01
23

Esta solução só funciona se você estiver vendo um dispositivo de interface de rede estranho, como env{hwdaddress}quando está sendo executado em $ ifconfig -avez de eth0. Tentei todas as respostas comuns sobre a adição de regras, mas apenas essa correção funcionou.

Estou executando um Raspberry Pi 3 com o Ubuntu 16.04, servidor armhf pré-instalado. Para encurtar a história, nomes de interface de rede previsíveis$ apt-get update adicionados em execução

Edite o seguinte arquivo:

$ vim /lib/udev/rules.d/73-usb-net-by-mac.rules

Você deveria ver:

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
ATTR{address}=="?[014589cd]:*", \
TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"

Mude o NAME no final da seguinte maneira:

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
ATTR{address}=="?[014589cd]:*", \
TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
IMPORT{builtin}="net_id", NAME="eth0"

Salvar alterações

Reinicie. Tudo deve estar funcionando agora, assumindo que tudo está apontando para eth0.

Editar (26/10/2016) Para impedir que futuras atualizações substituam essa correção, faça o seguinte:

cp /lib/udev/rules.d/73-usb-net-by-mac.rules /etc/udev/rules.d/
Luis Godinez
fonte
11
Passei muito, muito tempo tentando chegar a um ponto estável eth0para o meu Pi com o Ubuntu Server 16.04. Obrigado. Uma pequena modificação na sua resposta, que eu sugiro que você tente, implemente e adicione à sua resposta: Copie o 73-usb-net-by-mac.rulesarquivo para o /etc/udev/rules.d/diretório e modifique esse; se você alterar esse /lib/udev/rules.d, poderá ser substituído em uma atualização futura do sistema operacional.
Kevin Teljeur
Obrigado pela atenção. Também passei dois dias sólidos na solução do problema. Eu teria o pi pronto para usar o Python3 e o OpenCV apenas para que a Ethernet parasse de funcionar na reinicialização por causa da atualização. Fico feliz em ver que minha resposta foi útil.
Luis Godinez
11
Demorei um pouco para descobrir por que isso estava acontecendo e, então, precisar descobrir o que fazer e por que (bug do Ubuntu - a correção comprometida não parece funcionar, que é uma edição no mesmo arquivo). Aqui está a batalha em andamento: bugs.launchpad.net/ubuntu/+source/systemd/+bug/1593379 - No entanto, sua correção não parece funcionar no meu Raspberry Pi 2. Estou realmente pensando em obter uma caixa x86 neste ponto.
Kevin Teljeur
13

raspi-config é o método mais fácil.

Se você estiver no Raspbian, ele será instalado por padrão. Mas se você estiver no Ubuntu, Mint ou Mate, poderá instalá-lo com o comando abaixo:

sudo apt-get install raspi-config

Então você pode configurá-lo com raspi-config.

sudo raspi-config
  1. Selecione "2. Opções de rede"
  2. Selecione "N3 Network interface names"
  3. Selecione "Não". Agora está desativado os nomes previsíveis da interface de rede.
  4. Clique em "OK" e "Concluir". Em seguida, ele reiniciará o seu raspberry pi.

Feito.

Almas Dusal
fonte
11
O Ubuntu Mate (que é o que o OP está usando) tem uma configuração de raspi?
Steve Robillard
Portanto, sua resposta não se aplica.
Steve Robillard
11
Mas se você pesquisou o mesmo problema com o Raspbian no Google, essa pergunta foi encontrada primeiro. Fiz isso e tirei um tempo para pesquisar e encontrei a solução. Eu acho que ajuda alguém. OK, edito a resposta agora.
Almas Dusal
11
Me confunde ver as pessoas "pesquisando", enquanto a resposta está claramente escrita nas respostas aprovadas. Ubuntu, debian, raspbian da mesma forma. Instalar a ferramenta no Ubuntu Mate também não é problema (mesmo instalado por padrão) raspberrypi.stackexchange.com/a/67084/42528 . No entanto, esta é uma resposta sem nenhuma explicação sobre o que está acontecendo atrás da cortina. Enquanto resolve o problema, desencoraja as pessoas a realmente entenderem o que está acontecendo. Marcarei +1 para todos os preguiçosos que estão por aí.
Tom Siwik
11
Legal! Esta resposta foi definitivamente a mais fácil e resolveu meu problema ao estabelecer como endereço IP estático em funcionamento
vinyll 21/01
5

Este não é um "bug", é um "recurso" " nomeação consistente do dispositivo de rede ". (Não vejo nada de consistente nisso.)

Provavelmente existem muitas maneiras de "consertar" isso, mas elas podem não funcionar se o hardware for alterado.

Para restaurar o comportamento anterior, adicione "net.ifnames = 0 biosdevname = 0" ao final de cmdline.txt.

Milliways
fonte
Embora o recurso seja, bem, um recurso, a maneira como ele se comporta é um bug - especificamente na maneira como o udev lida com dispositivos Ethernet USB. Ignora net.ifnames=0. Não acredito que alguém precise seguir as discussões de relatórios de erros para fazer com que um sistema operacional popular funcione com uma configuração de hardware comum, mas isso é vida. bugs.launchpad.net/ubuntu/+source/systemd/+bug/1593379
Kevin Teljeur 16/16
@ KevinTeljeur e meu comentário foi sarcasmo - esse é um problema comum em sistemas de computador.
Milliways
Ha ha, desculpe - depois de tantas horas desperdiçadas e, depois de descobrir que era um bug silenciosamente documentado, não consigo captar nenhum dispositivo de rede consistente chamado sarcasmo. Eu peguei suas aspas, mas a adição desses encantamentos mágicos no config.txtgenuinamente não funciona no Pi como um bug documentado (talvez agora com o lançamento da versão mais recente do udev finalmente funcione). É um bug surpreendentemente desconhecido que afeta todos os sistemas com Ethernet no USB.
Kevin Teljeur
4

Não o encontrei especificamente com o endereço mac como parte do nome, no entanto, o que você está enfrentando é chamado de nomeação consistente de dispositivo de rede.

Foi uma alteração feita porque é possível, e talvez até provável, em alguns sistemas que possuem várias placas de rede, que as placas fiquem fora de ordem e usando o esquema de nomeação eth0, eth1 etc. etc., você acabaria aplicando regras de roteamento e outros enfeites para a interface errada.

Muitas distribuições Linux mudaram para algum tipo de nomenclatura consistente de dispositivo de rede, normalmente será semelhante à enp0s1identificação do barramento PCI e do ponto de conexão do barramento (0 e 1, respectivamente).

Você pode obter mais informações em https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Consistent_Network_Device_Naming.html , além de como mudar seu sistema para a maneira antiga de fazer coisas se você ainda quiser fazer isso.

Ficertyn
fonte
11
mesmo que seja um comentário informativo, ele não ajudou a resolver o problema e nem respondeu à pergunta (leia o tipo de resposta manual). No entanto, ajudou a encontrar uma pequena correção para a solução acima. É por isso que upvote ganhos e obrigado :)
Tom SIWIK
1

Com odroid criar este arquivo corrigido meu problema

root@odroid:~# cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth0", NAME="eth0"
Mikael Lepistö
fonte
1

Eu tive o mesmo problema no Raspberry Pi 2 com o Ubuntu 16.04 e o que funcionou foi seguir o link do #goutam e adicionar /etc/udev/rules.d/70-persistent-net.rules com o seguinte:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth0", NAME="eth0"
Rodrigo
fonte
1

Encontrei esta sugestão aqui :

Altere uma linha nas 70-persistent-net.rules para

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="98:90:96:e0:3c:e9", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME:="eth0"

que está descartando o atributo KERNEL e alterando o NAME de = para: =

Parece forçar qualquer endereço MAC encontrado para eth0. Funciona em sistemas de inicialização Raspberry Pi e uboot.

user855443
fonte
0

Para mim, executando o Debian Unstable no Raspberry Pi 2, o link simbólico mencionado no comentário para a primeira resposta também era a idéia certa, mas seu nome tinha que ser diferente: ln -vis /dev/null /etc/udev/rules.d/80-net-setup-link.rules

Axel Beckert
fonte
Não, você mencionou esse nome de arquivo, mas um nome diferente no seu comentário, e é por isso que me referi a esse comentário e mencionei que ele tinha que ser um nome de arquivo diferente para mim.
precisa saber é o seguinte
11
Entendo. Observe a diferença entre raspberry pi 3 e raspberry pi 2. Embora eles sejam tecnicamente quase os mesmos, essa diferença de nomes pode ser uma dessas coisas para enganar as pessoas. Obrigado pelo esclarecimento embora.
Tom Siwik
Suponho que essa diferença nos nomes de arquivos seja proveniente do Debian 8 Jessie vs Debian Unstable com uma versão mais recente do systemd / udev. O nome real da interface sem esse link simbólico pode realmente ser mais diferente do que apenas o endereço MAC. Mas, pelo menos para a interface Ethernet Acho que me lembro de ter visto esses enxnomes de interface em ambos, Raspi 2 e 3. I embora atualmente pode não se lembrar de como a interface WLAN foi nomeado na Raspi 3.
Axel Beckert
enx <MAC>, estava usando o Ubuntu Mate, problema corrigido como mostrado acima. Mudou para o Debian e não precisou mudar o nome. É estranho ... você está certo.
precisa saber é o seguinte
0

simplesmente desative as regras do udev responsáveis ​​pelo processo de renomeação da interface, ou seja,

sudo ln -s /dev/null /etc/udev/rules.d/73-usb-net-by-mac.rules

ou

sudo touch /etc/udev/rules.d/73-usb-net-by-mac.rules

EDIT: thx @ sparkie por apontar um erro. Eu sempre confundo o pedido. :)

DarwinsBuddy
fonte
o primeiro comando mencionado não pode funcionar. Pelo menos src e dst são misturados.
Sparkie 20/09/17
0

Percebo que essa pergunta é antiga, mas resolvi esse problema e nenhuma das soluções propostas até agora nesta página resolveu meu problema. Para mim, o truque da pasta rules.d parece não fazer nada.

Minha solução foi simplesmente escrever um script que vá na pasta init.d para atribuir DHCP à porta Ethernet com fio, independentemente do nome. Isso é importante porque eu tenho várias unidades Raspberry Pi e todas elas vieram com esse mesmo problema. (muito frustrante)

Meu problema foi agravado porque tenho uma pasta de armazenamento em rede que precisa ser montada durante o processo de inicialização. Como a interface não surgiu, essa montagem falhou e as coisas foram de mal a pior para mim.

Aqui está a minha solução. Espero que isso ajude qualquer pessoa que não encontre a associação usando as respostas acima.

Crie o arquivo /etc/init.d/raspi-init-network usando seu editor de texto favorito. Eu gosto de usar vi.

cd /etc/init.d
sudo vi raspi-init-network

Este é o código que pertence ao arquivo

#!/bin/sh
### BEGIN INIT INFO
# Provides:          boot-identify-myself
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: identify-myself
# Description:       identify this computer to the main server upon
### END INIT INFO
#
# when using predictible network names for the interfaces,
# the pi doesn't seem to activate the interface correctly so
# this script will force the issue.
#
# it works by getting the interface name of the wired network
# device and using that to initialize dhcp

start() 
{
    interface=`ifconfig -a | grep "encap:Ethernet" | grep -oh -E "^[^ ]+"`
    dhclient $interface
    mount -a
}

stop() 
{
    : # do nothing
}

uninstall() 
{
    : # do nothing
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  uninstall)
    uninstall
    ;;
  retart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|uninstall}"
esac

Verifique se o script é executável

sudo chmod 755 raspi-init-network

Ative o código para que ele seja executado durante o processo de inicialização executando o comando update-rc.d.

sudo update-rc.d raspi-init-network defaults 90

Depois disso, não tive um único problema e consegui copiar o código para todas as minhas unidades Pi com os mesmos resultados constantes.

NOTA: Se você não estiver montando unidades, poderá deixar de fora a linha "mount -a".

JOGOS: Se você estiver usando seu wifi, você pode alterar a linha que inicia "interface =" e editar o primeiro segmento "grep". Este primeiro grep captura toda a linha da interface que você deseja usar. O segundo grep pega essa linha e retorna apenas o nome da interface.

Glenn J. Schworak
fonte