zmiana nazwy interfejsu sieciowego w Ubuntu 16.04 z systemd kończy się niepowodzeniem

14

Używam bezgłowego serwera Ubuntu 16.04 LTS z dwiema fizycznymi kartami sieciowymi o nazwach enp5s0f0 i enp5s0f1.

Chciałbym zmienić nazwy tych interfejsów i poszedłem za tym przykładem . Dlatego utworzyłem plik /lib/systemd/network/70-myinterface.link(wydaje się, że oryginalne źródło nie działa) w ten sposób (ustawiłem prawidłowy adres mac):

[Match]
MACAddress=12:34:56:78:9a:bc

[Link]
Name=dmz0

i ponownie uruchomiłem serwer. Niestety nazwa interfejsu nie została zmieniona, chociaż udevadmpokazuje, że używany jest mój plik konfiguracyjny:

$ udevadm info /sys/class/net/enp5s0f1
P: /devices/pci0000:00/0000:00:02.0/0000:01:00.0/0000:02:02.0/0000:05:00.1/net/enp5s0f1
E: DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/0000:02:02.0/0000:05:00.1/net/enp5s0f1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=80003ES2LAN Gigabit Ethernet Controller (Copper)
E: ID_MODEL_ID=0x1096
E: ID_NET_DRIVER=e1000e
E: ID_NET_LINK_FILE=/lib/systemd/network/70-myinterface.link  <-- my file
E: ID_NET_NAME_MAC=enx123456789abc
E: ID_NET_NAME_PATH=enp5s0f1
E: ID_OUI_FROM_DATABASE=Intel Corporation
E: ID_PATH=pci-0000:05:00.1
E: ID_PATH_TAG=pci-0000_05_00_1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=3
E: INTERFACE=enp5s0f1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp5s0f1
E: TAGS=:systemd:
E: USEC_INITIALIZED=1900192

Czy masz pojęcie, dlaczego zmiana nazwy nie zadziałała?

tłumić
źródło
1
Myślałem, że najlepszym rozwiązaniem do stworzenia tego pliku będzie / etc / systemd / network.
NGRhodes
@NGRhodes Zakładałem literówkę na podstawie cytowanego przykładu, ale kto wie?
Elder Geek
Ponadto sprawdź, czy menedżer sieci nie działa, superuser.com/a/948996/127393 sugeruje, że
menedżer sieci
Po tym, jak umieściłem nagrodę, zauważyłem, że w 16.04 istnieje nowy plik reguł udev, który zawsze wymusza nazwanie adresów MAC adapterów USB przed skonsultowaniem się z networkd (/lib/udev/rules.d/73-usb-net-by -mac.rules). To wcale nie wydaje się właściwe ... Musiałem całkowicie wyłączyć tę regułę, co sprawiło, że plik .link znów zaczął działać. Nie jestem jednak pewien, czy jest to najbardziej odpowiednia opcja.
Antti Haapala
Używanie MACAddress= [Match]nie działa również dla mnie w linkplikach, więc skończyło się na użyciu Path=. Ty też powinieneś spróbować. Możesz także sprawdzić, który linkplik pasuje do twojego urządzenia za pomocą udevadm test-builtin net_setup_link /sys/class/net/enp5s0f1polecenia
webKnjaZ

Odpowiedzi:

8

To może, ale nie musi pomóc. Sprawdziłbym /etc/udev/rules.d i sprawdziłbym, czy masz 70-persistent-net.rules. Powinieneś być w stanie zmienić ich nazwy przy użyciu tego pliku

Mój wygląda następująco:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="e0:cb:ee:d7:ff:9a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Jeśli masz wpisy dotyczące kart w tym pliku, możesz zmienić nazwę na dowolną, zmieniając „NAME = TheNameYouWant”

John Orion
źródło
Tak jest. Właśnie miałem opublikować odpowiedź, w której wspomniałem, że ciekawie, jest kilka osób korzystających z Ubuntu, które powiedziały, że metoda @muffel do zmiany nazwy sieci nie działa. To właśnie zamierzałem zasugerować ... +1
anonimowy2
Oto nagroda.
EKons,
5

Opcją, która nie wymaga reguł udev (alternatywa dla plików .link systemd-networkd), która działa z Ubuntu 16.04, a także z wieloma innymi wersjami Linuksa, jest

Przykład:

ifconfig peth0 down  
ip link set peth0 name eth0  
ifconfig eth0 up 

W powyższym przykładzie peth0 to oryginalna nazwa interfejsu, a eth0 to pożądana nazwa. Podaj nazwę, którą aktualnie masz, gdzie jest peth0, i nazwę, którą chcesz, gdzie jest eth0. Ponowne uruchomienie nie jest wymagane ani sugerowane. Powtórz proces dla drugiej karty interfejsu

Testowany na Ubuntu 16.04 z jądrem 4.4.0-36-generic # 55-Ubuntu

Edycja: Jeśli szukasz trwałego rozwiązania, które przetrwa restart, zobacz Zmiana nazwy interfejsów sieciowych Ubuntu 16.04

Źródła: https://www.freedesktop.org/software/systemd/man/systemd.link.html

http://kernelpanik.net/rename-a-linux-network-interface-without-udev/

Testowanie.

