PXEを使ってPCもディスクレスにしよう |
YAMAMORI Takenori ●yamamori |
ここでは,PXE(Preboot eXecution Environment)対応のネットワークカードを用い, Linux/FreeBSD/DOSなどのOSをディスクレスブートするための方法を解説します.
ハードディスクもフロッピーディスクもCD-ROMも使わずに ネットワークのみからブートしてOSが立ち上がるディスクレスブートは, 本来はUNIXワークステーションが得意とするところです. SPARCなどのUNIXワークステーションのROMモニタには, RARP/TFTPといった,ネットワークブートの機能が標準で備わっています. さらにUNIX系のOSであれは,rootファイルシステムをNFS上に取ることができるため, ローカルディスクが一切必要なくなり,これでディスクレスマシンが実現できます.
一方PCでは,ディスクレスブートはあまり一般的ではありません. しかし,PXEを使えばPCもディスクレスブートできます.(※注) そこでこのページでは,LinuxやFreeBSD,さらにDOSなどのOSを, PXEを用いてディスクレスブートする方法について説明します.
なお,Linux/FreeBSDに限らず,PC UNIXのネットワークインストールなら 行なったことがあるという方は多いと思いますが, その場合,マシンの起動用にフロッピーディスクを使用したはずです. 今回はそのフロッピーディスクすら使用せず, 完全にネットワークからブートする方式について考えます.
PXEを使うためには, ディスクレスマシン側にPXE対応のネットワークカード(以下NIC)が必要です. NIC上のフラッシュROMには,PXEのブートコードが書き込まれています. サーバマシン側ではDHCP/TFTP/NFSの設定が必要です.(※注) サーバ側のOSは,Linux/FreeBSD/Solarisなど,UNIX系OSであれば何でもよく, ディスクレスクライアントのOSとは異なるOSでも構いません.
もうひとつ,PXE対応のNICがTFTPを使って読み込むブートローダが必要です. ブートローダは,ディスクレスクライアントがLinuxやDOSなどの場合は BpBatch(後述)を, FreeBSD(4.1-RELEASE以降)の場合はOSに付属のpxebootを使います. できればひとつのブートローダで統一したいところですが, BpBatchは残念ながらFreeBSDをブートできません. たとえ,いったんBpBatchをロードしたあとに, pxebootをロードしようとしてもうまくいきません.
そこで,ディスクレスクライアントのOSの種類に応じて, DHCPサーバの設定(後述)でブートローダを BpBatchかpxebootかに切替えて使うことになります.
PXEとBpBatchによるLinuxのディスクレスブートの様子と, PXEとpxebootによるFreeBSDのディスクレスブートの様子を,下図に示します.
ディスクレスマシンの電源を入れると,まずNIC上のPXEのブートコードが動作し, DHCPでIPアドレスやブートファイルなどをサーバに問い合わせます. サーバからの返答のあと,ディスクレスマシンは, TFTPでサーバからブートファイルであるbpbatchまたはpxebootをダウンロードし, これに制御を移します.
このあとの流れはBpBatchとpxebootとでは若干違いますが, いずれも最終的にNFS rootをrootファイルシステムとしてマウントした状態でOSが立ち上がります.
+--サーバマシン--+ +--ディスクレスマシン---+ | | | | | +----------+ | | +------------------+ | | | |←-----------(DHCP要求)-----------------| | | | | |-------------(DHCP応答)---------------→| | | | |DHCPサーバ| | | | NIC上の | | | | |←---(DHCP要求)---* *--------| PXEのブートコード| | | | | | \ / | | | | | | |-----(DHCP応答)---* \ / *------→| | | | +----------+ | \ \/ / | +------------------+ | | | \/\/ | ↓ | | +----------+ | /\/\ | +------------------+ | | | |←---(TFTP要求)-----* /\ \ | | | | | | | | / \ \ | | | | | | |-----(bpbatch転送)--* * * | | | | | |TFTPサーバ| | | | | | | | | | | | | | | | bpbatch | | | | |←---(TFTP要求)-------------------------| | | | | | | | | | | | | | | |-----(vmlinuzなど読み込み)------------→| | | | | | | | | | | | | | +----------+ | | | | +------------------+ | | | | | | ↓ | | +----------+ | | | | +------------------+ | | | | | | *------| | | | | | | | | | | | | | | | *--------→| | | | |NFSサーバ | | | | Linux | | | | |←------------------------------------→| カーネル | | | | | | (NFS root上にOSが立ち上がる) | | | | | +----------+ | | +------------------+ | | | | | +----------------+ +-----------------------+ |
FreeBSD の pxeboot を使う場合は下図のようになります。BpBatch の場合と若干異なりますが、大まかな動作は同じです。
---- +--サーバマシン--+ +--ディスクレスマシン---+ | | | | | +----------+ | | +------------------+ | | | |←-----------(DHCP要求)-----------------| | | | | |-------------(DHCP応答)---------------→| | | | |DHCPサーバ| | | | NIC上の | | | | |←---(DHCP要求)---* *--------| PXEのブートコード| | | | | | \ / | | | | | | |-----(DHCP応答)---* \ / *------→| | | | +----------+ | \ \/ / | +------------------+ | | | \/\/ | ↓ | | +----------+ | /\/\ | +------------------+ | | | |←---(TFTP要求)-----* /\ *----------| | | | |TFTPサーバ| | / \ | | | | | | |-----(pxeboot転送)--* *--------→| | | | +----------+ | | | | | | | | | pxeboot | | | +----------+ | | | | | | | |←---(NFSマウント)----------------------| | | | | | | | | | | | | |-----(loader.rc, kernelなど読み込み)--→| | | | | | | | +------------------+ | | |NFSサーバ | | | ↓ | | | | | | +------------------+ | | | | | | | FreeBSD | | | | |←------------------------------------→| kernel | | | | | | (NFS root上にOSが立ち上がる) | | | | | +----------+ | | +------------------+ | | | | | +----------------+ +-----------------------+ |