Raspberry Pi 3 - eth0 błędnie nazwany „enx…”

28

Moje nowe urządzenie RPi 3 (tak) niedawno uruchomiło się z dezaktywowanym eterem.

Więc obejrzałem /etc/networks/interfacesi zobaczyłem linię:

auto eth0
iface eth0 inet dhcp

Dzwonienie ifup eth0niestety dało następujący komunikat:

eth0 No such device
No hardware found

Więc sprawdziłem ifconfig -ai zobaczyłem dziwne urządzenie:

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

Próba zmiany /etc/networks/interfacesnazwy spowodowała działającą sieć. Jak mogę zmienić nazwę tego urządzenia na eth0?

PS: Nie mam żadnych 70-persistent-net.rulesplików FYI. System operacyjny to Ubuntu MATE 15.10

Dzięki.

Tom Siwik
źródło
Sprawdź plik> / etc / iftab Moje stany: enxb827 .... mac xx: xx: xx: xx: xx: xx arp 1 wlan0 mac xx: xx: xx: xx: xx: xx arp 1

Odpowiedzi:

16

Miałem ten problem podczas uruchamiania Debiana armhf na Raspberry Pi 2, możesz zmienić nazwę interfejsu, tworząc plik /etc/udev/rules.d/70-persistent-net.rules i umieszczając to w

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

zamień b8: ac: 6f: 65: 31: e5 na swój adres MAC eth0, uruchom ponownie i stanie się eth0, po restarcie możesz nie mieć dostępu do Internetu, ponieważ w / etc / network / interfaces definiuje zły interfejs, po prostu zmień enx * do eth0

Edycja: To nie jest problem, ale nowy schemat nazewnictwa interfejsów „Przewidywalne nazwy interfejsów”, należy go dostosować i używać zamiast próbować przywracać go do starych.

SandPox
źródło
3
dzięki @UnSined i spojrzał dalej i okazało się, że muszę dodać: ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules. Zasadniczo wyłącza to nazewnictwo. Działa teraz .. dzięki!
Tom Siwik
Użytkownik jest teraz @Ficertyn ... jasność dla szczęśliwych czytelników dokumentów red hat
Tom Siwik
1
Musiałem usunąć KERNEL=="eth*"wpis, aby to zadziałało.
Roger Dueck
23

To rozwiązanie działa tylko wtedy, gdy widzisz dziwne urządzenie interfejsu sieciowego, takie jak env{hwdaddress}podczas uruchamiania $ ifconfig -azamiast eth0. Próbowałem wszystkich popularnych odpowiedzi na temat dodawania reguł, ale tylko ta poprawka działała.

Używam Raspberry Pi 3 z preinstalowanym serwerem armhf dla Ubuntu 16.04. Krótka historia, uruchomione $ apt-get updatedodano przewidywalne nazwy interfejsów sieciowych

Edytuj następujący plik:

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

Powinieneś zobaczyć:

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}"

Zmień NAZWĘ na końcu w następujący sposób:

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"

Zapisz zmiany

Restart. Wszystko powinno działać teraz, zakładając, że wszystko wskazuje na eth0.

Edytuj (26.10.2016) Aby zapobiec zastąpieniu tej poprawki przez przyszłe aktualizacje, wykonaj następujące czynności:

cp /lib/udev/rules.d/73-usb-net-by-mac.rules /etc/udev/rules.d/
Luis Godinez
źródło
1
Spędziłem zdecydowanie, o wiele za długo, próbując dostać się do wersji stabilnej eth0dla mojego Pi z Ubuntu Server 16.04. Dziękuję Ci. Jedna niewielka modyfikacja Twojej odpowiedzi, którą sugeruję spróbować, zaimplementować, a następnie dodać do swojej odpowiedzi: Skopiuj 73-usb-net-by-mac.rulesplik do /etc/udev/rules.d/katalogu i zmodyfikuj ten; jeśli zmienisz ten /lib/udev/rules.d, może on zostać zastąpiony w przyszłej aktualizacji systemu operacyjnego.
Kevin Teljeur
Dzięki za heads-upy. Spędziłem również solidne 2 dni na rozwiązywaniu problemu. Chciałbym, żeby pi wszystko było gotowe do pracy z Python3 i OpenCV tylko po to, aby Ethernet przestał działać przy ponownym uruchomieniu z powodu aktualizacji. Cieszę się, że moja odpowiedź była przydatna.
Luis Godinez,
1
Zajęło mi trochę czasu, aby dowiedzieć się, dlaczego tak się dzieje, a następnie musiałem dowiedzieć się, co robić i dlaczego (błąd Ubuntu - wydaje się, że poprawka jako zatwierdzona nie działa, co jest edycją tego samego pliku). Oto trwająca bitwa: bugs.launchpad.net/ubuntu/+source/systemd/+bug/1593379 - Jednak twoja poprawka nie działa na moim Raspberry Pi 2. Naprawdę myślę, aby po prostu dostać pudełko x86 w tym momencie.
Kevin Teljeur,
13

