CentOS 7 - Rinomina l'interfaccia di rete senza riavviare


24

Sto rinominando le interfacce di rete modificando i file in /etc/sysconfig/network-scripts.

  • eth0 -> nic0
  • eth1 -> nic1

Il contenuto degli script di rete è simile al seguente, dopo la modifica:

# cat /etc/sysconfig/network-scripts/ifcfg-nic0
DEVICE=nic0
BOOTPROTO=static
ONBOOT=yes
HWADDR=xx:xx:xx:xx:xx:xx
USERCTL=no
IPV6INIT=no
MASTER=bond0
SLAVE=yes

Un riavvio attiva la nuova configurazione. Ma come posso attivare questa configurazione senza riavviare?

A systemctl restart networknon fa il trucco.

Posso chiudere un'interfaccia con il suo vecchio nome ( ifdown eth0) ma ifuprisulta nel messaggio seguente, indipendentemente dal fatto che sia stato fornito il vecchio o il nuovo nome:

ERRORE: [/ etc / sysconfig / network-scripts / ifup-eth] Il dispositivo nic0 non sembra essere presente, ritardando l'inizializzazione.

/etc/init.d/network status mostra questo output:

Configured devices:
lo bond0 nic0 nic1
Currently active devices:
lo eth0 eth1 bond0

Entrambi ifconfige ip amostrano i vecchi nomi di interfaccia.


1
Potresti provare a rimuovere e ricaricare i driver di dispositivo di rete, se sono compilati come moduli del kernel.
Tom Hunt,

Risposte:


29

Puoi rinominare il dispositivo usando il comando ip:

/sbin/ip link set eth1 down
/sbin/ip link set eth1 name eth123
/sbin/ip link set eth123 up

Modifica :

Lascio il seguito per ragioni di completezza e posteri (e solo a scopo informativo,), ma mi hanno confermato il commento di rifiuti alimentari e la risposta di Marco Macuzzo che semplicemente cambiando il nome e dispositivo dell'interfaccia / etc / sysconfig / network-scripts / ifcfg- eth0 (e rinominando il file) farà sì che il dispositivo venga nominato correttamente fintanto che il campo hwaddr = è incluso nel file di configurazione. Consiglio invece di utilizzare questo metodo dopo l'aggiornamento a cui si fa riferimento.

Puoi anche assicurarti di configurare una regola udev, in modo che funzioni anche al prossimo riavvio. Il percorso per udev è stato spostato in CentOS 7 su /usr/lib/udev/rules.d/60-net.rules ma è ancora possibile gestirlo allo stesso modo. Se hai aggiunto "net.ifnames = 0 biosdevname = 0" alla stringa di avvio del kernel per tornare al vecchio schema di denominazione per le tue schede di rete, puoi rimuovere

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

E sostituirlo con

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="00:50:56:8e:3f:a7", NAME="eth123"

Hai bisogno di una voce per nic. Assicurarsi di utilizzare l'indirizzo MAC corretto e aggiornare il campo NAME. Se non hai usato "net.ifnames = 0 biosdevname = 0", fai attenzione perché potrebbero esserci conseguenze indesiderate.


2
Solo una nota su questo. Se si utilizza CentOS 7.3, questo non funziona. Ciò è dovuto a questo problema ( access.redhat.com/solutions/2592561 ). Dovrai sovrascrivere il file in /etc/udev/rules.d/90-eno-fix.rulesperché sovrascrive tutte le soluzioni precedentemente funzionanti per rinominare i dispositivi di rete.
swill

Osservando l'avviso a cui si fa riferimento, si nota che "Questo problema può essere evitato aggiornando i repository di installazione per includere il pacchetto systemd-219-30.el7_3.6 o successivo. Con questa nuova versione di systemd, le interfacce interessate vengono identificate al momento dell'installazione del pacchetto e una regola udev viene generata automaticamente in modo da evitare del tutto il problema di ridenominazione. "
James Shewey,

Si tratta di un problema di ridenominazione diverso a cui si riferiscono. Stanno parlando di abbreviare il nome perché è troppo lungo (credo). La regola udev menzionata codifica il nome dell'interfaccia su un eno########valore che sovrascrive tutti questi tentativi di rinominarlo in qualcosa del genere eth0. Ha senso? Dovrò verificare sulla mia macchina quale versione sto usando, ma ieri ho aggiornato all'ultimo CentOS 7.3, quindi penso che avrò menzionato la versione.
swill

Questo metodo mi è stato utile per risolvere un problema diverso ma correlato: un contenitore si è bloccato durante l'avvio a causa di un errore di configurazione non correlato e ha lasciato l'interfaccia rinominata dal nome del sistema ensXfY nel nome contenitore di eth1. Quindi non è stato possibile riprovare ad avviare il contenitore perché non è stato possibile trovare l'interfaccia fino a quando non è stata rinominata
Michael Firth,

