Top / EBUG勉強会 / 20090221_LiveCD_3
川俣吉広
EBUG 第29回会合 - 2009, 2/21

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

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

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



発端

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

- 河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?

- USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールしても動くんじゃないですかね?

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

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

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

カーネル起動直後まで

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

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

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

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

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

通常の運用状態まで

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

  • CD-ROMのマウント、mfs*4の作成とマウント、/etc/fstabの生成
  • ユーザからの動作モード指定をよみとる
  • キーボードタイプ, ルートパスワード, ネットワークパラメータなどの設定(もしくは、以前保存したメディアからの設定を復帰 ... どちらの動作かは、前項で指定された動作モードによる)

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

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

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

      /usr
       ↓
  /mfs/usr/bin/vi
               ↓
/cdrom/usr/bin/vi

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

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

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

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

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

USB ブート対応作業の実際

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

  • 起動試験の結果 ... ハードウェアによって、起動できるものとできないものがある。

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

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

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

  • 方針と実装
    • USB用の別バージョンは作成せず、単一のスクリプトでCD-ROM / USBメモリ両対応とします。
      ... 別バージョンつくると、開発・保守の手間が2倍になります(一人でやってるので、これは非常にキビシイ!!)。
  • USBメモリであっても、read onlyでマウントします。
    ... これによって、フラッシュメモリデバイスの書換え回数制限の問題を回避することが期待できます。
  • USBメモリに導入する場合も、HDDと同様にパーティショニングやブートローダのかきこみが必要なため、 本来はインストーラを用意するのがのぞましいのですが、 とりあえず生のディスクイメージを作成し、それを配布することにします。
  • いままで「デバイスファイル /dev/cd0a を /cdrom にマウントする」という決め打ちを想定してコーディングしていた部分を修正します;
    • /cdrom を /fuguita に名称変更
    • OSに認識されたストレージデバイスを順次スキャンし、河豚板のはいっているメディアを検出
    • 前項のメディアをデフォルト値とし、実際に /fuguita にマウントするデバイスをユーザにたずねる。
    • ユーザデータ保存機能など、関連するサポートツールの改造
    • FuguIta開発用のビルドツールも機能追加、変更などを実施

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

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

その他諸々

  • USB ブートが不可能な機種でも、カーネル起動後にUSBメモリが認識できていれば、CD-ROM版河豚板を併用することでUSB版の河豚板を運用できます。手順は以下のとおりです;
    • CD-ROMとUSBメモリの両方を装着し、CD-ROMから起動する。
    • device where FuguIta stored in [cd0a] -> のプロンプトに対し、USBメモリのデバイス名(通常は sd0a)を入力
    • 以降は、USBメモリによる運用にきりかわる(このあとはCD-ROMを取り出し可)。
  • USBメモリ版の配布イメージをHDDに上書きすれば、HDDでの運用も可能です。
    ... 超注意: パーティションテーブルも上書きされます!!
  • ご注意: CD-ROM版だけの頃から存在していた「USBメモリへのユーザデータ保存機能」は、USB対応版でもひきつづき使用できます。 ただし、USB版実装にともないデータを保存するパーティションが変更となったため、USB版以前にデータを保存したメディアは現バージョン用の保存メディアとは互換性がなくなりました
    ... あたらしく保存メディアを作成し、データを手動でコピーすれば引越しできます。
  • フラッシュメモリ対応のOpenBSDは、他に flashboot ( http://www.mindrot.org/projects/flashboot/ )というものが公開されています。 おもに Soekris Net45xx, Net48xxのような組み込みプラットフォームでの使用を想定しているようです。

2007年5月以降のリリース状況 (括弧内の数字は、security fix対応などのマイナーリリース回数)

  • FuguIta-4.1 (5)
    • itojun氏のアドバイスにより、-currentカーネルを使用した「IPv6 type 0 route header問題」対応版をリリース
  • FuguIta-4.2 (3)
  • FuguIta-4.3 (5)
    • amd64用試作版、およびそのビルドツールを qemu-x86-64 on i386上で作成 (欧州某方面からの要請による)
  • FuguIta-4.4 (6)
    • マルチプロセッサ用カーネル /bsd.mpを追加収録。起動も bsd.mpがデフォルトに。
      ...ユニプロセッサ用カーネルの場合、マルチコアのCPUでブート時にかたまる事例がありました*6
    • /boottmp/rcのこまかい修正を多数実施
    • dig氏より、CD-ROMラベル用アートワークをご提供いただきました。

最後に

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

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

  • フェイルオーバ、帯域制御機能つきのファイアウォール(しかもIPv6完全対応 :-)
  • HTTPプロキシを経由して、Layer2トンネルをとおす(しかも圧縮&暗号化機能つき!!)。
    ...さらに、そのトンネルのむこうのWindowsマシンにリモートデスクトップ接続、とか...
  • Transmissionでお手軽BitTorrent tracker/seeder
  • いつでもどこでもプログラミング。SchemeでもあそべちゃうしGUIだってつくれるよ。
  • 映像・音声メディアの視聴はもちろん、動画エンコード、CD/DVDのリッピング&焼きにも対応してます。

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

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


Top / EBUG勉強会 / 20090221_LiveCD_3


*1 http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/ , http://livecd-mirror.ebug.jp/LiveCD/
*2 某氏はFreeBSDでも追試
*3 実際にはそれぞれ、/boottmp/init , /boottmp/rc
*4 mfs: memory file system - いわゆるRAM Diskに相当
*5 OpenBSDからは、SCSIディスクとして見える
*6 逆に、ユニプロセッサな機種でマルチプロセッサ用カーネルを使用すると、(電源スイッチをおしてさえも)電源断ができなくなるケースもありました。
Attach file: filefuguita.gif 955 download [Information] filefuguita-op.gif 946 download [Information] filefuguita.fig 653 download [Information] filefuguita-op.fig 629 download [Information]
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2009-02-18 (Wed) 13:42:40 (3468d)