raspi-config jest najłatwiejszą metodą.

Jeśli korzystasz z Raspbian, to jest on instalowany domyślnie. Ale jeśli korzystasz z systemu Ubuntu, Mint lub Mate, możesz zainstalować go za pomocą poniższego polecenia:

sudo apt-get install raspi-config

Następnie możesz to skonfigurować za pomocą raspi-config.

sudo raspi-config
  1. Wybierz „2. Opcje sieciowe”
  2. Wybierz „Nazwy interfejsów sieciowych N3”
  3. Wybierz „Nie”. Teraz wyłączono przewidywalne nazwy interfejsów sieciowych.
  4. Kliknij „OK” i „Zakończ”. Następnie uruchomi się ponownie Raspberry Pi.

Gotowy.

Almas Dusal
źródło
1
Czy Ubuntu Mate (którego używa OP) ma konfigurację raspi?
Steve Robillard
Twoja odpowiedź nie ma zastosowania.
Steve Robillard
1
Ale jeśli przejrzałeś ten sam problem z Raspbian, to pytanie znalazło się pierwsze. Zrobiłem to i poświęciłem czas na badania i znalazłem rozwiązanie. Myślę, że to komuś pomaga. OK, edytuję teraz odpowiedź.
Almas Dusal
1
Myli mnie widok osób „badających”, podczas gdy odpowiedź jest wyraźnie zapisana w zatwierdzonych odpowiedziach. Ubuntu, debian, raspbian są takie same. Instalacja narzędzia na Ubuntu Mate również nie stanowi problemu (nawet domyślnie instalowanego) raspberrypi.stackexchange.com/a/67084/42528 . Jest to jednak odpowiedź bez wyjaśnienia, co dzieje się za kurtyną. Chociaż rozwiązuje problem, zniechęca ludzi do faktycznego zrozumienia, co się dzieje. Daję +1 tym wszystkim leniwcom.
Tom Siwik,
1
Fajne! Ta odpowiedź była zdecydowanie najłatwiejsza i rozwiązała mój problem z ustanowieniem działającego statycznego adresu IP
Vinyll
5

To NIE jest „błąd”, to „funkcja” „ spójna nazwa urządzenia sieciowego ”. (Nie widzę w tym nic spójnego.)

Prawdopodobnie istnieje wiele sposobów „naprawienia” tego, ale mogą one nie działać, jeśli sprzęt zostanie zmieniony.

Aby przywrócić poprzednie zachowanie, dodaj „net.ifnames = 0 biosdevname = 0” na końcu cmdline.txt.

Milliways
źródło
Chociaż ta funkcja jest, no cóż, sposób, w jaki się zachowuje, jest błędem - szczególnie w tym, jak udev obsługuje urządzenia Ethernet USB. Ignoruje net.ifnames=0. Nie sądzę, aby ktokolwiek musiał śledzić dyskusje o błędach, aby popularny system operacyjny działał ze wspólną konfiguracją sprzętową, ale takie jest życie. bugs.launchpad.net/ubuntu/+source/systemd/+bug/1593379
Kevin Teljeur
@KevinTeljeur i moim komentarzem był sarkazm - jest to powszechny problem w systemach komputerowych.
Milliways,
Ha ha, przepraszam - po tylu zmarnowanych godzinach, a potem stwierdzeniu, że był to cicho udokumentowany błąd, nie mogę wychwycić żadnego spójnego sarkazmu nazewniczego urządzenia sieciowego. Zrozumiałem twoje cudzysłowy, ale dodanie tych magicznych zaklęć config.txtnaprawdę nie działa na Pi jako udokumentowany błąd (być może teraz wraz z wydaniem najnowszej wersji udev, którą w końcu robi). Jest to zaskakująco nieznany błąd, który wpływa na wszystkie systemy z Ethernetem na USB.
Kevin Teljeur
4

Nie spotkałem go konkretnie z adresem mac jako częścią nazwy, jednak to, co napotykasz, nazywa się spójnym nazywaniem urządzenia sieciowego.

To była zmiana dokonana, ponieważ jest to możliwe, a może nawet prawdopodobne w niektórych systemach, które mają wiele kart sieciowych, że karty wypadną z porządku i przy użyciu schematu nazewnictwa eth0, eth1 itp. Ostatecznie zastosujesz reguły routingu i tak dalej. do niewłaściwego interfejsu.

Wiele dystrybucji Linuksa zostało przeniesionych do pewnego rodzaju spójnego nazewnictwa urządzeń sieciowych, zwykle będzie to wyglądać podobnie enp0s1, identyfikując magistralę PCI i punkt przyłączenia do magistrali (odpowiednio 0 i 1).

Możesz uzyskać więcej informacji na https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Consistent_Network_Device_Naming.html , a także jak zmienić system na stary sposób robienia rzeczy, jeśli nadal chcesz to zrobić.

