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

重新启动会激活新配置。但是,如何在重新启动的情况下激活此配置?

A 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

两者,ifconfigip a显示旧的接口名称。


1
如果将网络设备驱动程序编译为内核模块,则可以尝试删除并重新加载它们。
汤姆·亨特

Answers:


29

您可以使用ip命令重命名设备:

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

编辑

我出于完整性和后代目的(出于提供信息的目的)离开下面,但我已经确认了swill的评论Marco Macuzzo的回答,即仅更改接口/ etc / sysconfig / network-scripts / ifcfg-的名称和设备即可。只要在配置文件中包含hwaddr =字段, eth0(并重命名文件)将导致正确命名设备我建议在引用更新后使用此方法。

您可能还需要确保配置了udev规则,以便该规则也可以在下次重新启动时使用。udev的路径在CentOS 7中已移至/usr/lib/udev/rules.d/60-net.rules,但是您仍然可以以相同的方式进行管理。如果您在内核启动字符串中添加了“ net.ifnames = 0 biosdevname = 0”,以返回到您的NIC的旧命名方案,则可以删除

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"

每个NIC需要一个条目。确保使用正确的MAC地址并更新NAME字段。如果您未使用“ net.ifnames = 0 biosdevname = 0”,请小心,因为可能会导致意想不到的后果。


2
只是对此的注释。如果您使用的是CentOS 7.3,则此方法不起作用。这是由于此问题(access.redhat.com/solutions/2592561)。您将必须覆盖文件,/etc/udev/rules.d/90-eno-fix.rules因为它会覆盖所有以前可以使用的解决方案来重命名网络设备。
swill

查看您参考的通报,它指出:“可以通过更新安装存储库以包括systemd-219-30.el7_3.6或更高版本的软件包来避免此问题。使用此较新的systemd发行版,可以在安装软件包和udev规则会自动生成,因此完全可以避免重命名问题。”
James Shewey

他们所指的是另一个不同的重命名问题。他们说的是名字太短,因为它太长了(我认为)。提到的udev规则将接口名称硬编码为一个eno########值,该值将覆盖所有将其重命名为的所有尝试eth0。那有意义吗?我必须在机器上验证我使用的是哪个版本,但是昨天我升级到了最新的CentOS 7.3,所以我想我会提到该版本。
swill

此方法对我解决一个不同但相关的问题很有用-容器由于不相关的配置错误而在启动时崩溃,并将接口从系统名称ensXfY重命名为eth1。然后便无法重新尝试启动容器,因为直到将其重命名后才能找到该接口
Michael Firth

9

实际上,我认为最好的答案是已经发布的两个答案的组合。为了在不重新启动网络服务的情况下更改设备名称,请使用ip linkJames Shewey(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

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"

当然,要重新加载的驱动程序取决于您的界面。


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访问VM并执行以下命令来删除并重新添加内核模块。

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 

请通过确切的错误消息告诉我们,什么不能用于接受的答案。这样也许可以改善答案。
Ned64

@ Ned64我添加了错误消息和更多信息
Sander Visser

我的意思是:以root用户身份输入时会发生什么ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up?没有udev...命令!
Ned64
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.