DHCP サーバに Apple の bootpd を使わないで、
Darwin をネットワークブートする試みです。
ハードウェアトラブル等の緊急用が目的ですので、
アプリケーション等を動かそうとは考えていません。
また、以下の記述は OpenFirmware のバージョンが
3 未満では当てはまりません。
なお、以下の記述は基本的にはサーバ側は NetBSD-1.6ZD/i386、
クライアント側は iBook tangerine でテストしたものです。
また、以下で Darwin というときは Darwin 7.0.1 を、
Mac OS X というときは、Mac OS X 10.3 を指します。
まず、Mac の OpenFirmware の netboot は独自(?)プロトコルなので、
標準的な dhcpd だけで netboot させようとしても、
なかなかうまくいかないようです。
dhcpd に手をいれるか apple の bootpd
を動かすなどの対応策もあるとは思いますが、
私は他のシステムも混在する自分のネットワークの
dhcpd 関係に大幅な変更をいれるのは避けたかったので、
サーバの IP アドレスやブートファイルのパス等は手動で
クライアント側の OpenFirmware に設定ということにしました。
クライアントの IP アドレスだけは DHCP で取得させています。
まず、TFTP サーバが chroot するディレクトリ (/tftpboot) に
darwin というディレクトリを作成し、ここに
Darwin-701 のインストール CD
から、ブートローダ、カーネルとデバイスドライバをコピーします。
カーネルは mach.macosx, デバイスドライバは
mach.macosx.mkext という名前でないといけません
次の作業はクライアントの Mac OS X 上で、
CD イメージをマウントした状態で行なった例です。
client# cd /Volumes/darwin
client# scp System/Library/CoreServices/BootX
server:/tftpboot/darwin/BootX
client# scp mach_kernel server:/tftpboot/darwin/mach.macosx
client# scp System/Library/Extensions.mkext
server:/tftpboot/darwin/mach.macosx.mkext
次に、クライアントの root ファイルシステムを
NFS サーバの /export/darwin 以下に準備します。
ここは Darwin インストール CD をそのままコピーします。
client# mount server:/export/darwin /mnt
client# cd /Volumes/darwin
client# pax -r -w -p e . /mnt
client# umount /mnt
そしてクライアント側の OpenFirmware で次のように設定を行ないます。 サーバの IP アドレスを 192.168.0.1 とすると、
setenv boot-device enet:192.168.0.1,\darwin\BootX
setenv boot-args rp=nfs:192.168.0.1:/export/darwin
この状態でブートすると、Darwin のインストーラが立ち上がるはずです。
ポイントとしては、
といったあたりかと思います。
Mac OS X のネットワークブートでは、
root ファイルシステムにディスクイメージを指定することができます。
例えば、クライアントの OpenFirmware の設定で、
setenv boot-args rp=nfs:192.168.0.1:/export:darwin.dmg
と設定すれば、NFS サーバの /export/darwin.dmg
というディスクイメージの内容を
root ファイルシステムとして使うことができます。
しかし、このためには (たぶん) Kernel Extension IOHDIXController
が必要であり、これは Darwin に含まれないため、使えません。
Darwin では (そして Mac OS X でも) vn デバイスを使えば、
これに近いことができるようになっており、
そのためには
setenv boot-args vndevice=true rp=nfs:192.168.0.1:/export:darwin.vnimg
のように vndevice オプションを追加します。 (vndevice= の後の文字列は何を指定しても効果は同じ)。
このディスクイメージファイルは read only であり、
ネットワークブート後のファイルシステムへの変更は
shadow ファイルに書き込まれます。
shadow ファイルは、bootp の指定があればネットワークファイルシステム上に
とられますが、そうでなければローカルディスクの /.com.apple.NetBootX/
以下に作成されます。
(Mac OS X の bootp が動いていない環境で、
ローカルディスクに触らずにネットワークブートするためには
/etc/rc.netboot を書き換える必要がありそうです。)
vndevice のファイルシステムのイメージを作るためには、 Darwin か Mac OS X で次のようにします。 作りたいファイルシステムの容量は最初の dd コマンドで決めます (この例では約 2GB)。
# dd if=/dev/zero of=darwin.vnimg bs=1024k count=2047
# /usr/libexec/vndevice attach /dev/vn0 darwin.vnimg
# newfs_hfs /dev/rvn0
# mount -t hfs /dev/vn0 /mnt
この状態で、インストールした Darwin のファイルシステムの内容を /mnt にコピーします。インストールした Darwin は /Volumes/Darwin に存在するものとします。
# cd /Volumes/Darwin
# pax -r -w -p e . /mnt
ネットワークブートでは、/System/Library/StartupItems/ の NetworkExtensions がうまく動かない (理由は追いかけてません) ので、 これを削除します。
# cd /mnt/System/Library
# mkdir StartupItems.disable
# mv StartupItems/NetworkExtensions StartupItems.disable
そして、次の作業でファイルシステムのイメージ作成は完了です。
# cd /
# umount /mnt
# /usr/libexec/vndevice detach /dev/vn0
この darwin.vnimg ファイルを NFS サーバの /export/ に置き、クライアントの OpenFirmware で次の手順で boot すると Darwin をネットワークブートできます。
setenv boot-device enet:192.168.0.1,\darwin\BootX
setenv boot-args vndevice=true rp=nfs:192.168.0.1:/export:darwin.vnimg
boot
この例ではクライアント側のディスクのファイルシステムに shadow ファイルが作られます。
[2005/3/26] Open Firmware のバージョンと BootROM のバージョンを混同している記述があったので削除。