川俣吉広
EBUG 第29回会合 - 2009, 2/21

LiveCD「河豚板」のUSB ブート対応

OpenBSD LiveCD「河豚板」は、 2008年末にUSBメモリからの起動に対応しました。 現在、配布サイト*1上では、 CD-ROM用、USBメモリ用の2つのイメージを公開しています。

今回は、このUSB ブート対応の内容、および前回(2007年5月)の発表以降の状況などについて報告します。

発端

USB ブート対応のきっかけとなったのは、ebug members MLでの以下のようなやりとりです;

- 河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?
- USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールしても動くんじゃないですかね?

で、やってみたところ、HDDに行う通常のインストール方法でOpenBSDを起動できることを確認*2。 これをふまえて河豚板のUSB ブート対応にとりかかりました。

おさらい - 河豚板の起動のしくみ

今回のUSB ブート対応の概要を理解するため、まず河豚板の起動のしくみとファイルシステムの構成について概観してみます。

カーネル起動直後まで

まず、BIOSによって初期ブートローダ(CDの場合はEl Torito規格により指定されたローダ、HDDの場合はMBRから)がよみこまれ、つづいて二次ローダ (/cdboot or /boot)が、そして最後に カーネル (/bsd)が起動します。
カーネル起動直後の河豚板のファイルシステム構成を以下の図に示します;

fuguita.gif
カーネル起動直後のファイルシステム(概要)

ルートファイルシステムとなっているrdデバイスはカーネル内にあらかじめくみこまれており、 カーネル起動と同時にルートにマウントされます。これはFDDインストーラなどでつかわれているテクニックです。

rdファイルシステムには、起動のために必須な必要最小限のコマンド、設定ファイルのみ収録されています。 また、容量低減のためこれらは単一のディレクトリ /boottmp におさめられています。

このあと、通常のBSDの起動シーケンスにのっとり、/sbin/init が起動、つづいて /etc/rc が実行されます*3

/sbin/initからよびだされた /etc/rc (実際は、/boottmp/rc)はおおむね、以下のような動作をします;

これらの初期化が正常に終了すると、/fuguita/etc/rc に制御がうつされます。これ以降はOpenBSDネイティブの処理が実行されます。
すべての初期化が終了して運用状態に到達したとき、ファイルシステムの状態は以下の図のようになっています;

fuguita-op.gif
CENTER:運用状態でのファイルシステム(概要)

rdによるルートファイルシテムは存在しつづけ、CD-ROMは、/fuguitaに、mfsは/mfsにマウントされます。 そしてこれらのファイルシステムは、通常のUnixのファイル構造としてアクセスできるようにするため、シンボリックリンクが張られ(まくり)ます。 特に、/usr以下はシンボリックリンクが2段階で張られています。たとえば、/usr/bin/viにアクセスする場合は、

        /usr/
         ↓
    /mfs/usr/bin/vi
                 ↓
/fuguita/usr/bin/vi

というようにシンボリックリンクがたどられます。

なぜこのようなややこしいことをするのか? それは、

/usr以下をread onlyにせず、ファイルのおきかえを 可能にすることによって、securityアップデートやports/packagesの追加を可能にするため

です。このような機能は「スタッカブルファイルシステム」をつかうことなどによって実現できますが、 OpenBSDではスタッカブルファイルシステムは実装されていません。 よって、河豚板では、このシンボリックリンクをもちいる手法を考案し、実装しました。

くわえて、副次的な利点となりますが、/mfs以下の大半をシンボリックリンクでおきかえることにより、 /mfs以下の内容を保存する場合に必要なファイル容量を大幅に低減することもできています。

USB ブート対応作業の実際

まず、冒頭の「発端」でもふれたように、OpenBSDを通常のインストーラをもちいて USBメモリにインストール*4し、起動試験をおこなってみました。

ネット上の情報をしらべたところ、USB ブートをサポートするBIOSであっても、USBメモリをHDDとして認識するものと、 リムーバブル・ディスクとして認識するものがあり、どうやら後者の場合はUSBメモリに通常のHDD用インストールをおこなった OpenBSDは起動できない様子です。
起動が不可能ですと、二次ローダが出力するプロンプト boot> も表示されません。 このことからも、やはりBIOSがMBRをよみこめていない(=HDDとして認識していない)可能性がたかいと推測されます。

どうやらUSB ブートでは、CD-ROMでのEl Torito規格のような標準規格が存在せず、機種によって動作がちがってくる場合も多々あるようです。

とりあえず、河豚板のUSB ブート対応は、前者のBIOSを対象として実施することとしました;

実際の変更箇所は、初期化の大部分を担当する /boottmp/rc に集中しました。

冒頭紹介した「発端となったMLでの議論」は 2008年11月30日にかわされ、USB ブート対応版は12月11日のFuguIta-4.4-200812111にて正式リリースされました。

の数字は、security fix対応などのマイナーリリース回数)};

最後に

メジャーなLiveCD、たとえばKnoppixやUbutu、あるいはFreeSBIEなどのおおくは、 どれも親しみやすく、美しい外観をもっています。
河豚板はそこまで初心者フレンドリな環境ではないのですが、 OpenBSD自身がもつ機能はほぼすべてもりこんでいます。 そのため、河豚板はHDDへ通常インストールしたOpenBSDとおなじ感覚で使用できます。

また、OS本体のほかに追加収録されている各種パッケージをくみあわせて、 いろいろな技をためすこともできます。たとえば、

などなど…。ぜひ一度おためしください。

ご質問、バグレポート、ご要望などございましたら、kaw@on.rim.or.jp までおしらせください。 mixiのOpenBSDコミュニティにも、河豚板トピックを開設しています。


*1 http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/ , http://livecd-mirror.ebug.jp/LiveCD/
*2 某氏はFreeBSDでも追試
*3 実際にはそれぞれ、/boottmp/init , /boottmp/rc
*4 OpenBSDからは、SCSIディスクとして見える
*5 逆に、ユニプロセッサな機種でマルチプロセッサ用カーネルを使用すると、(電源スイッチをおしてさえも)電源断ができなくなるケースもありました。

Front page   New Page list Search Recent changes   Help   RSS of recent changes