Centos7重命名网卡

配置方法

为了更加方便的识别和操作网卡,在某些场景下需要自定义网卡的名称,当然网卡的名称并不是随意修改的,需要遵循一定的规则。例如需要将网卡名称ens33修改为eth0,在此过程中涉及到两个文件,分别为:

  1. 网卡配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
  2. 系统引导文件:/etc/default/grub

操作流程如下(共计4步):

  1. 更改网卡配置文件名及配置文件
    三码合一:配置文件名ifcfg-之后的名称、配置文件内DEVICE和NAME的值
    原网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33修改为ifcfg-eth0,配置文件内容如下:
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
NAME="eth0"         #将ens33修改为eth0
UUID="47f11128-5846-4db4-b4c9-ecf48af85d13"
DEVICE="eth0"       #将ens33修改为eth0
ONBOOT="yes"        
  1. 关闭"一致性网络设备命名法"
    因CentOS7采用grub2引导,需要对grub2进行修改
    编辑/etc/default/grub配置文件:在GRUB_CMDLINE_LINUX这个参数后面加入net.ifnames=0 biosdevname=0
# 修改前 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

# 修改后
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"
GRUB_DISABLE_RECOVERY="true"
  1. 用grub2-mkconfig命令重新生成GRUB配置并更新内核
grub2-mkconfig -o /boot/grub2/grub.cfg]
  1. reboot重启

原理介绍

Centos7采用的网络设备命名方式为一致性网络设备命名(Consistent Network Device Naming),主要参考以下链接进行整理:

  1. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Consistent_Network_Device_Naming.html
  2. https://bugzilla.redhat.com/show_bug.cgi?id=965718

背景

centos5使用eth0的方式来命名网络设备,centos6却使用em1的方式来命令网络设备,在centos6安装的时候,给启动参数加上biosdevname=0,就可以继续使用eth0这样的命名。
升级到centos7后,发现原有的参数biosdevname=0不起作用了,网络设备变成了eno1这样的名称,centos7这种变化的原因是由于systemd和udev引入了一种新的网络设备命名方式:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)
服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的,Linux系统的命名原来是eth0、eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的物理顺序,为解决这类问题,dell开发了biosdevname方案(systemd v197版本中将dell的方案作了进一步的一般化拓展),目前的Centos既支持dell的biosdevname,也支持systemd的方案

命名规则

默认情况下,systemd将依次根据下面的策略来命名网卡:

  1. 如果从BIOS中能够取到可用的,板载网卡的索引号,则使用这个索引号命名,例如:eno1
  2. 如果从BIOS中能够取到可以用的,网卡所在的PCI-E热插拔插槽的索引号,则使用这个索引号命名,例如:ens1
  3. 如果能取到设备所连接的物理位置信息,则使用这个信息命名,例如:enp2s0
  4. (默认跳过此方案)使用网卡的MAC地址来命名,这个方法一般不使用,除非用户选择使用此方案,例如:enx78e7d1ea46da
  5. 传统的kernel命名方法(即以上所有的方案都失效后),例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1

biosdevname和net.ifnames两种命名规范

net.ifnames

net.ifnames命名规范为:设备类型(前两个字符是网络类型,第三个字符是设备类型)+设备位置+数字
前两个字符的含义:
前两个字符的含义

其他字符的含义:
其他字符的含义

实际的例子:

  1. 板载网卡:eno1
  2. pci网卡:enp0s2或ens33或者enx78e7d1ea46da
  3. pci无线网卡:wlp3s0
  4. 4G模块:wwp0s29f7u2i2
  5. USB无线网卡:wlp0s2f1u4u1

biosdevname

biosdevname命名规范是根据不同的网络设备来的,具体如下:
biosdevname

实际的例子:

  1. 板载网卡:em1
  2. pci网卡:p3p4
  3. 虚拟网卡:p3p4_1

systemd中的实际执行顺序

按照如下顺序执行udev的rule网卡命名受 biosdevname和net.ifnames这两个内核参数影响

  1. /usr/lib/udev/rules.d/60-net.rules
    1. 使用/lib/udev/rename_device这个程序,去查询/etc/sysconfig/network-scripts/下所有以ifcfg-开头的文件
    2. 如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数的网卡接口,则选取DEVICE=yyyy中设置的名字作为网卡名称
  2. /usr/lib/udev/rules.d/71-biosdevname.rules实际执行biosdevname的policy
    1. 如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡
    2. 主要是取SMBIOS中的type 9 (System Slot) 和type 41 (Onboard Devices Extended Information),不过要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序
  3. /lib/udev/rules.d/75-net-description.rules实际执行命名规则的1、2、3条
    1. udev通过检查网卡信息,填写如下这些udev的属性值:ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH、ID_NET_NAME_MAC
  4. /usr/lib/udev/rules.d/80-net-name-slot.rules实际执行命名规则的1、2、3条
    1. 如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数,则udev依次尝试使用以下属性值来命名网卡:ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH
    2. 如果这些属性值都没有,则网卡不会被重命名

biosdevname和net.ifnames应用

这两个参数都可以在grub配置中提供,biosdevname=0是系统默认值(dell服务器默认是1),net.ifnames=1是系统默认值。
上面所说的命名规则的顺序是系统默认的。

  1. 如系统BIOS符合要求,且系统中安装了biosdevname,且biosdevname=1启用,则biosdevname优先;
  2. 如果BIOS不符合biosdevname要求或biosdevname=0,则仍然是systemd的规则优先;
  3. 如果用户自己定义了udev rule来修改内核设备名字,则用户规则优先。

内核参数组合使用的时候,其结果如下:

  1. 默认内核参数(biosdevname=0,net.ifnames=1): 网卡名 "enp5s2"
  2. biosdevname=1,net.ifnames=0:网卡名 "em1"
  3. biosdevname=0,net.ifnames=0:网卡名 "eth0" (最传统的方式)

centos7网卡重命名为ethx格式

如果你希望继续使用eth0这样的传统名称,那么在安装启动(pxe)时加上参数:net.ifnames=0 biosdevname=0
cobbler profile 修改方法:cobbler profile edit --name=Centos-7.3-x86_64 --kopts='net.ifnames=0 biosdevname=0'
如果你已经安装完了,希望改成eth0这样的名称,那么执行如下操作需要:

  1. 修改grub2启动参数(配置文件/etc/sysconfig/grub),在GRUB_CMDLINE_LINUX的中加上net.ifnames=0 biosdevname=0的参数
  2. 重新加载到启动中grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重新对网卡配置文件进行命名(网卡文件全部重命名,顺便修改配置文件中NAME、DEVICE的名称
  4. reboot重启生效