Preboot Execution Environment

提供: ArchWiki
2024年7月21日 (日) 20:02時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎DHCP + TFTP: 更新)
ナビゲーションに移動 検索に移動

関連記事

Wikipedia:ja:Preboot Execution Environment より:

Preboot eXecution Environment (PXE, 又の名を Pre-Execution Environment, "ピクシー"とも呼ばれる) は (ハードディスクなどの) データストレージデバイスやインストールされたオペレーティングシステムから独立してネットワークインターフェイスを使ってコンピュータを起動する環境。

このガイドでは、PXE を使って対象のマシンで PXE をサポートするオプション ROM でインストールメディアを起動します。既にサーバーをセットアップ済みでも上手く行くはずです。

準備

概要

#サーバーのセットアップ、クライアント側の#インストール、および必要な Arch Linux ファイルを理解するために、PXE ブートプロセスの概要を説明することは有用です。

クライアントは、特定の PXE オプションを含む DHCP サーバーを求めるパケットをブロードキャストすることから始まります。DHCP サーバーは、クライアントに割り当てられた IP アドレスなどのネットワーク情報で応答し、特定の ブートストラッププロトコル (BOOTP) パラメーターを使用して、TFTP サーバーのアドレス、ダウンロードする初期ネットワークブートプログラム (NBP) のパス、またはブート構成ファイル名などの追加情報を提供します。

NBP は TFTP を使用して PXE サーバーからクライアントに転送され、メモリにロードされて実行されます。カーネルと initramfs もこの方法で転送されます。

その後、ルートファイルシステムは HTTP、NFS、または NBD のいずれかのプロトコルを使用して転送されます。

警告: PXELINUX には、受信したもの (TFTP または HTTP 経由) が予期されたものであるかどうかを検証するためのセキュリティメカニズムはサポートされていません。詳細は RFC 5071 セクション 8 を参照してください。代替手段として、iPXE バイナリに埋め込まれたコード署名証明書に対して署名を検証できる Netboot イメージを使用することができます。Netboot イメージはローカルシステムに配置する必要があることに注意してください。

インストールメディアからのブート

サーバーからクライアントに転送されるファイルを収集するために、ダウンロードページ から最新の公式インストールイメージを取得します。

次に、イメージをマウントします:

# mount --mkdir -o loop,ro archlinux-release_date-x86_64.iso /mnt/archiso

ここで、release_date は ISO ファイル名のリリース日です。例:2022.10.01

ノート: Arch ISO は現在、BIOS スタイルの PXE ブートのみをサポートしています。詳細は テンプレート:Issue を参照してください。

ネットブートからのブート

Arch Linux netboot イメージを使用して、システムブート時に最新の Arch Linux リリースをオンザフライでダウンロードできます。構成に適したイメージをダウンロードします。

ノート: Arch netboot は BIOSUEFI の両方のブートをサポートしています。

Pixiecore

pixiecore によって提供されるオールインワンソリューションです。

  1. pixiecore-gitAUR をインストールする
  2. root として pixiecore quick arch --dhcp-no-bind を実行する
  3. 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 の設定が必要です。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

dnsmasqsystemd サービスを起動してください。

HTTP

archiso における最近の変更のおかげで、現在は HTTP (archiso_pxe_http initcpio フック) または NFS (archiso_pxe_nfs initcpio フック) から起動することが可能になっています。いろいろある中でも、darkhttpd をセットアップするのが最も一般的 (そして最も軽量) です。

まず、公式リポジトリから darkhttpdインストールしてください。

そして /mnt/archiso をドキュメントルートとして darkhttpd を起動します:

# darkhttpd /mnt/archiso
darkhttpd/1.8, copyright (c) 2003-2011 Emil Mikulic.
listening on: http://0.0.0.0:80/

サーバーはポート 80 で動作させる必要があります。root 権限を使わないで darkhttpd を起動した場合、デフォルトではポート 8080 が使用されます。クライアントはポート 80 にアクセスしようとして起動に失敗します。

インストール

クライアントに 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.0archiso.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停止してインストール先で新しいリースを取得するのがネットワークレイアウトに適当でしょう。

# systemctl stop dnsmasq.service

darkhttpd も終了させてかまいません。ターゲットは既に root ファイルシステムをダウンロードしているため、もう必要ありません。ついでに、インストールイメージをアンマウントすることもできます:

# umount /mnt/archiso

ここまで来たら、後は公式のインストールガイドに従って下さい。

別の方法

syslinux のメニューでわかるように、別の方法もいくつか存在します:

NFS

NFS サーバーを設定してマウントしたインストールメディアの root (このガイドの先のセクション通りしているなら /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 を使って root ファイルシステムをブートホストにコピーします。これにはしばらく時間がかかります。コピーが完了したら、システムが使えるようになります。

NBD

nbd をインストールして設定:

# vim /etc/nbd-server/config
[generic]
[archiso]
    readonly = true
    exportname = /srv/archlinux-2017.04.01-x86_64.iso

その後 nbd.service起動してください。

既存の PXE サーバー

Syslinux をセットアップした既存の PXE サーバーが存在する場合 (例: BIND+DHCPd+TFTPd の組み合わせ)、以下のメニューアイテムを pxelinux.cfg ファイルに追加することで推奨されている方法で Arch を起動できます:

# vim /srv/tftp/arch.menu
LABEL 2
        MENU LABEL Arch Linux x86_64
        LINUX /path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz
        INITRD /path/to/extracted/Arch/ISO/arch/boot/intel_ucode.img,/path/to/extracted/Arch/ISO/arch/boot/x86_64/archiso.img
        APPEND archisobasedir=arch archiso_nfs_srv=${nfsserver}:/path/to/extracted/Arch/ISO/ ip=:::::eth0:dhcp
        SYSAPPEND 3
        TEXT HELP
        Arch Linux 2016.03 x86_64
        ENDTEXT

archiso_nfs_srv を上に記載しているサポートされている方法 (HTTP や NBD) に置き換えることもできます。ネットワークを経由してインストールメディアをマウントする前にカーネルによってネットワークインターフェイスが立ち上げられるように ip= の追加が必要です。

DHCP インターフェイスの再命名バグ

2015年11月現在、デフォルトの 予想可能なネットワークインターフェイスの名前変更 が失敗して dhcp クライアントが使えなくなるバグが存在します。詳しくは FS#36749 を見てください。カーネルブートパラメータに net.ifnames=0 を追加することで解決できます。

低メモリ環境

copytoram initramfs オプションを使うことでブートの初期段階で root ファイルシステムを ram にそっくりそのままコピーするべきかコントロールすることができます。

このオプションはそのままにしておいて、(物理メモリが 256MB 以下のシステムで) どうしても必要なときにだけ無効にすることを強く推奨します。copytoram=n を kernel 行に追加することで無効にできます。

ノート: マウントされたリモートファイルシステムから squashfs のループマウントを必要とするので、copytoram=narchiso_pxe_http は互いに相容れません。