core: 首次开机等待网卡名稳定 10 秒

This commit is contained in:
bin456789
2026-04-25 23:16:52 +08:00
parent d55a27c1a2
commit 5b332868ea

View File

@ -5,53 +5,68 @@
set -eE
# openeuler 需等待 udev 将网卡名从 eth0 改为 enp3s0
sleep 10
# 不知道有没有用
if command -v udevadm >/dev/null; then
# udevadm trigger
udevadm settle
elif command -v mdev >/dev/null; then
mdev -sf
fi
# 本脚本在首次进入新系统后运行
# 将 trans 阶段生成的网络配置中的网卡名(eth0) 改为正确的网卡名,也适用于以下情况
# 1. alpine 要运行此脚本,因为安装后的内核可能有 netboot 没有的驱动
# 2. dmit debian 普通内核(安装时)和云内核网卡名不一致
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=928923
# todo: 删除 cloud-init
# openeuler 需等待 udev 将网卡名从 eth0 改为 enp3s0
# openeuler 本脚本运行一秒后才有 enp3s0
# 用 systemd-analyze plot >a.svg 发现 sys-subsystem-net-devices-enp3s0.device 也是出现在 NetworkManager 之后
# 有些时候网卡名还会来回修改几次
# 因此需要等待网卡名稳定
# 不知道有没有用
if false; then
if command -v udevadm >/dev/null; then
# udevadm trigger
udevadm settle || true
elif command -v mdev >/dev/null; then
mdev -sf || true
fi
sleep 1
fi
has_eth=false # 是否检查到网卡
check_count=0 # 总检查次数
stable_count=0 # 网卡名稳定的次数
old_state=
while true; do
check_count=$((check_count + 1))
new_state=$(ip -o link | awk '$2 != "lo:"')
if [ -n "$new_state" ]; then
has_eth=true
fi
if $has_eth && [ "$old_state" = "$new_state" ]; then
stable_count=$((stable_count + 1))
else
stable_count=0
fi
old_state=$new_state
# 稳定 10 秒后退出循环
if $has_eth && [ "$stable_count" -ge 10 ]; then
break
fi
# 60 秒都没发现网卡则退出脚本
if ! $has_eth && [ "$check_count" -ge 60 ]; then
exit 1
fi
sleep 1
done
to_lower() {
tr '[:upper:]' '[:lower:]'
}
retry() {
local max_try=$1
shift
for i in $(seq "$max_try"); do
if "$@"; then
return
else
ret=$?
if [ "$i" -ge "$max_try" ]; then
return $ret
fi
sleep 1
fi
done
}
# openeuler 本脚本运行一秒后才有 enp3s0
# 用 systemd-analyze plot >a.svg 发现 sys-subsystem-net-devices-enp3s0.device 也是出现在 NetworkManager 之后
# 因此需要等待网卡出现
get_ethx_by_mac() {
retry 10 _get_ethx_by_mac "$@"
}
_get_ethx_by_mac() {
mac=$(echo "$1" | to_lower)
flag=$2