使用 IPv6 的无盘启动

使用 IPv6 的无盘启动

我们在工作中使用大约 80 台运行 Ubuntu 的无盘机器。我们想要过渡到 IPv6,所以现在我正尝试让我们的无盘系统使用 IPV6。内核和 initramfs 的传输仍然可以通过 IPv4 连接进行,但一旦机器完全启动,我希望所有网络连接都通过 IPv6 进行。

这意味着 nfsroot 必须通过 IPv6 挂载。我对此的研究表明,initramfs-tools (1.18.5-1ubuntu4.1) 不支持 IPv6。这意味着用于在早期启动时进行接口配置的 ipconfig 和 nfs root 的挂载过程都不支持 IPv6。

为了解决这个问题,我向 initramfs ( /etc/initramfs-tools/hooks/ipv6) 添加了两个二进制文件:

#!/bin/bash 
. /usr/share/initramfs-tools/hook-functions
copy_exec /sbin/dhclient /sbin
copy_exec /sbin/mount.nfs4 /sbin

我使用这些来(a)在启动初期请求 DHCPv6

/sbin/dhclient -6 -1 -cf /tmp/dhclient.conf -pf /tmp/dhclient6.eth0.pid -lf /tmp/dhclient6.eth0.leases eth0

并且 (b) 通过执行以下命令,使用我获得的地址配置接口:

ipv6=$(cat /tmp/dhclient6.eth0.leases | grep iaaddr | egrep -o "([a-f0-9]{1,4}:){3}([a-f0-9]{0,4}:){0,4}[a-f0-9]{1,4}")
ip -6 addr add $ipv6/112 dev eth0

通常使用以下命令挂载 nfs 根目录/usr/share/initramfs-tools/scripts/nfs

nfsmount -o nolock ${roflag} ${NFSOPTS} ${NFSROOT} ${rootmnt}

但这似乎不接受 IPv6 地址。

所以我把它改成了:

mount ${roflag} -t nfs4 ${NFSROOT} ${rootmnt}

$NFSROOT在这种情况下是[2001:4ca0:2218:1::1:2]:/lb/diskless/rootfs/ubuntu_1204_ipv6

接口配置似乎与根挂载一样工作,但是当/sbin/init执行时(我认为),IPv6 再次被删除,因此系统冻结(因为它无法再访问 ubuntu 根)。

/etc/network/interfaces文件如下所示:

auto lo
iface lo inet loopback

iface eth0 inet manual
iface eth0 inet6 manual

有没有办法保留 initramfs 中的接口配置?或者我在配置接口时做错了什么ip

答案1

也许这对您来说不是主题,但我认为可以通过重新考虑服务来避免您的具体问题:

为什么要使用 NFS 启动?

您可以尝试使用 iscsi 进行引导(在只读模式下允许与映像建立多个连接),然后根据需要使用 iscsi 或 nfs (ipv4) 进行用户共享。您可以使用 ipxe 项目实现这一点。

另一种方法是使用 squashfs+tmpfs,这样在系统启动过程中就不用过多担心共享,然后根据用户身份验证进行重新挂载(但这会在客户端消耗更多的内存)。

希望对您有帮助。

相关内容