Ficertyn
źródło
1
mimo że jest to komentarz informacyjny, nie pomógł rozwiązać problemu i nie odpowiedział na pytanie (przeczytaj manualną odpowiedź). Pomogło to jednak znaleźć małą poprawkę do powyższego rozwiązania. dlatego zarobiłem na głosowaniu i dziękuję :)
Tom Siwik
1

Utworzenie tego pliku przez odroid naprawiło mój problem

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ö
źródło
1

Miałem ten sam problem na Raspberry Pi 2 z Ubuntu 16.04 i działało się po kliknięciu linku z #goutam i dodaniu /etc/udev/rules.d/70-persistent-net.rules z następującymi:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth0", NAME="eth0"
Rodrigo
źródło
1

Znalazłem tę sugestię tutaj :

Zmień jedną linię w 70-persistent-net.rules na

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

która usuwa atrybut KERNEL i zmienia NAZWĘ z = na: =

Wydaje się, że wymusza to, by każdy adres MAC został znaleziony na eth0. Działa na Raspberry Pi i systemach rozruchowych uboot.

użytkownik855443
źródło
0

Dla mnie, uruchamiając Debian Unstable na Raspberry Pi 2, dowiązanie symboliczne wspomniane w komentarzu do pierwszej odpowiedzi również było właściwym pomysłem, ale jego nazwa musiała być inna: ln -vis /dev/null /etc/udev/rules.d/80-net-setup-link.rules

Axel Beckert
źródło
Nie, wspomniałeś o tej nazwie pliku, ale innej w swoim komentarzu, dlatego odniosłem się do tego komentarza i wspomniałem, że musi to być dla mnie inna nazwa pliku.
Axel Beckert,
1
Widzę. Zwróć uwagę na różnicę między Raspberry Pi 3 i Raspberry Pi 2. Choć technicznie są prawie takie same, ta różnica w nazewnictwie może być jedną z tych rzeczy, które mogą wprowadzać ludzi w błąd. Dziękuję za wyjaśnienia.
Tom Siwik,
Zakładam, że ta różnica w nazwach plików pochodzi z Debian 8 Jessie vs Debian Unstable z nowszą wersją systemd / udev. Rzeczywista nazwa interfejsu bez tego dowiązania symbolicznego może rzeczywiście różnić się od adresu MAC. Ale przynajmniej na interfejs Ethernet Myślę Pamiętam widząc te enxnazwy interfejsu w obu Raspi 2 i 3. I chociaż obecnie nie pamiętam jak interfejs WLAN został nazwany na Raspi 3.
Axel Beckert
enx <MAC>, korzystał z Ubuntu Mate, naprawiono problem jak pokazano powyżej. Przełączono na Debian i nie trzeba było zmieniać nazwy. To dziwne ... masz rację.
Tom Siwik,
0

po prostu dezaktywuj reguły udev odpowiedzialne za proces zmiany nazwy interfejsu, tj

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

lub

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

EDYCJA: thx @ sparkie za zgłoszenie błędu. Zawsze mieszam zamówienie. :)

DarwinsBuddy
źródło
pierwsze wymienione polecenie nie może działać. Co najmniej src i dst są pomieszane.
sparkie
0

Zdaję sobie sprawę, że to pytanie jest stare, ale trafiłem w ten problem i żadne z proponowanych do tej pory rozwiązań na tej stronie nie rozwiązało mojego problemu. Wydaje mi się, że sztuczka z folderem rules.d nic nie robi.

Moim rozwiązaniem było po prostu napisanie skryptu, który znajduje się w folderze init.d, aby przypisać DHCP do przewodowego portu Ethernet bez względu na nazwę. Jest to ważne, ponieważ mam kilka jednostek Raspberry Pi i wszystkie mają ten sam problem. (bardzo frustrujące)

Mój problem jest złożony, ponieważ mam folder pamięci sieciowej, który musi zostać podłączony podczas procesu rozruchu. Ponieważ interfejs się nie pojawił, to montowanie nie powiodło się, a dla mnie wszystko poszło źle.

Oto moje rozwiązanie. Mam nadzieję, że pomoże to każdemu, kto nie może dołączyć, korzystając z powyższych odpowiedzi.

Utwórz plik /etc/init.d/raspi-init-network za pomocą swojego ulubionego edytora tekstu. Lubię używać vi.

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

To jest kod, który należy do pliku

#!/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

Upewnij się, że skrypt jest wykonywalny

sudo chmod 755 raspi-init-network

Aktywuj kod, aby był wykonywany podczas procesu uruchamiania, wykonując komendę update-rc.d.

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

Po tym nie miałem żadnego problemu i mogłem skopiować kod do wszystkich moich jednostek Pi z tymi samymi stałymi wynikami.

UWAGA: Jeśli nie montujesz dysków, możesz pominąć linię „mount -a”.

TWEAKS: Jeśli korzystasz z Wi-Fi, możesz zmienić linię rozpoczynającą się od „interface =” i edytować pierwszy segment „grep”. Ten pierwszy grep chwyta całą linię interfejsu, którego chcesz użyć. Drugi grep zajmuje tę linię i zwraca tylko nazwę interfejsu.

Glenn J. Schworak
źródło