nic_rename.sh
bash
#!/bin/bash
# 按udev规则文件中的 MAC地址->网卡名 映射强制改名, 处理网卡枚举较晚或已被提前UP导致udev改名失败的情况
RULES=/etc/udev/rules.d/70-persistent-net.rules
[ -f "$RULES" ] || exit 0
declare -A MAP
while IFS= read -r line || [ -n "$line" ]; do
mac=$(grep -oP 'ATTR\{address\}=="\K[^"]+' <<<"$line")
name=$(grep -oP 'NAME="\K[^"]+' <<<"$line")
[ -n "$mac" ] && [ -n "$name" ] && MAP[$mac]=$name
done < "$RULES"
[ ${#MAP[@]} -eq 0 ] && exit 0
# 改名前先down, 接口UP时内核拒绝改名, 经临时名避免名称冲突, 再恢复原状态
for dev in /sys/class/net/*; do
dev=$(basename "$dev")
[ "$dev" = "lo" ] && continue
mac=$(cat "/sys/class/net/$dev/address" 2>/dev/null)
target=${MAP[$mac]}
[ -z "$target" ] && continue
[ "$dev" = "$target" ] && continue
# 记录原 UP/DOWN 状态
was_up=0
if ip link show "$dev" | grep -q "<.*UP.*>"; then
was_up=1
fi
ip link set "$dev" down 2>/dev/null
if ! ip link set "$dev" name "tmp_$target" 2>/dev/null; then
logger -t nic_rename "$dev 改名失败"
continue
fi
ip link set "tmp_$target" name "$target" 2>/dev/null
if [ "$was_up" -eq 1 ]; then
ip link set "$target" up
fi
logger -t nic_rename "$dev($mac) -> $target"
done
用法: ./nic_rename.sh。
设置系统开机自启:
- 把文件
nic_rename.sh放在目录/lib/ifupdown/下,chmod +x nic_rename.sh赋予可执行权限。 - 创建服务文件
/lib/systemd/system/nic_rename.service
bash
[Unit]
Description=Rename ethernet cards by MAC
After=systemd-udev-trigger.service systemd-modules-load.service local-fs.target
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/ifupdown/nic_rename.sh
[Install]
WantedBy=multi-user.target
- 启动服务
bash
systemctl enable nic_rename
systemctl daemon-reload
systemctl start nic_rename