LinuxでFreeDOS起動USBメモリーを作成

 昨年末に購入したintelAtomマザーボード、D945GCLF2はUSBメモリーからの起動もサポートしています。買った当初にちょっと調べてみてやったのですが起動せず、結局このマシンには余っていたCD-Rドライブをつけたのでした。
 この時は、USBメモリーのメーカーが悪いのかなぁと思っていたのですが、最近になってネットで詳しく調べてみると、こちらのページ

「ブート対応」である必要はない。

という記述を見つけて何が悪かったんだろうと調べてみました。で結局のところ、CDブートのisoイメージをそのままUSBメモリーにコピーしてもダメということでした。前にちょっと調べるとddでコピーとかあったもので、簡単にisoイメージを以下のようにして書き込めばOKだと思いこんでいました。

# dd if=boot.iso of=/dev/sdb1 bs=512k

この結果は起動できないUSBメモリーの完成です。
 実際は、CDブートとUSBメモリーブートの仕組みが違うので、USBはUSBのやり方が必要となります。おおざっぱな手順としては起動可能なフロッピーディスクを作るのと同じで、

  1. ディスクをフォーマット
  2. DOSで言うところのsys.exeコマンドを実行してディスクに起動関連ファイルをインストール
  3. あと、起動後に必要なファイルをコピー

という感じです。
 自分は今回、BIOS更新のためにDOSが起動すれば良かったので、FreeDOSを入手。ダウンロードページにあるsys-freedos-linuxツールを使ってLinux上でUSBメモリーを起動できるようにしました。概略の手順は以下のようになります。
 USBメモリーをfdiskでパーティション作成、IDはFAT16にしておく。
 mkdosfsにてFAT16ファイルシステム作成。

# mkdosfs -F 16 /dev/sdc1

 sys-freedos-linuxツールに含まれているperlスクリプトを実行して起動に必要なシステムファイルをインストール。

# ./sys-freedos.pl --disk=/dev/sdc1

ちなみに、この時アセンブラのnasmが必要になるので先にインストールしておきます。
 FreeDOSのkernel.sysとcommand.comUSBメモリーにコピー。
 この2つのファイルはFreeDOSのfdboot.imgから入手できます。

# mount /dev/sdc1 /mnt/usb
# mount -o loop fdboot.img /mnt/fd
# cp /mnt/fd/kernel.sys /mnt/usb
# cp /mnt/fd/command.com /mnt/usb
# umount /mnt/usb
# umount /mnt/fd

 以上でFreeDOSが起動できるUSBメモリーができました。D945GCLF2で問題なく起動します。ちなみに使ったUSBメモリーはもう6年ぐらい前に購入したバッファローの128MBのもの。規格がUSB1.1どまりのやつです。当時たしか6千円ぐらいしたと思います。今は2GBで500円程度ですもんね。容量16倍で値段は1/12ですよ。
 でも、会社で試してみたところ、デルのOptiPlexや富士通のノートPCは起動できません。デバイスとして認識されて、起動時にUSBメモリーにアクセスしてそのまま固まってしまうという現象です。BIOSとの相性なのか。ネットの情報でもできるマシンとできないマシンがあって、作り方もLinuxWindowsDOSなどでいろいろあるので試行錯誤しかないようです。