Вопрос или проблема
Я переименовываю сетевые интерфейсы, изменяя файлы в /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: Переименование сетевого интерфейса
-
Отключите существующий интерфейс:
Используйте командуip link
для отключения интерфейса. Если, к примеру, вы хотите переименоватьeth0
вnic0
, выполните следующую команду:ip link set eth0 down
-
Переименуйте интерфейс:
Теперь вы можете переименовать интерфейс с помощью следующей команды:ip link set eth0 name nic0
-
Включите интерфейс:
После переименования, активируйте интерфейс с новым именем:ip link set nic0 up
Этап 3: Изменение конфигурационных файлов
Теперь, когда интерфейс переименован, вам нужно обновить конфигурацию, чтобы изменения сохранились после перезагрузки.
-
Переименуйте файл конфигурации:
Выполните команду для переименования файла конфигурации сifcfg-eth0
наifcfg-nic0
:mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-nic0
-
Отредактируйте файл конфигурации:
Откройте файлifcfg-nic0
в текстовом редакторе и поменяйте параметрDEVICE
в соответствии с новым именем:DEVICE=nic0
Убедитесь, что также есть запись о
HWADDR
с правильным MAC-адресом интерфейса:HWADDR=xx:xx:xx:xx:xx:xx
Этап 4: Проверка изменений
Проверьте, что переименование прошло успешно командой:
ip a
Вы должны увидеть, что интерфейс теперь называется nic0
. Также важно убедиться, что конфигурация позволяет интерфейсу автоматически подниматься при старте системы, для чего параметр ONBOOT=yes
должен быть установлен.
Заключение
Следуя приведённым шагам, вы сможете переименовать сетевые интерфейсы в CentOS 7 без необходимости перезагрузки системы. Это не только является эффективным способом управления сетевыми ресурсами, но и позволяет поддерживать работоспособность системы без длительных простоев. Не забудьте сохранить изменения в конфигурационных файлах, чтобы все настройки были актуальны после перезагрузки.