我们在工作中使用大约 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,这样在系统启动过程中就不用过多担心共享,然后根据用户身份验证进行重新挂载(但这会在客户端消耗更多的内存)。
希望对您有帮助。