![在哪个 dracut 挂钩期间,PXE 客户端可以使用 udev 规则重命名可预测接口名称?](https://linux22.com/image/777503/%E5%9C%A8%E5%93%AA%E4%B8%AA%20dracut%20%E6%8C%82%E9%92%A9%E6%9C%9F%E9%97%B4%EF%BC%8CPXE%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20udev%20%E8%A7%84%E5%88%99%E9%87%8D%E5%91%BD%E5%90%8D%E5%8F%AF%E9%A2%84%E6%B5%8B%E6%8E%A5%E5%8F%A3%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
tl;dr:在 PXE 客户端上加载 initramfs(执行 dracut 模块)时,我需要重命名内核指定的(可预测的)接口名称(目前它们是不可预测的 ethX 名称)。这样,PXE 客户端将始终从可预测名称的接口启动。目前,我正在使用dmesg
dracut 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 启动。这遵循以下顺序:
- SBC 拉取 initramfs 并加载它。
- initramfs 执行 dracut 模块,读取 SBC 的硬件信息(在 dracut hook“cmdline”期间)。
- SBC 根据其硬件拉下特定的根文件系统。
不幸的是,旧的 ethX(不可预测的)接口名称有时会导致 SBC 通过错误的网络接口拉下根文件系统。
我的计划是从用于 PXE 启动的内核命令行中删除net.ifnames=0
和biosdevname=0
(步骤 1)。然后在内核分配可预测的名称后,我想扩展 dracut 模块以添加 udev 规则以将它们重命名为旧名称。我希望当 dracut 触发 udev 时,SBC 将始终通过正确的接口拉取根文件系统。
答案1
最终我们保留了net.ifnames=0
,但我们设置了biosdevname=1
。在 dracut 安装期间,我们在sed
网络接口相关脚本(安装过程中的下一步)中添加了一个模块,以绕过逻辑net.ifnames=0
,而只使用biosdevname
。
虽然这确实让人感觉有些不方便,但是它确实完成了这个系统的任务。