Preboot Execution Environment
関連記事
Wikipedia:ja:Preboot Execution Environment より:
- Preboot eXecution Environment (PXE、ピクシーと発音されることが多い) 仕様では、ネットワークから取得したソフトウェア アセンブリを PXE 対応クライアント上で起動する、標準化されたクライアント/サーバー環境について説明します。クライアント側では、PXE 対応のネットワーク インターフェイス コントローラー (NIC) のみが必要で、DHCP や TFTP などの業界標準のネットワーク プロトコルの少数のセットが使用されます。
このガイドでは、PXE を使って対象のマシンで PXE をサポートするオプション ROM でインストールメディアを起動します。既にサーバーをセットアップ済みでも上手く行くはずです。
準備
概要
#サーバーのセットアップ、クライアント側の#インストール、および必要な Arch Linux ファイルを理解するために、PXE ブートプロセスの概要を説明することは有用です。
クライアントは、特定の PXE オプションを含む DHCP サーバーを求めるパケットをブロードキャストすることから始まります。DHCP サーバーは、クライアントに割り当てられた IP アドレスなどのネットワーク情報で応答し、特定の ブートストラッププロトコル (BOOTP) パラメーターを使用して、TFTP サーバーのアドレス、ダウンロードする初期ネットワークブートプログラム (NBP) のパス、またはブート構成ファイル名などの追加情報を提供します。
NBP は TFTP を使用して PXE サーバーからクライアントに転送され、メモリにロードされて実行されます。カーネルと initramfs もこの方法で転送されます。
その後、ルートファイルシステムは HTTP、NFS、または NBD のいずれかのプロトコルを使用して転送されます。
インストールメディアからのブート
サーバーからクライアントに転送されるファイルを収集するために、ダウンロードページ から最新の公式インストールイメージを取得します。
次に、イメージをマウントします:
# mount --mkdir -o loop,ro archlinux-release_date-x86_64.iso /mnt/archiso
ここで、release_date
は ISO ファイル名のリリース日です。例:2022.10.01
。
ネットブートからのブート
Arch Linux netboot イメージを使用して、システムブート時に最新の Arch Linux リリースをオンザフライでダウンロードできます。構成に適したイメージをダウンロードします。
Pixiecore
pixiecore によって提供されるオールインワンソリューションです。
- pixiecore-gitAUR をインストールする
- root として
pixiecore quick arch --dhcp-no-bind
を実行する - PXE 経由でブートする
サーバーのセットアップ
ネットワークを設定して、pxelinux/カーネル/initramfs をロードし、最終的に root ファイルシステムをロードするために DHCP, TFTP, HTTP サーバーを設定する必要があります。
ネットワーク
有線の NIC を立ち上げて、適当なアドレスを割り当てて下さい。
# ip link set eth0 up # ip addr add 192.168.0.1/24 dev eth0
DHCP + TFTP
インストール先でネットワークを設定して PXE サーバーとクライアント間のファイルの転送を楽にするには DHCP と TFTP 両方のサーバーが必要です。dnsmasq がその両方とも備えており、とても簡単にセットアップできます。
dnsmasq の設定が必要です。dnsmasq#TFTP サーバー と dnsmasq#PXE サーバー のセットアップ方法についての指示を参照してください。
以下に一般的な設定手順を示します。tftp_root は Arch ISO がマウントされているディレクトリ (例:/mnt/archiso
) またはネットワークブートプログラムが配置されている場所です。
# /etc/dnsmasq.conf
# 指定されたインターフェースのみをリッスンする interface=eth0 # DNS サーバーとして機能しない port=0 # TFTP サーバーの設定 enable-tftp tftp-root=tftp_root # DHCP トランザクションに関する追加情報をログに記録する (デバッグ目的) log-dhcp
DHCP サーバーを有効にし、範囲内の IPv4 アドレスを提供するには、設定ファイルに以下のような行を追加します:
dhcp-range=192.168.0.50,192.168.0.150
または、ネットワーク上に既に DHCP サーバーが稼働しており、それと連携したい場合は、dnsmasq#プロキシ DHCP を参照してください。
異なるブートスタイルとインストールメディアをカバーする2つの例を以下に示します。
必要に応じて設定したら、dnsmasq.service
を開始します。
インストールメディアからの BIOS ブート
転送される初期ブートストラッププログラムのパスは、設定ファイルの dhcp-boot
オプションで定義されます。
dhcp-boot=/boot/syslinux/lpxelinux.0
設定ファイルパスのような特定の ブートストラップ プロトコル (BOOTP) パラメーター を送信するために、dhcp-option-force=flag,value
行が使用されます。
dhcp-option-force=209,archiso_pxe.cfg # このファイルは /mnt/archiso/boot/syslinux にあるかもしれません dhcp-option-force=210,
ネットブートからの UEFI ブート
アーキテクチャに応じてファイルを送信するには、ここでは UEFI スタイルのブート用のネットブートイメージを使用します:
pxe-service=BC_EFI, "Boot from network BC EFI", ipxe.efi pxe-service=X86-64_EFI, "Boot from network X86-64 EFI", ipxe.efi
ネットブートを使用する場合、Arch ISO に焦点を当てたサーバーセットアップセクションの残りの部分は適用されません。
# /etc/dnsmasq.conf
port=0 interface=eth0 bind-interfaces dhcp-range=192.168.0.50,192.168.0.150,12h dhcp-boot=/arch/boot/syslinux/lpxelinux.0 dhcp-option-force=209,boot/syslinux/archiso.cfg dhcp-option-force=210,/arch/ dhcp-option-force=66,192.168.0.1 enable-tftp tftp-root=/mnt/archiso
dnsmasq
の systemd サービスを起動してください。
archiso ルートファイルシステムの転送
archiso の archiso_pxe_http
、archiso_pxe_nfs
、および archiso_pxe_nbd
initcpio フックのおかげで、HTTP、NFS、または NBD を使用してブートすることが可能です。ブート時間は3つの方法すべてでほぼ同じですが、HTTP 方法では airootfs.sfs
のダウンロード状態をパーセンテージで確認できます。
HTTP
すべての代替手段の中で、darkhttpd が最も簡単に設定でき (かつ最も軽量です)。
次に、darkhttpd をドキュメントルートとして /mnt/archiso
を使用して起動します:
# darkhttpd /mnt/archiso
darkhttpd/1.8, copyright (c) 2003-2011 Emil Mikulic. listening on: http://0.0.0.0:80/
NFS
#準備 に従った場合、マウントされたインストールメディアのルートでエクスポートを行う NFS サーバー を設定する必要があります。これは /mnt/archiso
になります。サーバーを設定した後、/etc/exports
ファイルに次の行を追加します:
/etc/exports
/mnt/archiso 192.168.0.0/24(ro,no_subtree_check)
サーバーが既に稼働している場合は、exportfs -r -a -v
を使用してファイルシステムを再エクスポートします。
インストーラーのデフォルト設定では、NFS を /run/archiso/bootmnt/
に見つけることを期待していますので、ブートオプションを編集する必要があります。これを行うには、適切なブートメニューの選択肢で Tab を押し、archiso_nfs_srv
オプションを適切に編集します:
archiso_nfs_srv=${pxeserver}:/mnt/archiso
または、プロセス全体に /run/archiso/bootmnt
を使用することもできます。
カーネルがロードされた後、Arch ブートストラップイメージは NFS 経由でルートファイルシステムをブートホストにコピーします。これには少し時間がかかることがあります。これが完了すると、システムが動作しているはずです。
NBD
/etc/nbd-server/config
[generic] [archiso] readonly = true exportname = /srv/archlinux-release_date-x86_64.iso
ここで、release_date
は ISO ファイル名のリリース日です。例:2022.10.01
。
nbd.service
を開始します。
既存の PXE サーバー
既存の PXE サーバーで PXELINUX システムが設定されている場合 (例:DHCP と TFTP の組み合わせ)、以下のメニュー項目を /tftpboot/pxelinux.cfg/default
ファイルに追加して、お好みの方法で Arch をブートすることができます。
PXELINUX は HTTP をサポートしているため、ブートローダーのみを TFTP で転送し、その他すべては HTTP を使用できます。例:
LABEL archlinux MENU LABEL Arch Linux x86_64 LINUX http://httpserver/path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz-linux INITRD http://httpserver/path/to/extracted/Arch/ISO/arch/boot/x86_64/initramfs-linux.img APPEND archisobasedir=arch archiso_http_srv=http://httpserver/path/to/extracted/Arch/ISO/ cms_verify=y SYSAPPEND 3 TEXT HELP Arch Linux 2022.10.01 x86_64 ENDTEXT
NFS および NBD では、カーネルと initramfs を TFTP からダウンロードする必要があります。例:NFS の場合:
LABEL archlinux MENU LABEL Arch Linux x86_64 LINUX /path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz-linux INITRD /path/to/extracted/Arch/ISO/arch/boot/x86_64/initramfs-linux.img APPEND archisobasedir=arch archiso_nfs_srv=pxeserver:/run/archiso/bootmnt cms_verify=y SYSAPPEND 3 TEXT HELP Arch Linux 2022.10.01 x86_64 ENDTEXT
LINUX
と INITRD
のパスは TFTP ルートに対する相対パスです。NBD の場合は、上記の例で archiso_nfs_srv
を archiso_nbd_srv
に置き換えます。使用例は Arch Linux ISO にある boot/syslinux/archiso_pxe.cfg
ファイルを参照してください。
どの方法を選択するにしても、カーネルにネットワークインターフェースを起動させてからインストールメディアをネットワーク越しにマウントするよう指示するために、ip=
パラメーターを渡す必要があります。クライアント側に複数の有線インターフェースがある場合や、ブートされた archiso 内で resolv.conf
を既に設定済みにしたい場合は、BOOTIF=
を渡す必要があります。これらのパラメーターを自動的に渡すには、sysappend マスク 3
(これは 1
+2
です) を使用できます。利用可能なブートパラメーターについては、README.bootparams を参照してください。
インストール
クライアントに PXE ブートを行うように伝える方法を知る必要があります。通常のポストメッセージに加えて、大抵は画面の端に PXE ブートをするにはどのキーを押せばいいのかのヒントが表示されます。IBM x3650 の場合 F12
でブートメニューが表示され、一番最初のオプションが Network です。Dell PE 1950/2950 では F12
を押すと直接 PXE ブートが開始されます。
起動
PXE サーバーで journald を確認することで、PXE のブートプロセスの初期段階で実際に何が起こっているのか情報を得ることができます:
# journalctl -u dnsmasq -f
dnsmasq-dhcp[2544]: DHCPDISCOVER(eth1) 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPOFFER(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPREQUEST(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPACK(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/pxelinux.0 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/whichsys.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_choose.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/ifcpu64.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_both_inc.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_head.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe32.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe64.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_tail.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/vesamenu.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/splash.png to 192.168.0.110
TFTP で pxelinux.0
と archiso.cfg
をロードした後、(上手く行けば) syslinux のブートメニューが表示され複数のオプションが提示されます。Boot Arch Linux (x86_64) (HTTP) を選択してください。
次にカーネルと initramfs が、また TFTP によって転送されます:
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/vmlinuz to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/archiso.img to 192.168.0.110
順調に行けば、PXE ターゲットから来る darkhttpd の活動を見ることができます。この段階でカーネルは PXE のターゲットマシンでロードされ、そして init に移ります:
1348347586 192.168.0.110 "GET /arch/aitab" 200 678 "" "curl/7.27.0" 1348347587 192.168.0.110 "GET /arch/x86_64/root-image.fs.sfs" 200 107860206 "" "curl/7.27.0" 1348347588 192.168.0.110 "GET /arch/x86_64/usr-lib-modules.fs.sfs" 200 36819181 "" "curl/7.27.0" 1348347588 192.168.0.110 "GET /arch/any/usr-share.fs.sfs" 200 63693037 "" "curl/7.27.0"
HTTP で root ファイルシステムがダウンロードされた後、通常のライブ環境の zsh プロンプトが現れます。
起動後
全てのトラフィックを PXE サーバーに通したいのでなければ (正しく設定をしていないと動作しません)、dnsmasq.service
を停止してインストール先で新しいリースを取得するのがネットワークレイアウトに適当でしょう。
darkhttpd も終了させてかまいません。ターゲットは既に root ファイルシステムをダウンロードしているため、もう必要ありません。ついでに、インストールイメージをアンマウントすることもできます:
# umount /mnt/archiso
ここまで来たら、後は公式のインストールガイドに従って下さい。
メモリの少ないシステム
copytoram
initramfs オプションを使用して、ルートファイルシステム全体を初期ブート時に RAM にコピーするかどうかを制御できます。
このオプションはそのままにしておくことを強くお勧めしますが、どうしても必要な場合(物理メモリが約256MB未満のシステム)にのみ無効にする必要があります。これを行う場合は、カーネル行に copytoram=n
を追加します。
PXE クライアントとのインターネット共有
PXE クライアントのネットワークがプライベート(例えば、192.168.1.0/24)の場合、インターネットにアクセスできるようにするためには(例えば、パッケージのインストールのために)、適切にマスカレード/ソース NAT を設定する必要があります。PXE サーバーはインターネットに接続された別の NIC を持っている必要があります。以下のコマンドを使用して、クライアントにインターネットを通過させることができます:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
このルールを再起動後も持続させるために、次のコマンドを実行します:
iptables-save -f /etc/iptables/iptables.rules
そして iptables.service
を有効にします。
詳細については、シンプルなステートフルファイアウォール#NAT ゲートウェイの設定 および インターネット共有#NAT の有効化 を参照してください。
トラブルシューティング
DHCP インターフェースリネームバグ
FS#36749 により、デフォルトの 予測可能なネットワークインターフェース名の変更 が失敗し、それにより DHCP クライアントが失敗します。この問題を回避するには、カーネルブートパラメータ net.ifnames=0
を追加して予測可能なインターフェース名を無効にします。
仮想マシンではブートできるが実マシンではできない
構成をテストするために VirtualBox を使用している場合、仮想マシンが以下のメッセージで停止することがあります:
Probing EDD (edd=off to disable)... ok
一方、実マシンでの PXE ブートは正常に動作します。この問題は、クライアントマシンに複数の CPU コアを設定し、そのタイプを Other、バージョンを Other/Unknown (64 bit) に設定しているためかもしれません。そのため、VirtualBox はデフォルトでどのパラバーチャライゼーションインターフェースを使用するか分かりません。
カーネルパラメータ に loglevel=7
を追加すると、実際にどこで停止したかを見ることができます:
[ 0.063697] smp: Bringing up secondary CPUs... [ 0.103768] x86: Booting SMP configuration:
これを解決するには、1 つの CPU コアを使用するか、Machine > Settings > System > Acceleration に移動して、Minimal、Hyper-V、または KVM のいずれかのパラバーチャライゼーションインターフェースを設定します。