network boot from qemu

Qemu + gPXE + bootp + tftpでネットワークブートをしたいのだが、うまく行かない。

jupiter.coil.dom:/etc/bootptab

.default:\
        :ht=1:sa=192.168.0.19:\
        :hd=/i386:\
        :bf=/pxeboot:\
        :rp="192.168.0.19:/nfsroot/i386":\
        :ds=192.168.0.10:\
        :sm=255.255.255.0:\
        :gw=192.168.0.1:\
        :hn:\
        :vm=rfc1048:
io.coil.dom:tc=.default:\
        :ha=0500048fd19c:\
        :ip=192.168.0.35:
moon.coil.dom:tc=.default:\
        :ha=000ae422f9c6:\
        :ip=192.168.0.14:

アドレスは、coil.domというドメインと仮定。

jupiter.coil.domの/tftpboot/i386にpxebootをおく。また、/nfsroot/i386以下にi386ディストリビューションを展開しておく。

ioはqemu、moonは実機(ThinkPad X40)

jupiter.coil.dom:/nfsroot/i386/etc/disklessをつくる。
jupiter.coil.dom:/nfsroot/i386/confにbase、defaultをつくり、etcをコピーしておく。
jupiter.coil.dom:/nfsroot/i386/conf/192.168.0.14/etcに上書きファイルを作成。

% cd /nfsroot/i386/conf/192.168.0.14/etc/
% ls
exports         group           motd            pwd.db          spwd.db
fstab           master.passwd   passwd          rc.conf         ssh

実機PXE(ThinkPax X40)

基本的に、起動する。しかし、場合によっては、kernelを読み込んで、

Timecounter "TSC" frequency 1401316350 Hz quality 800
Timecounters tick every 1.000 msec

のところで止まる場合がある。その後、ad0のカーネルメッセージが出るはずのところなので、PCに問題があるのかもしれない。

Qemu

gPXEのisoイメージをhttp://rom-o-matic.net/から作成。bootpで起動するには、currentではなく、0.9.6を使うのがよいらしい。nicは"rtl8139:rtl8139"を選択。

% qemu -cdrom gpxe-0.9.6-rtl8139.iso -boot d -net nic,model=rtl8139,macaddr=05:00:04:8f:d1:9c -net tap,ifname=tap,script=no -serial stdio

で起動すると、bootpからIPアドレスをもらい、pxebootを起動して、kernelが起動する。しかし、

Trying to mount root from nfs:192.168.0.19:/nfsroot/i386
NFS ROOT: 192.168.0.19:/nfsroot/i386
re0: link state changed to UP

で、止まってしまう。

% qemu -hda disk.img -boot c -net nic,model=rtl8139 -net tap,ifname=tap,script=no -monitor stdio

としてハードディスクイメージから起動したFreeBSDからjupiter:/nfsroot/i386をマウントできるので、NFSに問題はないと思うのだが、確信がもてない。