Uwaga: ponieważ metoda @ antti-haapala działała wcześniej i nagle przestała działać, możesz być zainteresowany tym, że „W specjalnym przypadku pusty plik (rozmiar pliku 0) lub dowiązanie symboliczne o tej samej nazwie wskazujące na / dev / null wyłącza plik konfiguracyjny całkowicie (jest „zamaskowany”) ”. <-Źródło

Starszy Geek
źródło
Byłem bardzo przydatny w twojej odpowiedzi, dziękuję + 1 @ElderGeek
1
@Alberto Cieszę się, że pomogło!
Starszy Geek
niestety nie jest trwały, ale nadal + 1
delfiler
@delfiler Dziękujemy za komentarz. Jeśli dobrze cię rozumiem, szukasz rozwiązania, które przetrwa restart. Czy to jasne?
Starszy Geek
@delfiler patrz askubuntu.com/questions/767786/...
Elder Geek
3
  • Wszystkie trzy niestandardowe metody nazewnictwa, wyjaśnione systemd: Przewidywalne nazwy interfejsów sieciowych , są powiązane z regułami udev.

    Systemd .link i udev mają priorytet folderów. /etcprzesłania /runprzesłonięcia /lib.

    Sprawdź bieżącą konfigurację.

    # links
    ls -l /*/systemd/network/
    
    # rule that read links
    ls -l /*/udev/rules.d/80-net-setup-link.rules
    
    # rule that check for /etc/.../80-net-setup-link.rules & net.ifnames
    ls -l /*/udev/rules.d/73-usb-net-by-mac.rules
    

    Po każdej zmianie tych reguł udev (dodawanie / usuwanie plików zastępujących), aby były skuteczne, dysk RAM pamięci rozruchowej powinien zostać zaktualizowany:

    sudo update-initramfs -u
    

    Domyślnie są to jedyne pliki, jakie możesz znaleźć

    ~$ ls -l /*/systemd/network/
    /etc/systemd/network/:
    total 0
    
    /lib/systemd/network/:
    total 12
    -rw-r--r-- 1 root root 404 Jul 12 17:28 80-container-host0.network ##(virtual-interface)
    -rw-r--r-- 1 root root 482 Jul 12 17:28 80-container-ve.network ##(virtual-interface)
    -rw-r--r-- 1 root root  80 Jul 12 17:28 99-default.link
    
    
    ~$ ls -l /*/udev/rules.d/80-net-setup-link.rules
    -rw-r--r-- 1 root root 292 Jul 12 17:28 /lib/udev/rules.d/80-net-setup-link.rules
    
    ~$ ls -l /*/udev/rules.d/73-usb-net-by-mac.rules
    -rw-r--r-- 1 root root 551 Jul 12 16:37 /lib/udev/rules.d/73-usb-net-by-mac.rules
    

    Przetestowałem je wszystkie w instalacji VBox fresh 16.04, jak udokumentowano w poniższym linku, wszystkie metody działają zgodnie z oczekiwaniami:

    Skomplikowane nazwy interfejsów Ubuntu 16.04

  • /etc/udev/rules.d/70-persistent-net-rulespochodzi ze starszych wydań zastąpionych przez systemd .link (ale nie są tworzone automatycznie), dodałem go tutaj, aby sprawdzić jego istnienie pod kątem konkretnych problemów, ale nie w przypadku AnttiHaapala .

user.dz
źródło
1

Musisz zaktualizować initrdcoś podobnego update-initramfs -k all -c, ponieważ udev stosuje te konfiguracje już podczas działania initrd.

Ubuntu 16.04 nie ma już pliku 70-persistent-net-rules.

Jani Jaakkola
źródło
1
To dziwne, że działa system 16.04. Ach, ale to ulepszony system. Masz rację, że nie ma go w nowej instalacji.
Elder Geek
0

Nie mam wystarczającej reputacji, aby komentować, ale aby dodać do zaznaczonej odpowiedzi, czyste instalacje Ubuntu 16.04 nie będą zawierały pliku /etc/udev/rules.d/70-persistent-net.rules. Jeśli jednak utworzysz go ręcznie, możesz dodać wiersz, jak pokazano w odpowiedzi tutaj, i powinien on działać tak samo jak w starszych wersjach, z jedną zauważalną różnicą - parametr KERNEL należy określić jako nazwę przypisaną do parametru interfejs domyślnie. Na przykład, jeśli system nazwał interfejs jako „ens160” i chcesz go zmienić na „eth0”, linia może wyglądać następująco:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="ens160", NAME="eth0"

Mówi to regule, że pasuje tylko na interfejsie pasującym do określonego MAC (w parametrze ATTR {adres}) i z nazwą jądra pasującą do parametru KERNEL. Alternatywnie możesz prawdopodobnie całkowicie pominąć parametr KERNEL i to też powinno działać.

EDYCJA: Jak już wspomniano, jeśli chcesz użyć metody pliku .link, musisz zaktualizować initramfs, aby zadziałało. Pamiętaj również, że niestandardowy plik .link powinien zostać utworzony w / etc / systemd / network, a nie w / lib / systemd / network (albo będzie działał, ale najlepszą praktyką jest użycie / etc / systemd / network, ponieważ po to jest - zezwalaj na niestandardowe pliki .link, które zastępują ustawienia domyślne w / lib / systemd / network).

dwillis77
źródło