linux网卡命名规则与修改方法

一.前言:

       在早期的的操作系统中例如fedora13或者ubuntu15之前网卡命名的方式为eth0,eth1,eth2,属于biosdevname 命名规范。当然这是针对intel网卡的命名规则,对于realtek类型的网卡会命名为ens33。但是这个编号往往不一定准确对应网卡接口的物理顺序,为了能够方便定位和区分网络设备,目前linux的主流操作系统采用一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)规范。

二.一致网络设备命名规则(CONSISTENT NETWORK DEVICE NAMING)

        命名规范为:设备类型 + 设备位置

1. 设备类型

        en 代表以太网

        wl 代表无线局域网(WLAN)

        ww 代表无线广域网(WWANs)

2. 设备位置

格式

含义

o<on-board_index_number>

主板bios内置的网卡

s<hot_plug_slot_index_number>[f<function>][d<device_id>]

主板bios内置的PCI-E网卡

x<MAC>

MAC 地址

p<bus>s<slot>[f<function>][d<device_id>]

PCI-E独立网卡

[P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][…][c<config>][i<interface>]

USB网卡

        例如:       

        eno1 板载1号网卡

        enp0s2 以太网0号PCI扩展卡的2号端口

        ens33 由主板 BIOS 内置的 PCI-E 接口的网卡

        wlp1s0 无线第1号PCI扩展卡的0号端口

3.优势

       (1) 设备名称是完全可预测的。

       (2) 即使添加或删除硬件,设备名称也保持固定,因为不会发生重新枚举。

       (3) 有缺陷的硬件可以无缝更换。

三.systemd-udev网卡命名规则

         以centos7为例,系统默认用于网卡设备重命名的服务是systemd-udevd,我们可以使用systemctl status systemd-udevd来查看目前该服务的状态。

1.systemd-udev默认命名策略

        默认情况下,systemd-udev会使用以下策略,采用支持的命名方案为接口命名:
        Scheme 1(方案 1): 如果从BIOS中能够取到可用的板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试Scheme 2
        Scheme 2(方案 2): 如果从BIOS中能够取到可以用的网卡所在的PCI-E热插拔插槽的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试Scheme 3
        Scheme 3(方案 3): 如果能拿到设备所连接的物理位置信息,则使用这个信息命名,例如:enp2s0,如不能则尝试Scheme 5
        Scheme 4(方案 4): 使用网卡的MAC地址来命名,这个方法一般不使用。enx78e7d1ea46da
        Scheme 5(方案 5):传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1。

 2. systemd-udev rename流程

        在centos7中, systemd命名网卡的规则根据以下6个配置文件
        /lib/udev/rules.d/60-net.rules,
        /lib/udev/rules.d/71-biosdevname.rules
        /lib/udev/rules.d/75-net-description.rules
        /lib/udev/rules.d/80-net-name-slot.rules
        /lib/udev/rules.d/80-net-setup-link.rules
        /lib/udev/rules.d/99-systemd.rules
(1) 第一步: /lib/udev/rules.d/60-net.rules 

        使用/lib/udev/rename_device这个程序,首先查询/etc/sysconfig/network-scripts/下所有以ifcfg-开头的文件。
        如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数的网卡接口,则选取DEVICE=yyyy中设置的名字作为网卡名称。
        在不修改 udev 规则的条件下,/etc/sysconfig/network-scripts/的 ifcfg-* 文件的优先最高。在ifcfg-*文件中将DEVICE 和 mac 绑定后重命名网卡名称和避免网卡乱序。

        (2)第二步:/lib/udev/rules.d/71-biosdevname.rules

        如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。
        主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (OnboardDevices Extended Information)

        (3)第三步: /lib/udev/rules.d/75-net-description.rules

         /lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH,但是有些设备属性可能处于未定义状态。


        可以通过udevadm test-builtin net_id /sys/class/net/xxx 网络接口比如ens33来查看相关属性。

         (4)第四步: /lib/udev/rules.d/80-net-name-slot.rules

 

        如果前三部都没有给网卡设备重命名,则systemd-udev依次尝试来自75-net-description.rules中定义的属性值来命名网卡,
        如果这些属性值都没有,则网卡不会被重命名,沿用内核给定的ethx来命名

   (5)第五步 /lib/udev/rules.d/80-net-setup-link.rules
     用内建的的path_id 和net_setup_link来查询 键值ID_NET_NAME,并赋给设备名字
NAME=="", ENV{ID_NET_NAME}!="", NAME="$env{ID_NET_NAME}"

 (6)第六步  /lib/udev/rules.d/99-systemd.rules

         用sysctl 改变内核的一些默认参数

 /lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/name --prefix=/net/ipv6/conf/name

        所以针对60-net.rules, 可以添加类似如下规则文件去固定命名。

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:84:e3:82", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth0"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:f0:c8:7f", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth2"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:01:63:bd:f1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth1"

        也可以修改/etc/sysconfig/network-scripts/下的 ifcfg-* 文件,在ifcfg-*文件中将DEVICE 和 mac 绑定,固定网卡名称,其中device条目即为设备名字,如DEVICE=eno2

        强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高;

四.修改为biosdevname命名规则

    1. 修改启动参数   

       (1)编辑/etc/default/grub
        vi /etc/default/grub
        找到GRUB_CMDLINE_LINUX=""
        改为GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
        (2)重新生成GRUB的启动菜单配置文件(/boot/grub/grub.cfg)
        update-grub
        (3)重启系统后,网卡名称变成eth0和wlan0

        2. 修改网卡配置文件

        原来网卡配置文件名称为ifcfg-ens33,这里需要修改为eth0的格式,并适当调整网卡配置文件。
        

mv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0        
#修改ifcfg-eth0文件如下内容(其它内容不变),NAME=eth0 DEVICE=eth0
systemctl restart network.service #重启网络服务

        3.  创建70-persistent-net.rules

        直接在/etc/udev/rules.d/中创建或修改70-persistent-net.rules文件,加上或修改信息为:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME=="eth0"

 五.ubuntu18修改网卡名称

         上面讲过的都是在centos7中,在ubuntu18中,则简单很多,没有看到/lib/udev/rules.d/60-net.rules, /lib/udev/rules.d/71-biosdevname.rules,/lib/udev/rules.d/75-net-description.rules这些文件
        ubuntu18识别网卡,名称默认会根据 /lib/udev/rules.d/目录下的80-net-setup-link.rules文件定义的规则来。如果你要更改规则,需要先将文件80-net-setup-link.rules从/lib/udev/rules.d目录复制到/etc/udev/rules.d目录。因为/etc/udev/rules.d目录下规则的优先级高于/lib/udev/rules.d目录,识别网卡并命名时,会优先从/etc/udev/rules.d目录下寻找规则文件。将ID_NET_NAME改成ID_NET_SLOT即可。

        

猜你喜欢

转载自blog.csdn.net/yangwenchao1983/article/details/131934292
今日推荐