生产环境中,托管于机房的服务器经常会进行割接操作,为了能让网卡更容易让运维人员和机房识别,避免因为弄错网线或找错网卡导致业务中断,在服务器上架前就应该对所有网卡按照 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 然后以此文件重新生成配置。