使用 IPv6 的无盘启动

mor*_*itz 16 nfs ipv6 pxe initramfs

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

这意味着 nfsroot 必须通过 IPv6 挂载。我对此的研究表明 initramfs-tools (1.18.5-1ubuntu4.1) 不支持 IPv6。这意味着用于早期启动时的接口配置的 ipconfig 和 nfs 根的挂载程序都不支持 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
Run Code Online (Sandbox Code Playgroud)

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

/sbin/dhclient -6 -1 -cf /tmp/dhclient.conf -pf /tmp/dhclient6.eth0.pid -lf /tmp/dhclient6.eth0.leases eth0
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

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

nfsmount -o nolock ${roflag} ${NFSOPTS} ${NFSROOT} ${rootmnt}
Run Code Online (Sandbox Code Playgroud)

但这似乎不接受 IPv6 地址。

所以我把它改成:

mount ${roflag} -t nfs4 ${NFSROOT} ${rootmnt}
Run Code Online (Sandbox Code Playgroud)

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

接口配置似乎与 root 安装一样有效,但是当/sbin/init执行时(我认为),IPv6 再次被丢弃,因此系统冻结(因为它无法再访问 ubuntu 根)。

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

auto lo
iface lo inet loopback

iface eth0 inet manual
iface eth0 inet6 manual
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*uez 1

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

为什么要费劲用 NFS 启动呢?

您可以尝试使用 iscsi 启动(以只读模式允许多个映像连接),然后根据需要使用 iscsi 或 nfs (ipv4) 进行用户共享。您可以通过 ipxe 项目来实现这一点。

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

希望对您有帮助。