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

Вопрос или проблема

Я переименовываю сетевые интерфейсы, изменяя файлы в /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 приводит к следующему сообщению, независимо от того, было ли указано старое или новое имя:

ERROR : [/etc/sysconfig/network-scripts/ifup-eth] Устройство nic0, похоже, отсутствует, задержка инициализации.

/etc/init.d/network status показывает следующий вывод:

Настроенные устройства:
lo bond0 nic0 nic1
Текущие активные устройства:
lo eth0 eth1 bond0

Как ifconfig, так и ip a показывают старые имена интерфейсов.

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

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

Правка:

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

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

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-адрес и обновили поле NAME. Если вы не использовали “net.ifnames=0 biosdevname=0”, будьте осторожны, так как это может повлечь за собой непреднамеренные последствия.

На самом деле, лучший ответ, как я считаю, это сочетание двух уже опубликованных ответов. Чтобы изменить имя устройства без перезагрузки сетевых служб, используйте команды 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.

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\"/DEVICE=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

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

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

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

net.ifnames=0 biosdevname=0 

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

Ответ, данный @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"

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

Я пробовал вышеуказанное с 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

Сообщение об ошибке было Не удается найти устройство "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): изменение состояния: отключено -> недоступно (причина 'carrier-changed', sys-iface-state: 'managed')
Aug 16 17:08:41 localhost systemd-udevd: Политика именования сетевого интерфейса отключена в командной строке ядра, игнорируем.

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

rmmod e1000 
modprobe e1000

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

Странное, что я заметил, это то, что lsmod показывает мне (обратите внимание на Used by)

[vagrant@node-01 ~]$ lsmod
Модуль                  Размер  Используется
e1000                 137586  0 

Вы можете сделать это через ssh:

ip link set eth0 down\
ip link set eth0 name nic0\
ip link set nic0 up

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

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

MAC=$(cat /sys/class/net/nic0/address)\
echo -n 'HWADDR="'$MAC\" >> /etc/sysconfig/network-scripts/ifcfg-nic0

Ответ или решение

Вопрос о переименовании сетевых интерфейсов в CentOS 7 без перезагрузки системы может субъективно показаться сложным, особенно если вы уже изменили конфигурацию в директории /etc/sysconfig/network-scripts. Тем не менее, процесс можно осуществить достаточно просто, если внимательно следовать нескольким шагам.

Этап 1: Подготовительная работа

Несмотря на то, что изменения в конфигурационных файлах активируются при перезагрузке, их можно применить немедленно. Однако для этого важно, чтобы вы понимали, что ваш сетевой интерфейс необходимо сначала отключить, а затем переименовать.

Этап 2: Переименование сетевого интерфейса

  1. Отключите существующий интерфейс:
    Используйте команду ip link для отключения интерфейса. Если, к примеру, вы хотите переименовать eth0 в nic0, выполните следующую команду:

    ip link set eth0 down
  2. Переименуйте интерфейс:
    Теперь вы можете переименовать интерфейс с помощью следующей команды:

    ip link set eth0 name nic0
  3. Включите интерфейс:
    После переименования, активируйте интерфейс с новым именем:

    ip link set nic0 up

Этап 3: Изменение конфигурационных файлов

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

  1. Переименуйте файл конфигурации:
    Выполните команду для переименования файла конфигурации с ifcfg-eth0 на ifcfg-nic0:

    mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-nic0
  2. Отредактируйте файл конфигурации:
    Откройте файл ifcfg-nic0 в текстовом редакторе и поменяйте параметр DEVICE в соответствии с новым именем:

    DEVICE=nic0

    Убедитесь, что также есть запись о HWADDR с правильным MAC-адресом интерфейса:

    HWADDR=xx:xx:xx:xx:xx:xx

Этап 4: Проверка изменений

Проверьте, что переименование прошло успешно командой:

ip a

Вы должны увидеть, что интерфейс теперь называется nic0. Также важно убедиться, что конфигурация позволяет интерфейсу автоматически подниматься при старте системы, для чего параметр ONBOOT=yes должен быть установлен.

Заключение

Следуя приведённым шагам, вы сможете переименовать сетевые интерфейсы в CentOS 7 без необходимости перезагрузки системы. Это не только является эффективным способом управления сетевыми ресурсами, но и позволяет поддерживать работоспособность системы без длительных простоев. Не забудьте сохранить изменения в конфигурационных файлах, чтобы все настройки были актуальны после перезагрузки.

Оцените материал
Добавить комментарий

Капча загружается...