nic_rename.sh
#!/bin/bash# 按udev规则文件中的 MAC地址->网卡名 映射强制改名, 处理网卡枚举较晚或已被提前UP导致udev改名失败的情况RULES=/etc/udev/rules.d/70-persistent-net.rules[-f"$RULES"]||exit0declare-AMAPwhileIFS=read-rline||[-n"$line"];domac=$(grep-oP'ATTR\{address\}=="\K[^"]+'<<<"$line")name=$(grep-oP'NAME="\K[^"]+'<<<"$line")[-n"$mac"]&&[-n"$name"]&&MAP[$mac]=$namedone<"$RULES"[${#MAP[@]}-eq0]&&exit0# 改名前先down, 接口UP时内核拒绝改名, 经临时名避免名称冲突, 再恢复原状态fordevin/sys/class/net/*;dodev=$(basename"$dev")["$dev"="lo"]&&continuemac=$(cat"/sys/class/net/$dev/address"2>/dev/null)target=${MAP[$mac]}[-z"$target"]&&continue["$dev"="$target"]&&continue# 记录原 UP/DOWN 状态was_up=0ifiplinkshow"$dev"|grep-q"<.*UP.*>";thenwas_up=1fiiplinkset"$dev"down2>/dev/nullif!iplinkset"$dev"name"tmp_$target"2>/dev/null;thenlogger-tnic_rename"$dev改名失败"continuefiiplinkset"tmp_$target"name"$target"2>/dev/nullif["$was_up"-eq1];theniplinkset"$target"upfilogger-tnic_rename"$dev($mac) ->$target"done用法:./nic_rename.sh。
设置系统开机自启:
- 把文件
nic_rename.sh放在目录/lib/ifupdown/下,chmod +x nic_rename.sh赋予可执行权限。 - 创建服务文件
/lib/systemd/system/nic_rename.service
[Unit]Description=Rename ethernet cards by MACAfter=systemd-udev-trigger.service systemd-modules-load.service local-fs.targetBefore=network-pre.targetWants=network-pre.target[Service]Type=oneshotRemainAfterExit=yesExecStart=/lib/ifupdown/nic_rename.sh[Install]WantedBy=multi-user.target- 启动服务
systemctlenablenic_rename systemctl daemon-reload systemctl start nic_rename