Darwin をネットワークブートする

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 を指します。

[2003/11/21] Darwin のネットワークインストール

まず、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 のインストーラが立ち上がるはずです。

ポイントとしては、

といったあたりかと思います。

[2003/11/25] Darwin のネットワークブート (vndevice)

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 のバージョンを混同している記述があったので削除。


nand@mac.com     目次へ $Revision: 1.11 $ $Date: 2005/03/25 17:34:44 $