#topicpath
RIGHT:川俣吉広
RIGHT:EBUG 第29回会合 - 2009, 2/21
*LiveCD河豚板のUSB boot対応 [#ldb19a88]
*LiveCD「河豚板」のUSB ブート対応 
[[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つのイメージを開しています。
2008年末にUSBメモリからの起動に対応しました。
現在、布サイト((http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/ , http://livecd-mirror.ebug.jp/LiveCD/))上では、
CD-ROM用・USBメモリ用、二種類のイメージファイルを開しています。

今回は、このUSB boot対応の容、および[[前回(2007年5月)の発表>EBUG勉強会/LiveCD/2]]以降の状況などについて説明します。
**発端 [#r17a7fed]
ebug members MLでの某氏の発言が発端
>''神'' - '''河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?''' ~
''川'' - '''USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールしても動くんじゃないですかね?'''
今回は、このUSB ブート対応の容、および[[前回(2007年5月)の発表>EBUG勉強会/20070519_LiveCD_2]]以降の状況などについて報告します。
----
#contents
----
**発端 
USB ブート対応のきっかけとなったのは、ebug members MLでの以下のようなやりとりです;
>''神'' - '''河豚板をCDドライブのないネットブックで動かしたいんだけど、USB boot対応できますかね?''' 

で、やってみたところ、通常の方法でOpenBSDをインストール、起動できることを確認((某氏はFreeBSDでも追試))。
河豚板のUSB boot対応にとりかかりました。
**河豚板のしくみ おさらい [#uc366925]
今回のUSB boot対応の概要を理解するため、まず河豚板のブートの仕組みとファイルシステムの構成について概観してみます。
***カーネル起動直後まで [#uc1017f5]
BIOSによってブートローダ(CDの場合はEl Torito規格、HDDの場合はMBRから)が読み込まれ、続いて二次ローダ (/cdboot or /boot)が、最後に
カーネル (/bsd)が起動します。~
カーネル起動直後の河豚板のファイルシステム状は以下のようになっています。
>''川'' - '''USBメモリがBIOSとOpenBSDカーネルの両方からHDDとして認識できてれば、OpenBSDを素でインストールしても動くんじゃないですかね?'''

で、やってみたところ、HDDに行う通常のインストール方法でOpenBSDを起動できることを確認((某氏はFreeBSDでも追試))。
これをふまえて河豚板のUSB ブート対応にとりかかりました。
**おさらい - 河豚板の起動のしくみ 
今回のUSB ブート対応の概要を理解するため、まずLiveCD版河豚板の起動のしくみとファイルシステムの構成について概観してみます。
***カーネル起動直後まで 
まず、BIOSによって初期ブートローダ(El Torito規格により指定されたローダ、OpenBSDではcdbr)がよみこまれ、つづいて二次ローダ (cdboot)が、そして最後に
カーネル (bsd.mp)が起動します。~
カーネル起動直後の河豚板のファイルシステム構成を以下の図に示します;
|CENTER:&ref(fuguita.gif);|
|CENTER:カーネル起動直後のファイルシステム(概要)|
ルートファイルシステムとなっているrdデバイスはカーネルにあらかじめ組込まれており、
カーネル起動と同時にルートにマウントされます。これはFDDインストーラなどで使われている技術です。
ルートファイルシステムとなっているrdデバイスはカーネルにあらかじめくみこまれており、
カーネル起動と同時にルートにマウントされます。これはOpenBSDのFDインストーラなどでつかわれているテクニックです。

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

このあと、通常のBSDの起動シーケンスにのっとり、/sbin/init が起動、つづいて /etc/rc が実行されます((実際にはそれぞれ、/boottmp/init , /boottmp/rc))。
***通常の運用状まで [#k2152b78]
/etc/rc (実際は、/boottmp/rc)は概ね、以下のような動作をします;
-mfs, CD-ROMのマウント
-動作モードの選択
-キーボード形式, ルートパスワード, ネットワークパラメータなどの設定、(あるいは、以前保存したメディアから設定を復帰)。~
... (どちらにするかは、指定された動作モードによる)
***通常の運用状まで 
/sbin/initからよびだされた /etc/rc (実際は、/boottmp/rc)はおおむね、以下のような動作をします;
-CD-ROMのマウント、mfs((mfs: memory file system - いわゆるRAM Diskに相当))の作成とマウント、/etc/fstabの生成
-ユーザからの動作モード指定をよみとる
-キーボードタイプ, ルートパスワード, ネットワークパラメータなどの設定(もしくは、以前保存したメディアからの設定を復帰 ... どちらの動作かは、前で指定された動作モードによる)

これらの初期化を終えたあと、/fuguita/etc/rc に制御を移します。これ以降はOpenBSDネイティブの処理が実行されます。~
最終的に運用状になった時点でのファイルシステムの状態は以下のようになります;
これらの初期化が正常に終了すると、/cdrom/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
というようにリンクが辿られます。
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の追加を可能にするため」です。~
LiveCDの場合、通常このような機能は「スタッカブルファイルシステム」などを使うことによって実現しますが、
OpenBSDではスタッカブルファイルシステムは実されていないため、河豚板では今述べたような方法を採用しています。
なぜこのようなややこしいことをするのか? それは、
>/usr以下をread onlyにせず、ファイルのおきかえを
可能にすることによって、securityアップデートやports/packagesの追加を可能にするため

また、/mfs以下の大半をシンボリックリンクで置き換えることで、
/mfs以下の容を保存する場合に必要なファイル容量も大幅に低減することができています。
**変更作業 [#l47cfa24]
まず、冒頭の「発端」でも触れたように、OpenBSDを通常のインストーラを用いて
USBメモリにインストール((OpenBSDからは、SCSIディスクとして見える))し、起動試験を行ってみました。
-結果 ... ハードウェアによって、起動できるものとできないものがある。
です。このような機能は「スタッカブルファイルシステム」をつかうことなどによって実現できますが、
OpenBSDではスタッカブルファイルシステムは実されていません。
よって、河豚板では、このシンボリックリンクをもちいる手法を考案し、実しました。

ネット上の報を調べたところ、USB bootをサポートするBIOSであっても、ストレージデバイスをHDDとして認識するものと、
Removable Diskとして認識するものがあり、後の場合はUSBデバイスに通常のインストールを行った
OpenBSDは起動できないようであることが判明しました。~
起動が不可能な場合、二次ローダが出力するプロンプト ''boot>'' も出力されません。
このことからも、やはりBIOSがMBRを読み込めていない(=HDDとして認識していない)可能性が高いと推測されます。
くわえて、副次的な利点となりますが、/mfs以下の大半をシンボリックリンクでおきかえることにより、
/mfs以下の容を保存する場合に必要なファイル容量を大幅に低減することもできています。
**USB ブート対応作業の実際 
まず、冒頭の「発端」でもふれたように、OpenBSDを通常のインストーラをもちいて
USBメモリにインストール((OpenBSDからは、SCSIディスクとして見える))し、起動試験をおこなってみました。
-起動試験の結果 ... ハードウェアによって、起動できるものとできないものがある。

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

とりあえず、河豚板のUSB boot対応は、前のBIOSを対象として実施することとしました;
どうやらUSB ブートでは、CD-ROMでのEl Torito規格のような標準規格が存在せず、機種によって動作がちがってくる場合も多あるようです。

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

-方針と実装
--USB用の別バージョンは作成しない。単一のスクリプトでCD-ROM / USB両対応とする。~
... 別バージョン作ると、開発・保守の手間が2倍になる(一人でやってるので、これはツライ!!)。
--USB用の別バージョンは作成せず、単一のスクリプトでCD-ROM / USBメモリ両対応とします。~
... 別バージョンつくると、開発・保守の手間が2倍になります(一人でやってるので、これは非常にキビシイ!!)。

--USBであっても、read onlyでマウントする。~
... USBの書換え回数の問題が回避できるから。
--USBメモリであっても、read onlyでマウントします。~
... これによって、フラッシュメモリデバイスの書換え回数制限の問題を回避することが期できます。

--USBデバイスに導する場合は、HDDと同様にパーティショニングやブートローダの書き込みが必要なため、
本来インストーラが要になる。
とはいえ、インストーラまで作ってられないのでとりあえず生のディスクイメージを作成し、それを布する。
--USBメモリに導する場合も、HDDと同様にパーティショニングやブートローダのかきこみが必要なため、
本来はインストーラを用意するのがのぞましいのですが、
とりあえず生のディスクイメージを作成し、それを布することにします。

--いままでCD-ROM決め打ちでやっていた部分を変更。
--いままで「デバイスファイル /dev/cd0a を /cdrom にマウントする」という決め打ちを想定してコーディングしていた部分を修正します;
---/cdrom を /fuguita に名称変更
---OSに認識されたストレージデバイスを順次スキャンし、河豚板のっているメディアを検出する。
---前のメディアをデフォルト値とし、実際に /fuguita にマウントするデバイスをユーザに尋ねる。
---OSに認識されたストレージデバイスを順次スキャンし、河豚板のはいっているメディアを検出
---前のメディアをデフォルト値とし、実際に /fuguita にマウントするデバイスをユーザにたずねる。
---ユーザデータ保存機能など、関連するサポートツールの改造
---ビルドツールの機能追加と変更
---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版以前に保存したデータは''非互換''となりました。
冒頭紹介した「発端となった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フラッシュ対応のOpenBSDは、他に ''flashboot'' ( http://www.mindrot.org/projects/flashboot/ )というものが開発されており、
主に Soekris Net4{5,8}xxのような組み込みプラットフォームでの使用を想定しているようです。
**2007年5月以降の河豚板の主な状況 [#d8aab8cc]
リリース状況 (括弧の数字は、security fix対応などのマイナーリリース回数)
-USBメモリ版の布イメージをHDDに上書きすれば、HDDでの運用も可能です。~
... ''注意: パーティションテーブルも上書きされます!!''

-''ご注意'': CD-ROM版だけの頃から存在していた「USBメモリへのユーザデータ保存機能」は、USB対応版でもひきつづき使用できます。
ただし、USB版実にともないデータを保存するパーティションが変更となったため、USB版以前にデータを保存したメディアは''現バージョン用の保存メディアとは互換性がなくなりました''。~
... あたらしく保存メディアを作成し、データを手動でコピーすれば引越しできます。

-フラッシュメモリ対応のOpenBSDは、他に ''flashboot'' ( http://www.mindrot.org/projects/flashboot/ )というものが開されています。
おもに Soekris Net45xx, Net48xxのような組み込みプラットフォームでの使用を想定しているようです。
**2007年5月以降のリリース状況 &size(14){(括弧の数字は、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上で作成(欧州某方面からの要請による)
--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をご提供頂きました。
--マルチプロセッサ用カーネル ''/bsd.mp''を追加収録。起動も bsd.mpがデフォルトに。~
...ユニプロセッサ用カーネルの場合、マルチコアのCPUでブート時にかたまる事例がありました((逆に、ユニプロセッサな機種でマルチプロセッサ用カーネルを使用すると、(電源スイッチをおしてさえも)電源断ができなくなるケースもありました。))。
--/boottmp/rcのこまかい修正を多数実施
--dig氏より、CD-ROMラベル用アートワークをご提供いただきました。

**最後に [#k06c227f]
河豚板はKnnopixやSlax、あるいはFreeSBIEのようなメジャーなLiveCDのような
判り易く綺麗な外観は持っておりませんが、OpenBSD自身が持つ機能はほぼて盛り込んでいます。
そのため、HDDへの通常インストールと同じ感覚で使用できます。
**最後に 
メジャーなLiveCD、たとえばKnoppixやUbuntu、あるいはFreeSBIEなどのおおくは、
どれも親しみやすく、美しい外観をもっています。~
河豚板はそこまで初心フレンドリな環境ではないのですが、
OpenBSD自身がもつ機能はほぼすべてもりこんでいます。
そのため、河豚板はHDDへ通常インストールしたOpenBSDとおなじ感覚で使用できます。

また、追加でインストールされている各種パッケージを組み合わせると、
色んな技を試せます。例えば、
-フェイルオーバ、帯域制御機能付のファイアウォール(しかもIPv6完対応 :-)
-HTTPプロキシを経由して、Layer2トンネルを通す(しかも圧縮&暗号化機能付き!!)。~
...さらに、そこを通ってWindowsマシンにログオン、とか...
また、OS本体のほかに追加収録されている各種パッケージをくみあわせて、
いろいろな技をためすこともできます。たとえば、
-フェイルオーバ、帯域制御機能つきのファイアウォール(しかもIPv6完対応 :-)
-HTTPプロキシを経由して、Layer2トンネルをとおす(しかも圧縮&暗号化機能つき!!)。~
...さらに、そのトンネルのむこうのWindowsマシンにリモートデスクトップ接続、とか...
-Transmissionでお手軽BitTorrent tracker/seeder
-いつでもどこでもプログラミング。Schemeでも遊べちゃう。GUIだって作れるよ。
-映像・音声メディアの視聴は勿論、動画エンコード、CD/DVDのリッピング&焼きにも対応してます。
-いつでもどこでもプログラミング。SchemeでもあそべちゃうしGUIだってつくれるよ。
-映像・音声メディアの視聴はもちろん、動画エンコード、CD/DVDのリッピング&焼きにも対応してます。

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

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


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