我使用启动选项biosdevname=1 net.ifnames=1
来获取一致、可预测的设备名称。我开始注意到一个问题,在某些情况下,网络设备名称不一致。例如,如果我进入 dracut 调试 shell 并查看 rdsosreport.txt 的输出,我会看到以下内容:
+ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: p3p1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a8:b4:56:50:97:08 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a8:b4:56:50:97:09 brd ff:ff:ff:ff:ff:ff
请注意,这里混合了一致 (p3p1) 和传统风格 (eth1) 命名。但是,如果我从 dracut 调试 shell 查看接口,我会看到以下内容:
initqueue:/run/initramfs# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: p3p1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a8:b4:56:50:97:08 brd ff:ff:ff:ff:ff:ff
3: p3p2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a8:b4:56:50:97:09 brd ff:ff:ff:ff:ff:ff
p3p1/p3p2 是正确的预期名称。出于某种原因,在 initrd 序列的早期,它们以混合格式出现。我的假设是这里发生了某种竞争,再多给它一点时间,它(udev?)就会稳定在正确的状态,但我不确定它到底在哪里。不幸的是,这给我们的一些自动服务器构建带来了问题,因为服务器在(安装后)首次启动后启动,并尝试在eth1
实际接口名称为时启动p3p2
。
我一直在研究 dracut 模块,试图找出问题所在,但还不能最终确定,因此正在寻求建议。
此外,这种行为并非总是发生。同一台服务器启动相同的映像有时会正常工作,而其他时候会出现这种混合命名行为。这也告诉我这是一场竞赛——有时比赛获胜,有时比赛失败。
答案1
在这里回答我自己的问题。事实证明,这个问题(部分)是我自己造成的。
我们无法控制的部分:
使用启动选项biosdevname=1
可能会在接口重命名阶段引起竞争。如果您可以不用它,那么简单地使用net.ifnames=1 biosdevname=0
可能是更好的选择,即使结果名称“不太美观”。
我们可以控制的部分:
我们的站点使用自定义修改的 dracut40network
模块。我们的版本所做的主要事情之一是探测 的内容以/sys/class/net/
寻找可自动添加到绑定的接口。(我们并不总是提前知道设备名称,这就是为什么模块需要一些逻辑来自己识别它们的原因)。上面提到的竞争可能会导致 中文件重命名的延迟/sys/class/net/
。解决方案很简单:在探测 之前向脚本添加 5 秒的休眠时间/sys/class/net/
。这给了biosdevname
(希望足够多的)时间来完成重命名设备。到目前为止,测试似乎一切正常。