私たちの仕事では、Ubuntuを実行している約80台のディスクレスマシンを使用しています。 IPv6への移行を望んでいるので、今ではディスクレスシステムをIPV6で動作させようとしています。カーネルとinitramfsの送信は引き続きIPv4接続を介して行うことができますが、マシンが完全に起動したら、すべてのネットワーク接続がIPv6を介して行われるようにします。
これは、nfsrootをIPv6経由でマウントする必要があることを意味します。これに関する私の調査では、initramfs-tools(1.18.5-1ubuntu4.1)はIPv6をサポートしていないことが示されました。つまり、初期ブート時のインターフェース構成に使用されるipconfigも、nfsルートのマウントマウント手順もIPv6対応ではありません。
これを回避するために、initramfs(/etc/initramfs-tools/hooks/ipv6
)に2つのバイナリを追加しました。
#!/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ルートは次のコマンドin/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
を使用してインターフェイスを構成するときに何か間違ったことをしていますか?
多分それはあなたにとって話題ではありませんが、私はあなたの特定の問題はサービスを再考することによって回避できると思います:
なぜNFSでブートするのが面倒ですか?
Iscsi(イメージへの複数の接続を許可する読み取り専用モード)で起動してから、必要に応じてユーザー共有にiscsiまたはnfs(ipv4)を使用することができます。これはipxeプロジェクトで実現できます。
別の方法は、squashfs + tmpfsを使用し、システムの起動プロセス中に共有をあまり気にせず、ユーザー認証に応じて再マウントすることです(ただし、クライアント側のメモリ消費量が多くなります)。
あなたに役立つことを願っています。