在Linux Ubuntu20.04系统中,网络接口的命名是网络管理的一个基本方面。一般网络接口使用如eth0
、usb0
等命名方式,但不知道为啥 有些文件系统有这个东西 : Predictable Network Interface Names的引入,让接口命名变得基于硬件属性,如MAC地址,导致名称如enx78e7d1ea46da
这样的格式出现。但在某些情况下,需要旧的命名方式,比如我usb0
的时候是写了个auto_udhcpc.sh
里面是固定的usb0
, 但是可预测的网络接口命名是加了MAC地址的 所以需要还原回去。
参考学习: Linux网络接口命名, Predictable Network Interface Names
初始问题
在Ubuntu 20.04系统中,发现原本命名为usb0
的网络接口被自动重命名为基于MAC地址的格式,如enxae0c29a39b6d
。这种改变虽然符合最新的Linux网络命名约定,但在定制系统应用场景中可能不太方便。需求目标是恢复到usb0
这样的命名方式,但在不同设备上,由于MAC地址的不同,这个需求难以通过简单的配置更改来实现。
解决过程
解决这个问题的关键在于理解Linux中udev
系统的工作原理(可以看参考学习部分),它负责在设备连接时动态创建设备节点。通过创建自定义的udev
规则,我们可以覆盖默认的网络接口命名机制。
步骤1:尝试手动更改
最初的尝试可能包括手动编辑/etc/udev/rules.d/
目录下的规则文件,或是尝试修改系统的网络配置来强制使用特定的接口名称。这些方法可以,但是每台机器这么搞我受不了 ,肯定得把步骤打包脚本放rootfs自动运行的。
步骤2:自动化脚本
为了提供一个更通用且自动化的解决方案,编写一个脚本开机运行,该脚本能够:
- 检测系统中是否存在以
enx
开头的网络接口。 - 读取该接口的MAC地址。
- 创建一个自定义的
udev
规则文件(如果它还不存在),并基于读取的MAC地址写入一条规则,将该接口重命名为usb0
。 - 重新加载
udev
规则并触发它们,以确保更改立即生效。
这个脚本的核心在于它不依赖于硬编码的MAC地址,而是动态地从系统中检测和应用,使其能够在不同的机器上工作而无需任何修改。
脚本实现
脚本的实现涉及到使用ip link
和grep
命令来查找网络接口和读取MAC地址,然后根据这些信息动态生成udev
规则。这个过程需要root权限,因为它涉及到修改系统文件和执行系统命令。
#!/bin/bash # 检查是否存在以enx开头的网络接口 interface=$(ip link | grep -o 'enx[[:xdigit:]]\+') if [ -z "$interface" ]; then echo "没有找到以enx开头的网络接口。" exit 0 fi # 读取该接口的MAC地址 mac_address=$(ip link show $interface | grep -oP '(?<=link/ether )[^ ]+') if [ -z "$mac_address" ]; then echo "无法读取网络接口的MAC地址。" exit 1 fi # 检查70-persistent-net.rules文件是否存在,如果不存在则创建 rules_file="/etc/udev/rules.d/70-persistent-net.rules" if [ ! -f "$rules_file" ]; then echo "文件$rules_file不存在,正在创建..." touch "$rules_file" fi # 向70-persistent-net.rules文件中写入udev规则 echo "SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"$mac_address\", NAME=\"usb0\"" >> "$rules_file" # 重新加载udev规则并触发 sudo udevadm control --reload-rules sudo udevadm trigger echo "操作完成。"
使用说明:
- 将内容脚本保存到一个文件中,例如
rename-net-interface.sh
。 - 给该脚本执行权限:
chmod +x rename-net-interface.sh
- 以root用户执行该脚本 ,如果需要做到rootfs就弄到开机启动里运行:
sudo ./rename-net-interface.sh
结论
通过这个脚本,可以在不同的Linux系统上自动化地恢复到他们偏好的网络接口命名方式,而不必担心设备的MAC地址差异。这种方法既灵活又可靠,特别适合于需要批量出货刷机的环境。
但最开始,我一直在找系统默认如何恢复,不使用预测的网络接口命名的方式,找了系统的udev
下的配置貌似没有。
既然在/etc/udev/rules.d/
目录下没有找到直接负责网络接口命名的规则文件(如70-persistent-net.rules
),网络接口的命名行为很可能是由系统默认的Predictable Network Interface Names策略控制的,这是由systemd
和udev
共同管理的,而不是通过自定义的udev
规则。