9

In realtà, la migliore risposta credo sia la combinazione delle due risposte già pubblicate. Per modificare il nome del dispositivo senza riavviare i servizi di rete, utilizzare i ip linkcomandi suggeriti da James Shewey ( ip link set <old_device_name> name <new_device_name>).

Per rendere le modifiche sopravvissute al riavvio in Red Hat Linux, modificare il file pertinente in /etc/sysconfig/network-scripts/. Rinomina il file ifcfg_<old_device_name>in ifcfg_<new_device_name>e modifica la DEVICEvariabile interna in <new_device_name>. Inoltre, assicurati che la HWADDRvariabile sia impostata e sia corretta. Non è necessario toccare le regole di udev , poiché in 60-net.rulesrealtà è lì per leggere i file di configurazione di ifcfg /etc/sysconfig/network-scripts.


3

Per ripristinare la vecchia convenzione di denominazione, è necessario modificare il /etc/default/grubfile e aggiungere quanto segue

net.ifnames=0 biosdevname=0 

alla fine della GRUB_CMDLINE_LINUXvariabile


O semplicemente rimuovendo il biosdevnamepacchetto se è installato
GAD3R

3
ip link set ens33 down
ip link set ens33 name eth0
ip link set eth0 up

mv /etc/sysconfig/network-scripts/ifcfg-{ens33,eth0}

sed -ire "s/NAME=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

sed -ire "s/DEVICE=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

MAC=$(cat /sys/class/net/eth0/address)

echo -n 'HWADDR="'$MAC\" >> /etc/sysconfig/network-scripts/ifcfg-eth0

1
bel trucco per rinominare :) grazie per aver condiviso
166_MMX l'

2

La risposta data da @James Shewey sembra essere il modo giusto per farlo.

Se vuoi semplicemente lavorare con i file di configurazione /etc/sysconfig/network-scriptse quindi attivare un ricaricamento, anche lo scaricamento e il caricamento del modulo del kernel come menzionato da @ Tom Hunt nei commenti funziona:

service network stop
modprobe -r igb
modprobe igb
service network start

Se accedi alla macchina da remoto, assicurati di eseguire tutti i comandi in un nohup o ti bloccherai:

nohup sh -c "service network stop && modprobe -r igb && modprobe igb ; service network start"

Il driver per ricaricare ovviamente dipende dalla tua interfaccia.


0

Ho provato quanto sopra con Vagrant / VirtualBox e ansible, ma in qualche modo questo non ha funzionato affatto nel mio ambiente di sviluppo.

I vecchi nomi di interfaccia sono stati mantenuti in qualsiasi modo fino al riavvio completo.

Ho aggiunto le seguenti regole in /etc/udev/rules.d/60-persistent-net.rules(basato su: https://access.redhat.com/solutions/112643 )

Il mio obiettivo era quello di dare all'interfaccia un nome specificato basato sull'indirizzo PCI.

Esempio:

ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:09.0", NAME:="int0"
ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:10.0", NAME:="ext0"

Dopo aver aggiunto quelle regole ho eseguito i seguenti comandi:

ip link set eth0 down
udevadm control --reload-rules
udevadm trigger
ip link set int0 up

Il messaggio di errore era Cannot find device "int0"sul ip link set * upcomando. E in /var/log/messagesho notato i seguenti messaggi

Aug 16 17:08:41 localhost ansible-command: Invoked with creates=None executable=None _uses_shell=True strip_empty_ends=True _raw_params=ip link set eth0 down && udevadm control --reload-rules && udevadm trigger && ip link set int0 up#012 removes=None argv=None warn=True chdir=None stdin_add_newline=True stdin=None
Aug 16 17:08:41 localhost NetworkManager[6989]: <info>  [1565975321.5971] device (eth6): state change: disconnected -> unavailable (reason 'carrier-changed', sys-iface-state: 'managed')
Aug 16 17:08:41 localhost systemd-udevd: Network interface NamePolicy= disabled on kernel command line, ignoring.

Ma quanto segue ha funzionato accedendo alla VM tramite VirtualBox ed eseguendo i seguenti comandi per rimuovere e aggiungere nuovamente il modulo del kernel.

rmmod e1000 
modprobe e1000

Ho trovato questo nel seguente thread: https://www.centos.org/forums/viewtopic.php?t=54695

La cosa strana che ho notato è che lsmodmi dà (nota il Used by)

[vagrant@node-01 ~]$ lsmod
Module                  Size  Used by
e1000                 137586  0 

Fateci sapere cosa non ha funzionato con la risposta accettata, con messaggi di errore esatti. In questo modo forse la risposta può essere migliorata.
Ned64,

@ Ned64 Ho aggiunto il messaggio di errore e un po 'più di informazioni
Sander Visser il

Quello che voglio dire è: cosa succede quando si digita, come root ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up:? Nessun udev...comando!
Ned64,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.