OpenBSD LiveCD「河豚板」は、2008年末にUSBフラッシュメモリからの起動に 対応しました。 現在、配布サイト*1では、 CD-ROM用、USBメモリ用の2つのイメージを配布しています。
今回は、このUSB boot対応の内容、および前回(2007年5月)の発表以降の変更点などについて説明します。
ebug members MLでの神保氏の発言が発端
神 - 河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?
川 - USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールすれば動くんじゃないですかね?
で、やってみたところ、通常の方法でOpenBSDをインストール、起動できることを確認*2、 河豚板のUSB boot対応にとりかかりました。
今回のUSB boot対応の概要を理解するため、河豚板のブートの仕組みとファイルシステムの構成について概観します。
BIOSによってブートローダ(CDの場合はEl Torito規格、HDDの場合はMBR)が読み込まれ、続いて二次ローダ (/cdboot or /boot)が、最後に
カーネル (/bsd)が起動します。
カーネル起動直後のファイルシステムの状態は以下のようになっています。
ルートファイルシステムとなっているrdデバイスはカーネル内にあらかじめ組込まれており、 カーネル起動と同時にルートにマウントされます。これはFDDインストーラなどで使われている技術です。
rdデバイスには、起動のために必須な必要最小限のコマンド、設定ファイルのみ収録されています。 また、容量低減のためこれらは単一のディレクトリ /boottmp に収められています。
このあと、通常のBSDの起動シーケンスにのっとり、/sbin/init が起動、つづいて /etc/rc が実行されます。
/etc/rc (実際は、/boottmp/rc)は概ね、以下のような動作をします;
これらの初期化を終えたあと、/fuguita/etc/rc に制御を移します。これ以降はOpenBSDネイティブの処理が実行されます。
最終的に運用状態になった時点でのファイルシステムの状態は以下のようになります;
rdによるルートファイルシテムは引続き存在し、CD-ROMは、/fuguitaに、mfsは/mfsにマウントされます。 そして、これらのファイルツリーは通常のUnixのファイルツリーとして扱えるようにシンボリックリンクが張られ(まくり)ます。 特に、/usr以下はシンボリックリンクが2段階で張られています。例えば、/usr/bin/viにアクセスする場合は、
/usr/bin/vi ↓ /mfs/usr/bin/vi ↓ /fuguita/usr/bin/vi
というようにリンクが辿られます。
なぜこのようなややこしいことをするのか? それは、「/usr以下をread onlyにせず、ファイルの置き換えを
可能にすることによって、securityアップデートやports/packagesの追加を可能にするため」です。
LiveCDの場合、通常このような機能は「スタッカブルファイルシステム」などによって実装しますが、
OpenBSDではスタッカブルファイルシステムは実装されていないため、河豚板では今述べたような方法を採用しています。
また、/mfs以下の大半をシンボリックリンクで置き換えることで、 /mfs以下の内容を保存する場合に必要なファイル容量も大幅に低減することができています。
まず、冒頭の「発端」でも触れたように、OpenBSDを通常のインストーラを用いて USBメモリにインストール*3し、起動試験を行ってみました。
ネット上の情報を調べたところ、USB bootをサポートするBIOSであっても、ストレージデバイスをHDDとして認識するものと、
Removable Diskとして認識するものがあり、後者の場合はUSBデバイスに通常のインストールを行った
OpenBSDは起動できないようであることが判明しました。
とりあえず、河豚板のUSB boot対応は、前者のBIOSを対象として実施することとしました;
実際の変更箇所は、初期化の大部分を担当する /boottmp/rc に集中しました。
「発端」となったMLでのやり取りは 2008年11月30日、USB対応版のリリースは12月11日のFuguIta-4.4-200812111にて行われました。