在哪个 dracut 挂钩期间,PXE 客户端可以使用 udev 规则重命名可预测接口名称?

在哪个 dracut 挂钩期间,PXE 客户端可以使用 udev 规则重命名可预测接口名称?

tl;dr:在 PXE 客户端上加载 initramfs(执行 dracut 模块)时,我需要重命名内核指定的(可预测的)接口名称(目前它们是不可预测的 ethX 名称)。这样,PXE 客户端将始终从可预测名称的接口启动。目前,我正在使用dmesgdracut cmdline 挂钩读取硬件信息。我可以cat在此处添加 udev 规则/usr/lib/udev/rules.d/,以便系统可以在 dracut 稍后触发 udev 时重命名接口吗?

基本上我在 dracut cmdline 钩子中有这个:

# First read hardware provided
if dmesg | grep -q "SOME_BOARD_NAME"; then
    root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_ROOTFS.sqsh/')
    # Additionally, some udev rules are needed specific to this board.
#    mkdir -p /etc/udev/rules.d
#    echo "install these boards' rules!\n"
#    echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.0/0000:07:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.1/net/*", NAME="eth2"
#EOF
elif dmesg | grep -q "SOME_OTHER_BOARD_NAME"; then
    root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
    echo "install other board-specific rules!\n"
#    mkdir -p /etc/udev/rules.d
#    echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.5/0000:09:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.1/net/*", NAME="eth2"
#EOF
else
    warn "Did not detect either board - defaulting to SOME_OTHER_ROOTFS.sqsh"
    root=$(echo "$root" | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
fi

更多信息:我和我的团队有一台单板计算机,它从外部服务器进行 PXE 启动。这遵循以下顺序:

  1. SBC 拉取 initramfs 并加载它。
  2. initramfs 执行 dracut 模块,读取 SBC 的硬件信息(在 dracut hook“cmdline”期间)。
  3. SBC 根据其硬件拉下特定的根文件系统。

不幸的是,旧的 ethX(不可预测的)接口名称有时会导致 SBC 通过错误的网络接口拉下根文件系统。

我的计划是从用于 PXE 启动的内核命令行中删除net.ifnames=0biosdevname=0(步骤 1)。然后在内核分配可预测的名称后,我想扩展 dracut 模块以添加 udev 规则以将它们重命名为旧名称。我希望当 dracut 触发 udev 时,SBC 将始终通过正确的接口拉取根文件系统。

答案1

最终我们保留了net.ifnames=0,但我们设置了biosdevname=1。在 dracut 安装期间,我们在sed网络接口相关脚本(安装过程中的下一步)中添加了一个模块,以绕过逻辑net.ifnames=0,而只使用biosdevname

虽然这确实让人感觉有些不方便,但是它确实完成了这个系统的任务。

相关内容