CentOS 7(dracut)发现不一致的网络设备名称导致 kickstart 出现问题

CentOS 7(dracut)发现不一致的网络设备名称导致 kickstart 出现问题

我使用启动选项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(希望足够多的)时间来完成重命名设备。到目前为止,测试似乎一切正常。

相关内容