Skip to content

Commit e60a8d0

Browse files
committed
core: 修复 azure 开启加速网络时 NetworkManager 无法获取 IP
fixes #499
1 parent 2a561f0 commit e60a8d0

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

fix-eth-name.sh

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,39 @@ retry() {
4848
# 用 systemd-analyze plot >a.svg 发现 sys-subsystem-net-devices-enp3s0.device 也是出现在 NetworkManager 之后
4949
# 因此需要等待网卡出现
5050
get_ethx_by_mac() {
51-
mac=$(echo "$1" | to_lower)
52-
retry 10 _get_ethx_by_mac "$mac"
51+
retry 10 _get_ethx_by_mac "$@"
5352
}
5453

5554
_get_ethx_by_mac() {
55+
mac=$(echo "$1" | to_lower)
56+
57+
flag=$2
58+
if [ -z "$flag" ]; then
59+
flag=master
60+
fi
61+
5662
if true; then
57-
# 过滤 azure vf (带 master ethx)
58-
ip -o link | grep -i "$mac" | grep -v master | awk '{print $2}' | cut -d: -f1 | grep .
59-
return
63+
if [ "$flag" = master ]; then
64+
# master
65+
# 过滤 azure vf (带 master ethx)
66+
ip -o link | grep -i "$mac" | grep -v master | awk '{print $2}' | cut -d: -f1 | grep .
67+
else
68+
# slave
69+
# 带 master ethx
70+
ip -o link | grep -i "$mac" | grep -w master | awk '{print $2}' | cut -d: -f1 | grep .
71+
fi
6072
else
6173
for i in $(cd /sys/class/net && echo *); do
6274
if [ "$(cat "/sys/class/net/$i/address")" = "$mac" ]; then
63-
echo "$i"
64-
return
75+
if [ $(($(cat "/sys/class/net/$i/flags") & 0x800)) -ne 0 ]; then
76+
fact_flag=slave
77+
else
78+
fact_flag=master
79+
fi
80+
if [ "$flag" = "$fact_flag" ]; then
81+
echo "$i"
82+
return
83+
fi
6584
fi
6685
done
6786
return 1
@@ -138,6 +157,23 @@ fix_network_manager() {
138157

139158
# 更改文件名
140159
mv "$file" "$proper_file"
160+
161+
# NM 不会自动忽略 Azure 的 slave 网卡,需手动设置
162+
# azure 文档中的方法不够通用,只适合 azure
163+
# https://learn.microsoft.com/zh-cn/azure/virtual-network/accelerated-networking-overview
164+
165+
# 我们采用红帽的方法
166+
# https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/configuring-networkmanager-to-ignore-certain-devices_configuring-and-managing-networking
167+
if slave_ethx=$(get_ethx_by_mac "$mac" slave); then
168+
cat >"/etc/NetworkManager/conf.d/99-$slave_ethx-unmanaged.conf" <<EOF
169+
[device-$slave_ethx-unmanaged]
170+
match-device=interface-name:$slave_ethx
171+
managed=0
172+
EOF
173+
fi
174+
175+
# 也可以设置 unmanaged-devices, 但是官方文档不推荐
176+
# https://networkmanager.pages.freedesktop.org/NetworkManager/NetworkManager/NetworkManager.conf.html#:~:text=may%20be%20a-,better%20choice,-.
141177
done
142178
}
143179

0 commit comments

Comments
 (0)