IPXEブートサーバーとして完全に正常に機能するシステムがあります。現在、NFSファイルシステムではなく、SquashFSファイルをルートファイルシステムとして使用するようにしています。
現在のシステムでは、iPXE構成を次のように使用しており(関連する行を示しています)、正常に機能しています。
:retry
kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot ro ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0 || goto retry
initrd http://${next-server}/installdcos/ubuntu_os/initrd.gz || goto retry
boot || goto retry
ここで、起動したシステムの代わりに、ルートファイルシステムとして/installdcos/ubuntu_os/nfsroot
を使用し、ルートファイルシステムとして単一のSquashFSを使用するようにします(つまり、システムはそれをマウントしてからルートファイルシステムとして使用する必要があります)。
このために、最初にnfsroot
を使用してmksquashfs
ディレクトリの内容を保持するファイルubuntu_os.squashfs
を作成しました。次に、このubuntu_os.squashfs
ファイルを/installdcos/ubuntu_os/nfsroot
ディレクトリに配置しました。
さて、私のiPXE構成では、次のように言いたいと思います。ネットワーク経由でubuntu_os.squashfs
を取得し、SquashFSファイルシステムとしてマウントし、ルートファイルシステムとして使用してください(NFSを再度経由する必要がないようにするため)。ルートファイルシステムに存在するコマンドを呼び出すため)。
しかし、構成のkernel行に対して次の変更を試みると:
kernel http://${next-server}/installdcos/ubuntu_os/vmlinuz root=/dev/nfs nfsroot=${next-server}:/installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs ro rootfstype=squashfs ip=dhcp BOOTIF=%(mac)s console=ttyS0,38400n8 console=ttyS1,9600n8 console=tty0 || goto retry
マシンからiPXEブートを実行すると、iPXEブートプロセスが開始され、いくつかの行を印刷した後、次のエラーでスタックします。
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
mount: Not a directory
done
エラーメッセージは理にかなっています、確かに、/installdcos/ubuntu_os/nfsroot/ubuntu_os.squashfs
はディレクトリではありません。
では、そのカーネル構成行に対してどのようなパラメーターと値の組み合わせを作成する必要がありますか?
http://www.tldp.org/HOWTO/BootPrompt-HOWTO-3.html や https://www.kernel.org/doc/)などのドキュメントを確認しました。 Documentation/filenames/nfs/nfsroot.txt しかし、カーネルに渡す必要のある魔法のインカンテーションを理解できませんでした(そして、私が見つけた残りのSquashFSブートチュートリアルでは、ブート操作がPXEではなくディスクから行われると考えています。またはLiveCDを実行しますが、これは私の場合とまったく同じではありません)。
何が起こっているのかを理解するには、LinuxPXEがどのように起動するかを理解する必要があります。
vmlinuz
が転送されますinitrd.gz
が転送されますinit
スクリプトを開始しますinitrdは、「実際の」OS(この場合はubuntu_os.squashfs
内に含まれる)に接続(NFS)または取得(HTTP/CIFS)し、マウントして最後に「chrooting」するための最小限の機能を含む超最小限のLinuxシステムです。それに。
PXE対応のinit
スクリプトは、カーネル変数の解析、ネットサービスの開始、NFS、HTTP、CIFSなどの処理を担当します。ほとんどの場合、特定のinitrd.gz
は処理できません。上記のすべてのプロトコルを使用して、initrd.gz
を「カスタマイズ」するか、必要に応じて不足している機能を提供する「補完的な」initrdを作成する必要があります。
あなたの場合、init
スクリプトは、ファイルではなくNFSディレクトリをマウントする必要があると考えています。次に、NFSを使用する場合は、ubuntu_os.squashfs
が配置されているディレクトリをマウントし、次にubuntu_os.squashfs
ファイルをマウントする必要があります。もちろん、これはinit
(および/またはそれに関連するコンポーネント)にパッチを適用することを意味します
CIFS共有でubuntu_os.squashfs
を提供してもかまわない場合は、Ubuntuライブディストリビューションを起動するPXEに対して Serva が何をするかを確認できます。 CIFSブートのすべてのパラメーターが表示されます(私はServa開発に関連しています)
つまり、Ubuntu LTS14.04デスクトップライブ
[PXESERVA_MENU_ENTRY]
asset = Ubuntu LTS 14.04 Desktop Live
platform = AMD64
kernel = /NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append = showmounts toram root=/dev/cifs initrd=/NWA_PXE/$HEAD_DIR$/casper/initrd.lz,/NWA_PXE/$HEAD_DIR$/casper/INITRD_N11.GZ boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,ro ip=dhcp ro