web-dev-qa-db-ja.com

IPv6を使用したディスクレスブート

私たちの仕事では、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を使用してインターフェイスを構成するときに何か間違ったことをしていますか?

16
moritz

多分それはあなたにとって話題ではありませんが、私はあなたの特定の問題はサービスを再考することによって回避できると思います:

なぜNFSでブートするのが面倒ですか?

Iscsi(イメージへの複数の接続を許可する読み取り専用モード)で起動してから、必要に応じてユーザー共有にiscsiまたはnfs(ipv4)を使用することができます。これはipxeプロジェクトで実現できます。

別の方法は、squashfs + tmpfsを使用し、システムの起動プロセス中に共有をあまり気にせず、ユーザー認証に応じて再マウントすることです(ただし、クライアント側のメモリ消費量が多くなります)。

あなたに役立つことを願っています。

1