生产环境中,托管于机房的服务器经常会进行割接操作,为了能让网卡更容易让运维人员和机房识别,避免因为弄错网线或找错网卡导致业务中断,在服务器上架前就应该对所有网卡按照 eth0
、eth1
的方式来命名,并按照网卡的物理位置贴上标签。从 CentOS7 开始,系统中的默认的网卡命名方式已经不再是 eth0
、eth1
的格式了。
要想让操作系统按照 eth0
、eth1
的方式来命名,一般有如下两种方式。
修改 udev 的 rules 文件
手动修改
一般情况下,板载网卡(目前多数服务器为板载双网卡)的 MAC 地址相差 1,其余网卡则为外接网卡。
使用 ip addr show
命令可以查看一台机器上所有的网卡信息。
1 | [root@m2 ~]# ip addr show |
以上命令输出结果中 00:50:56:39:b5:c6
和 00:50:56:39:b5:c7
这两个 MAC 地址相差为 1,因此可以大致断定网卡 ens32
和 ens33
为板载网卡,网卡名顺序应该改为 eth0
和 eth1
,剩下两块网卡为外接网卡,命名为 eth2
和 eth3
。
要修改默认的网卡命名方式,我们可以创建一个自定义 udev 的 rules 文件,如:/etc/udev/rules.d/70-mynet.rules
,然后按照顺序将 MAC 地址与网卡名称绑定。
1 | SUBSYSTEM=="net", ACTION="add", DRIVERS=="?*", ATTR{address}=="00:50:56:39:b5:c6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" |
除此之外,还需要更改网卡配置文件,配置 DEVICE
、NAME
以及 HWADDR
参数。在 ifcfg
文件中使用 HWADDR
参数设定 MAC 地址,这样就可由 udev 识别,然后从 DEVICE
参数提供的字符串中提取网卡名称。
/etc/sysconfig/network-scripts/ifcfg-eth0
的配置:
1 | TYPE=Ethernet |
/etc/sysconfig/network-scripts/ifcfg-eth1
的配置:
1 | TYPE=Ethernet |
/etc/sysconfig/network-scripts/ifcfg-eth2
的配置:
1 | TYPE=Ethernet |
/etc/sysconfig/network-scripts/ifcfg-eth3
的配置:
1 | TYPE=Ethernet |
重启完成后验证。
脚本自动修改
手动修改配置起来比较麻烦,更容易出现人工错误。为了更精准,我写了下面的脚本,脚本会在不改变原有 IP 相关配置的情况下更新名称,没有按照 MAC 地址排序(即:网卡物理位置排序)。为了以防万一,建议在执行完之后进行人工确认,然后再重启。
1 |
|
修改Grub2配置
如果并不关心网卡的物理位置,只想将网卡命名方式改为 eth0
、eth1
的格式,除了按照上面的方法,还可以修改 GRUB 菜单的内核启动命令行的参数。这种方法对云主机一样有效。
修改 /etc/default/grub
文件,在 GRUB_CMDLINE_LINUX=
参数中补充 net.ifnames=0 biosdevname=0
1 | [root@bogon ~]# cat /etc/default/grub |
修改完配置后,还需要通过 grub2-mkconfig
命令重新生成配置。
1 | [root@bogon ~]# cp /boot/grub2/grub.cfg{,.old}; |
在 CentOS7 中提供了 grubby
命令,可以用来查看 /boot/grub2/grub.cfg
中的 grub 策略。
1 | [root@bogon ~]# grubby --info=ALL | grep args |
重启完之后网卡名称会更新,如果之前配置了静态 IP 地址的话会自动加到网卡上,但是这种配置方式在重启机器后并不会自动更新网卡的配置,还需要手动重命名网卡配置文件,并且更新文件中的 DEVICE
、 NAME
等字段。
1 | [root@bogon ~]# reboot |
补充说明: 使用 grubby
命令也可以直接修改 /boot/grub2/grub.cfg
中的 grub 策略。
1 | [root@bogon ~]# cp /boot/grub2/grub.cfg{,.bak}; |
这种方法并不会更新 /etc/default/grub
,按照规范,最好手动修改 /etc/default/grub
然后以此文件重新生成配置。