RIGHT:川俣吉広 RIGHT:EBUG 第29回会合 - 2009, 2/21 *LiveCD河豚板のUSB boot対応 [#ldb19a88] [[OpenBSD LiveCD「河豚板」>http://kaw.ath.cx/openbsd/?LiveCD]]は、 2008年末にUSBフラッシュメモリからの起動に対応しました。 現在、配布サイト((http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/ , http://livecd-mirror.ebug.jp/LiveCD/))では、 CD-ROM用、USBメモリ用の2つのイメージを公開しています。 今回は、このUSB boot対応の内容、および[[前回(2007年5月)の発表>EBUG勉強会/LiveCD/2]]以降の状況などについて説明します。 **発端 [#r17a7fed] ebug members MLでの某氏の発言が発端 >''神'' - '''河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?''' ~ ''川'' - '''USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールしても動くんじゃないですかね?''' で、やってみたところ、通常の方法でOpenBSDをインストール、起動できることを確認((某氏はFreeBSDでも追試))。 河豚板のUSB boot対応にとりかかりました。 **河豚板のしくみ おさらい [#uc366925] 今回のUSB boot対応の概要を理解するため、まず河豚板のブートの仕組みとファイルシステムの構成について概観してみます。 ***カーネル起動直後まで [#uc1017f5] BIOSによってブートローダ(CDの場合はEl Torito規格、HDDの場合はMBRから)が読み込まれ、続いて二次ローダ (/cdboot or /boot)が、最後に カーネル (/bsd)が起動します。~ カーネル起動直後の河豚板のファイルシステム状態は以下のようになっています。 |CENTER:&ref(fuguita.gif);| |CENTER:カーネル起動直後のファイルシステム(概要)| ルートファイルシステムとなっているrdデバイスはカーネル内にあらかじめ組込まれており、 カーネル起動と同時にルートにマウントされます。これはFDDインストーラなどで使われている技術です。 rdデバイスには、起動のために必須な必要最小限のコマンド、設定ファイルのみ収録されています。 また、容量低減のためこれらは単一のディレクトリ /boottmp に収められています。 このあと、通常のBSDの起動シーケンスにのっとり、/sbin/init が起動、つづいて /etc/rc が実行されます((実際にはそれぞれ、/boottmp/init , /boottmp/rc))。 ***通常の運用状態まで [#k2152b78] /etc/rc (実際は、/boottmp/rc)は概ね、以下のような動作をします; -mfs, CD-ROMのマウント -動作モードの選択 -キーボード形式, ルートパスワード, ネットワークパラメータなどの設定、(あるいは、以前保存したメディアから設定を復帰)。~ ... (どちらにするかは、指定された動作モードによる) これらの初期化を終えたあと、/fuguita/etc/rc に制御を移します。これ以降はOpenBSDネイティブの処理が実行されます。~ 最終的に運用状態になった時点でのファイルシステムの状態は以下のようになります; |CENTER:&ref(fuguita-op.gif);| |CENTER:運用状態でのファイルシステム(概要)| 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以下の内容を保存する場合に必要なファイル容量も大幅に低減することができています。 **変更作業 [#l47cfa24] まず、冒頭の「発端」でも触れたように、OpenBSDを通常のインストーラを用いて USBメモリにインストール((OpenBSDからは、SCSIディスクとして見える))し、起動試験を行ってみました。 -結果 ... ハードウェアによって、起動できるものとできないものがある。 ネット上の情報を調べたところ、USB bootをサポートするBIOSであっても、ストレージデバイスをHDDとして認識するものと、 Removable Diskとして認識するものがあり、後者の場合はUSBデバイスに通常のインストールを行った OpenBSDは起動できないようであることが判明しました。~ 起動が不可能な場合、二次ローダが出力するプロンプト ''boot>'' も出力されません。 このことからも、やはりBIOSがMBRを読み込めていない(=HDDとして認識していない)可能性が高いと推測されます。 どうやらUSB boot機能は、CD-ROMでのEl Torito規格のような互換性の高い標準規格は採用されていない場合も時々あるようです。 とりあえず、河豚板のUSB boot対応は、前者のBIOSを対象として実施することとしました; -方針と実装 --USB用の別バージョンは作成しない。単一のスクリプトでCD-ROM / USB両対応とする。~ ... 別バージョン作ると、開発・保守の手間が2倍になる(一人でやってるので、これはツライ!!)。 --USBであっても、read onlyでマウントする。~ ... USBの書換え回数の問題が回避できるから。 --USBデバイスに導入する場合は、HDDと同様にパーティショニングやブートローダの書き込みが必要なため、 本来インストーラが必要になる。 とはいえ、インストーラまで作ってられないのでとりあえず生のディスクイメージを作成し、それを配布する。 --いままでCD-ROM決め打ちでやっていた部分を変更。 ---/cdrom を /fuguita に名称変更 ---OSに認識されたストレージデバイスを順次スキャンし、河豚板の入っているメディアを検出する。 ---前項のメディアをデフォルト値とし、実際に /fuguita にマウントするデバイスをユーザに尋ねる。 ---ユーザデータ保存機能など、関連するサポートツールの改造 ---ビルドツールの機能追加と変更 実際の変更箇所は、初期化の大部分を担当する /boottmp/rc に集中しました。 「発端」となったMLでのやり取りは 2008年11月30日、USB対応版のリリースは12月11日の''FuguIta-4.4-200812111''にて行われました。 **その他諸々 [#x3d47ab8] -USB bootが不可能な機種でも、カーネル起動後にUSBが認識できれば以下の方法でUSB版の運用が可能です。 --CD-ROMとUSBメモリの両方を装着し、CD-ROMでブート。 --''device where FuguIta stored in [cd0a] -> ''のプロンプトに対し、USBフラッシュのデバイス名(通常は sd0a)を入力 --以降は、USBフラッシュによる運用に切り替わる(CD-ROMはeject可)。 -USB用のイメージをHDDに上書きすれば、HDDでの運用も可能。 -''ご注意'': CD-ROM版だけの頃から存在していた「USBフラッシュへのユーザデータ保存機能」は、USB対応版でも引続き使用できます。 ただし、USB版実装に伴いデータを保存するパーティションが変更となったため、USB版以前に保存したデータは''非互換''となりました。 -USBフラッシュ対応のOpenBSDは、他に ''flashboot'' ( http://www.mindrot.org/projects/flashboot/ )というものが開発されており、 主に Soekris Net4{5,8}xxのような組み込みプラットフォームでの使用を想定しているようです。 **2007年5月以降の河豚板の主な状況 [#d8aab8cc] リリース状況 (括弧内の数字は、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) --MP kernel ''/bsd.mp''収録。起動も bsd.mpをデフォルトに。~ ...Single Processor Kernelの場合、Multi CoreのCPUでブート時に固まる場合あり。 --/boottmp/rcの細かい部分を多数修正 --dig氏より、CD-ROM label artworkをご提供頂きました。 **最後に [#k06c227f] 河豚板はKnnopixやSlax、あるいはFreeSBIEのようなメジャーなLiveCDのような 判り易く綺麗な外観は持っておりませんが、OpenBSD自身が持つ機能はほぼ全て盛り込んでいます。 そのため、HDDへの通常インストールと同じ感覚で使用できます。 また、追加でインストールされている各種パッケージを組み合わせると、 色んな技を試せます。例えば、 -フェイルオーバ、帯域制御機能付のファイアウォール(しかもIPv6完全対応 :-) -HTTPプロキシを経由して、Layer2トンネルを通す(しかも圧縮&暗号化機能付き!!)。~ ...さらに、そこを通ってWindowsマシンにログオン、とか... -Transmissionでお手軽BitTorrent tracker/seeder -いつでもどこでもプログラミング。Schemeでも遊べちゃう。GUIだって作れるよ。 -映像・音声メディアの視聴は勿論、動画エンコード、CD/DVDのリッピング&焼きにも対応してます。 などなど…。ぜひ一度お試しください。 ご質問、バグレポート、ご要望などございましたら、kaw@on.rim.or.jp までお知らせください。 また、mixiのOpenBSDコミュニティにも、河豚板トピックを開設しています。