如何在 Ubuntu 16.04 LTS 中通过 PXE 启动设置用于根 NFS 挂载的以太网网络绑定

如何在 Ubuntu 16.04 LTS 中通过 PXE 启动设置用于根 NFS 挂载的以太网网络绑定

对于我的个人微型集群,我成功设置了 Ubuntu 服务器 16.04 LTS PXE 网络启动系统,但是为了利用我拥有的 4 端口 NIC,我想要设置以太网绑定。

我没有找到与 Linux 内核版本 4.4.0-21-generic 相关的资源,旧的解决方案无效。

答案1

这是一个自定义的解决方案,实际上是一种黑客攻击,我已经设法让它发挥作用。

在我的 NFS 中,PXE 系统应该从中启动,确保/etc/initramfs-tools/initramfs.conf没有DEVICE设置,并且modules等于most

从那里,您将要在处添加一个文件/etc/initramfs-tools/scripts/nfs-premount/00_bond,确保它具有0755权限,即它是可执行的。

00_bond内容:

#!/bin/sh
ip link add bond0 type bond mode 802.3ad
echo "+eth0" > /sys/class/net/bond0/bonding/slaves
echo "+eth1" > /sys/class/net/bond0/bonding/slaves
echo "+eth2" > /sys/class/net/bond0/bonding/slaves
modprobe af_packet
ipconfig -c dhcp -d bond0

此脚本在 initramfs 中创建一个绑定,手动添加从属设备,因为我们没有工具来执行此操作(可以将它们添加到 initramfs,但没有必要)。根据需要添加/删除/重命名接口。

最后,我们加载af_packet内核模块,并在我们的绑定接口上初始化 DHCP。ipconfig是一个由 klibc 提供的程序,不要与混淆ifconfig

我们的 initramfs 的最后一个配置位于/etc/initramfs-tools/modules,我们想在这里将模块添加到我们的 initramfs 中。只需在文件末尾bonding添加一行,默认情况下它通常为空。bonding

您可以通过运行 来更新 initramfs(确保您已 chroot 或在另一个启动到 NFS 分区的系统中)update-initramfs -u。完成后,请确保从 TFTP 服务器更新对它的任何使用,以便您的新 initramfs 可以远程启动。

在 DHCP 中,由于我们绕过了网络接口的 DHCP 配置(假设是 pxelinux),并且依赖于ethXNIC 名称格式,因此我们想要更改一些内核启动参数。您可以在脚本中更改它们,但是,我发现使用旧的命名方案更可靠,因为在这种情况下,如果 NIC 发生变化,最好使用临时替换命名 —— 这是我以前遇到过的问题。

这些是我在 PXELinux 配置中输入的针对版本 4.4.0-21-generic 的内核启动参数:

APPEND root=/dev/nfs initrd=initrd.img-4.4.0-21-generic nfsroot=192.168.0.1:/nfs net.ifnames=0 biosdevname=0 ip=none rw

net.ifnames=0 biosdevname=0禁用新的 NIC 命名方案。

ip=none禁用任何默认网络配置。我没有遇到任何问题ip=dhcp,但这是不必要的,因为当它看到已经存在的网络时,它会终止。

其余的是标准的 NFS 挂载参数。

完成所有这些操作后,您的 NFS 服务器即可运行、可访问,并且正确安装了 Ubuntu,DHCP 服务器已准备就绪,然后您就可以从 PXE 启动到具有以太网绑定 NFS 根系统的 Ubuntu。我选择的模式802.3ad提供速度和断开连接的冗余,而其他可用模式可以提供更强的冗余以换取速度。这对于此用例特别有用,因为当我们突然断开连接时,这类似于在操作中途拉出根驱动器。

应该注意的是,标准 Ubuntu 网络尚未配置(即/etc/network/interfaces),因此,在设置之前,ifup 和 ifdown 等工具可能无法工作。当然,如果您要运行这样的命令,您应该准备好关闭电源,除非您以非 root 身份启动具有 NFS 的持久 ramdisk,以保持最低限度的功能。

答案2

这里有一个项目在 GitHub 上它集成了 Ubuntu/Debian 节点的解决方案。

相关内容