web-dev-qa-db-ja.com

iPXEブートを実行するときに、SquashFSファイルをルートファイルシステムにするにはどうすればよいですか?

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.htmlhttps://www.kernel.org/doc/)などのドキュメントを確認しました。 Documentation/filenames/nfs/nfsroot.txt しかし、カーネルに渡す必要のある魔法のインカンテーションを理解できませんでした(そして、私が見つけた残りのSquashFSブートチュートリアルでは、ブート操作がPXEではなくディスクから行われると考えています。またはLiveCDを実行しますが、これは私の場合とまったく同じではありません)。

3
Emre Sevinç

何が起こっているのかを理解するには、LinuxPXEがどのように起動するかを理解する必要があります。

  1. カーネルvmlinuzが転送されます
  2. Initrd initrd.gzが転送されます
  3. カーネルはinitrdをマウントし、その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
2
Pat