Wake on LAN で起動する i386 マシンの boot-partition を選択する


はじめて Wake on LAN の機能を使ってみたところ、思っていたよりも便利なものでした。 一つのマシンで複数の OS を切り替えて使っているので、 その切り替えまで含めてリモートから指示できるようにしてみました。
一言でいうと、NIC は PXE 対応、 マシンをネットワークブート優先にしておき、 DHCP+TFTP で pxegrub を起動させ、 grub のコンフィグレーションファイルをやはり DHCP+TFTP で送りつける、 ということになります。

マシンの電源が入るまで:

NIC によって、スタンバイ電源だけでは wake-on-lan でシステムの電源が入ってくれない (shutdown した状態ではハブの link ランプがつかない) ものがありました。WOL 対応をうたってる NIC だったんですが、マニュアルには Windows の環境設定で、 PCI の電源を切らないように設定しろと書いてありましたが、 何が悪いのか、Windows では認識してくれなかったので、 試せませんでした。
当方で使ってうまくいってる NIC は intel の i8255x (fxp) で、 PXE 対応のものです。最近の gigabit のものは試していません。 カードのバージョンによって WOL のケーブル接続が必要なものと不要 なものがありました。メインボードにも依存すると思いますが。
BIOS で、WOL で電源を入れる、あるいは PCI の PME で電源を入れる、 という設定が必要でした。

pxegrub を netboot する

netboot そのものについては Diskless NetBSD HOW-TO が大変参考になりました。具体的には DHCP サーバ (NetBSD/i386マシン) の /etc/dhcpd.conf に
class "pxe-clients-ia32" {
	match if substring (option vendor-class-identifier, 0, 20)
        	= "PXEClient:Arch:00000";
	filename "/tftpboot/pxegrub";
}
  
を追加しています。また、DHCP サーバと同じマシンで tftpd も動かし、 pxegrub を /tftpboot/ に置いています。
pxegrub は NetBSD-current/i386 の pkgsrc/sysutils/grub で、 GRUB_NETWORK_CARDS=eepro100 makeすると work/grub-0.93/stage2/ に得られます。[2003/9/12]
また、BIOS のブート設定を HDD よりもネットワークブートが優先となるようにしています。

grub のコンフィグレーションファイルを TFTP サーバに置く

DHCPサーバの /etc/dhcpd.conf に次のように書くことで、マシン毎の grub のコンフィグレーションファイルをサーバ側に置いています。
option option-150 code 150 = text;
host dyn0 {
  hardware ethernet yy:yy:yy:yy:yy:yy;
  option option-150 "/tftpboot/dyn0.conf";
}
host dyn1 {
  hardware ethernet xx:xx:xx:xx:xx:xx;
  option option-150 "/tftpboot/dyn1.conf";
}
  
そして、/tftpboot/dyn0.conf は次のようなものです。
gfxmenu (hd0,0)/message
color white/blue black/light-gray
default 1
timeout 5

title linux
   kernel (hd0,0)/vmlinuz root=/dev/hdb1  acpi=off hdc=ide-scsi  vga=788
   initrd (hd0,0)/initrd
title NetBSD-current
   unhide (hd0,1)
   hide (hd0,3)
   rootnoverify (hd0,1)
   makeactive
   chainloader +1
title Win2k
   rootnoverify (hd0,2)
   makeactive
   chainloader +1
title NetBSD-1.6
   hide (hd0,1)
   unhide (hd0,3)
   rootnoverify (hd0,3)
   makeactive
   chainloader +1
title floppy
   root (fd0)
   chainloader +1
title netboot
   hide (hd0,1)
   unhide (hd0,3)
   kernel --type=netbsd /tftpboot/netbsd-1.6-INSTALL
title current-debug
   unhide (hd0,1)
   hide (hd0,3)
   root (hd0,1,a)
   kernel --type=netbsd /netbsd -d
  
このファイルの default の行が 0, 1, 2, 3 に応じて Linux, NetBSD-current, Windows2000, NetBSD-1.6 が立ち上がってくるということになります。
もちろん、マシンの前にいれば、手動で電源を入れて、 grub のメニューから立ち上げる OS を選ぶこともできます。

grub に直接 NetBSD (elf) のカーネルを読み込ませる [2003/9/20]

上の grub のコンフィグレーションで、 current-debug というエントリは、 ハードディスクの ufs パーティションから直接カーネルを読み込んで実行します。
ただ、grub の (少なくとも 0.93 では) この方法で NetBSD を実行すると、 boot device, root device などの入力待ちでカーネルが止まってしまうので、 リモートから立ちあげる用途には不向きです。
そこで、この問題を解決するために、カーネルに bootinfo を渡してやるように grub を変更して使っています。
diff は これ です。 pkgsrc/sysutils/grub への追加のパッチです。
1台のマシンで、wd0 からのブートにしか使ってないので、 他の構成では問題あるかも知れません。
(何か気付かれた方はお知らせいただけるとありがたいです。)

その他

/tftpboot/dyn?.conf を書き換え、 /usr/pkg/bin/wakeup を実行する CGI を書いて これらのマシンを立ち上げる Web のインターフェイスを作っています。
nand@mac.com     目次へ $Revision: 1.12 $ $Date: 2004/02/04 17:54:36 $