通过udev重命名网络设备名

ThinkPad X220笔记本 上安装Linux系统,会看到网络设备命名不是约定俗成的 eth0wlan0 而是:

  • Intel 82579LM 千兆有线网卡: enp0s25

  • Intel Advanced-N 6205无线网卡: wlp3s0

这对一些配置工作带来困扰,也不方便编写通用的网络配置脚本。

为了能够稳定识别网络设备并转换成标准的 eth0wlan0 ,方便 arch linux配置IP(静态或动态) ,使用 udev 规则来完成命名转换。

操作步骤

  • 首先找出网络设备的MAC地址,这个MAC地址将用于 udev 规则匹配设备:

    ip link
    

例如输出:

2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether f0:de:f1:9b:0c:7b brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 08:11:96:8a:e2:b4 brd ff:ff:ff:ff:ff:ff

可以看到系统中网络设备:

enp0s25   f0:de:f1:9b:0c:7b
wlp3s0    08:11:96:8a:e2:b4

为什么网络设备会这样命名

实际上网络设备命名是为了唯一标识设备,所以操作系统启动时内核特意把网络设备按照驱动进行重命令。例如:

dmesg | grep enp

可以看到:

[    8.175520] e1000e 0000:00:19.0 enp0s25: renamed from eth0
[   11.651108] e1000e 0000:00:19.0 enp0s25: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
[   11.651200] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s25: link becomes ready

无线网卡也是如此:

dmesg | grep wlp

显示从wlan0重命名:

[    8.643639] iwlwifi 0000:03:00.0 wlp3s0: renamed from wlan0

在操作系统启动时会自动完成上述旧系统命名 eth0wlan0 自动转换成明确区分的网络设备名。

在debian 9 或者 Ubuntu 15.04 开始,作为 Systemd进程管理器 的组成部分,该特性称为 可预测的网络接口命名 。早期简化的 eth0 , eth1 是操作系统启动时根据驱动检测到设备的顺序命名的,由于每次初始化顺序的不确定性,会导致 ethX 和实际网卡不是固定的对应关系。从 Systemd进程管理器 / udev 版本 v197开始,在 udev 原生命名网络接口如下:

  • 根据主板设备Firmware/BIOS提供的索引命名(例如 eno1)

  • 根据PCI Express热插拔槽索引号命名 (例如 ens1)

  • 根据硬件连接器的物理位置命名 (例如 enp2s0)

  • 根据网卡MAC地址命名 (例如 enx78e7d1ea46da)

  • 经典的不可预测的内核原生 ethX 命名 (例如 eth0)

使用 可预测的网络接口命名 优点:

  • 重启后获得稳定不变的接口名

  • 即使硬件添加或移除,接口命名不变

  • 内核升级或更改也不改变接口名

  • 无需用户配置设备名自动分配

  • 接口名是可预测的

  • 适用于x86和非x86平台

如何禁用 可预测的网络接口命名

由于某些兼容性原因,或者你就是不需要,则可以通过以下 3种方式之一 禁用 可预测的网络接口命名 :

  • 使用屏蔽掉 udev 的软连接来恢复使用以前的那种不可预测内核设备名:

    ln -s /dev/null /etc/systemd/network/99-default.link
    
  • 创建自己的手动命名计划(scheme),例如可以命名为 internet0 , dmz0lan0 等。详细语法参考 systemd.link(5) ,简单的案例如下 /etc/systemd/network/10-dmz.link :

/etc/systemd/network/10-dmz.link
[Match]
MACAddress=00:a0:de:63:7a:e6

[Link]
Name=dmz0
  • 在内核命令行参数添加 net.ifnames=0 则自动恢复原先旧有的 eth0 这样的命名方式

使用 udev 规则重命名设备

备注

使用 udev 规则重命名设备是一种比较常用且约定俗成的运维方法。当然,也可以使用上文 “如何禁用 可预测的网络接口命名 “ 方法二,使用类似 /etc/systemd/network/10-dmz.link 配置来通过 Systemd Networkd服务 配置设备命名

  • 配置 /etc/udev/rules.d/30-net_names.rules

    SUBSYSTEM==”net”, ACTION==”add”, ATTR{address}==”ff:ff:ff:ff:ff:ff”, NAME=”eth0” SUBSYSTEM==”net”, ACTION==”add”, ATTR{address}==”ee:ee:ee:ee:ee:ee”, NAME=”wlan0”

重启系统后,对应的有线和无线网卡会分别重命名为 eth0wlan0

其他配置案例也可以采用以下方式:

KERNEL=="eth*", SYSFS{address}=="00:12:34:fe:dc:ba", NAME="eth0"
KERNEL=="eth*", SYSFS{address}=="00:56:78:98:76:54", NAME="eth1"

参考