CentOS 7 - переименование сетевого интерфейса без перезагрузки

24

Я переименовываю сетевые интерфейсы, изменяя файлы в /etc/sysconfig/network-scripts.

  • eth0 -> nic0
  • eth1 -> nic1

Содержимое сетевых скриптов после модификации выглядит следующим образом:

# 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

Перезагрузка активирует новый конфиг. Но как мне активировать эту конфигурацию без перезагрузки?

А systemctl restart networkне делает трюк.

Я могу закрыть один интерфейс по его старому имени ( ifdown eth0), но в ifupрезультате появляется следующее сообщение, независимо от того, было ли предоставлено старое или новое имя:

ОШИБКА: [/ etc / sysconfig / network-scripts / ifup-eth] Устройство nic0 отсутствует, что задерживает инициализацию.

/etc/init.d/network status показывает этот вывод:

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

И то, ifconfigи другое ip aпокажет имена старых интерфейсов.

udondan
источник
1
Вы можете попробовать удалить и перезагрузить драйверы сетевых устройств, если они скомпилированы как модули ядра.
Том Хант

Ответы:

29

Вы можете переименовать устройство с помощью команды ip:

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

Редактировать :

Я уезжаю ниже для полноты и потомков (и для информационных целей) , но я подтвердил комментарий жижи в и ответ Марко Macuzzo в том , что просто изменив имя и устройство интерфейса / и т.д. / sysconfig / сеть-скрипты / ifcfg- eth0 (и переименование файла) приведет к тому, что устройство будет иметь правильное имя, если поле hwaddr = включено в файл конфигурации.Я рекомендую использовать этот метод вместо указанного обновления.

Вы также можете убедиться, что вы настроили правило udev, чтобы оно работало и при следующей перезагрузке. Путь для udev перенесен в CentOS 7 в /usr/lib/udev/rules.d/60-net.rules, но вы все равно можете управлять им тем же способом. Если вы добавили "net.ifnames = 0 biosdevname = 0" в строку загрузки ядра, чтобы вернуться к старой схеме именования для ваших nics, вы можете удалить

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

И заменить его на

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

Вам нужна одна запись на ник. Обязательно используйте правильный MAC-адрес и обновите поле ИМЯ. Если вы не использовали "net.ifnames = 0 biosdevname = 0", будьте осторожны, так как это может привести к непреднамеренным последствиям.

Джеймс Шивей
источник
2
Просто записка об этом. Если вы используете CentOS 7.3, это не работает. Это из-за этой проблемы ( access.redhat.com/solutions/2592561 ). Вам придется переопределить файл, /etc/udev/rules.d/90-eno-fix.rulesпотому что он переопределяет все ранее работавшие решения для переименования сетевых устройств.
помоему
Глядя на рекомендацию, на которую вы ссылались, он отмечает: «Эту проблему можно избежать, если обновить репозитории установки, включив в нее пакет systemd-219-30.el7_3.6 или новее. В этом более новом выпуске systemd уязвимые интерфейсы определяются при установке пакета и правило udev генерируется автоматически, поэтому проблема с переименованием полностью исключена ».
Джеймс Шивей,
Это другая проблема переименования, на которую они ссылаются. Они говорят о сокращении имени, потому что оно слишком длинное (я думаю). Упомянутое правило udev жестко кодирует имя интерфейса eno########значением, которое переопределяет все эти попытки переименовать его в нечто подобное eth0. Имеет ли это смысл? Мне нужно будет проверить на своей машине, какую версию я использую, но вчера я обновил до последней версии CentOS 7.3, так что я думаю, что у меня будет упомянутая версия.
помоему
Этот метод был полезен для меня при решении другой, но связанной с этим проблемы - контейнер завис при запуске из-за несвязанной ошибки конфигурации и оставил интерфейс, переименованный из системного имени ensXfY в контейнерное имя eth1. Тогда было невозможно повторить попытку запуска контейнера, потому что он не мог найти интерфейс, пока он не был переименован обратно
Майкл Ферт
9

На самом деле, лучший ответ, который я считаю, это сочетание двух уже опубликованных ответов. Чтобы изменить имя устройства без перезапуска сетевых служб, используйте ip linkкоманды, предложенные Джеймсом Шевей ( ip link set <old_device_name> name <new_device_name>).

Чтобы изменения сохранились после перезагрузки в Red Hat Linux, измените соответствующий файл в /etc/sysconfig/network-scripts/. Переименуйте файл ifcfg_<old_device_name>в ifcfg_<new_device_name>и измените DEVICEпеременную внутри на <new_device_name>. Также убедитесь, что HWADDRпеременная установлена ​​и является правильной. Не нужно трогать правила udev , так 60-net.rulesкак на самом деле они есть для чтения файлов конфигурации ifcfg /etc/sysconfig/network-scripts.

Марко Мадзукко
источник
3

Чтобы восстановить старое соглашение об именах, вам нужно отредактировать /etc/default/grubфайл и добавить следующее

net.ifnames=0 biosdevname=0 

в конце GRUB_CMDLINE_LINUXпеременной

отметка
источник
Или просто удаляя biosdevnameпакет, если он установлен
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
TJ Zimmerman
источник
1
хороший трюк переименования :) спасибо за обмен
166_MMX
2

Ответ, данный @James Shewey, кажется правильным способом сделать это.

Если вы хотите просто поработать с конфигурационными файлами /etc/sysconfig/network-scriptsи затем запустить перезагрузку, выгрузка и загрузка модуля ядра, как упомянуто @Tom Hunt в комментариях, также работает:

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

Если вы получаете удаленный доступ к машине, убедитесь, что вы выполняете все команды в nohup, иначе вы заблокируете себя:

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

Драйвер для перезагрузки, конечно, зависит от вашего интерфейса.

udondan
источник
0

Я попробовал вышеупомянутое с Vagrant / VirtualBox и ansible, но почему-то это не сработало вообще в моей среде разработки.

Старые имена интерфейсов сохранялись, что бы я ни делал, до полного перезапуска.

Я добавил следующие правила в /etc/udev/rules.d/60-persistent-net.rules(на основе: https://access.redhat.com/solutions/112643 )

Моя цель состояла в том, чтобы дать интерфейсу определенное имя на основе адреса PCI.

Пример:

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

После добавления этих правил я выполнил следующие команды:

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

Сообщение об ошибке было Cannot find device "int0"в ip link set * upкоманде. И /var/log/messagesя заметил следующие сообщения

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.

Но следующее сработало, получив доступ к ВМ через VirtualBox и выполнив следующие команды, чтобы удалить и повторно добавить модуль ядра.

rmmod e1000 
modprobe e1000

Я нашел это в следующей теме: https://www.centos.org/forums/viewtopic.php?t=54695

Странная вещь, которую я заметил, это то, что lsmodдает мне (обратите внимание на Used by)

[vagrant@node-01 ~]$ lsmod
Module                  Size  Used by
e1000                 137586  0 
Сандер Виссер
источник
Пожалуйста, дайте нам знать, что не работает с принятым ответом, с точными сообщениями об ошибках. Таким образом, возможно, ответ можно улучшить.
Нед64,
@ Нед64 Я добавил сообщение об ошибке и немного больше информации
Сандер Виссер
Что я имею в виду: что происходит, когда вы вводите как root ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up:? Нет udev...команды!
Нед64