RIGHT:川俣吉広 RIGHT:EBUG 第29回会合 - 2009, 2/21 *LiveCD河豚板のUSB boot対応 [#ldb19a88] 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月)の発表以降の変更点などについて説明します。 **発端 [#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 が実行されます。 ***通常の運用状態まで [#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は起動できないようであることが判明しました。~ とりあえず、河豚板の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] **2007年5月以降の河豚板の主な変更点 [#d8aab8cc]