FreeSBIE2 Howto

はじめに

このページではFreeSBIE 2のツールキットを利用したFreeBSD 6.1-RELEASEベースの1CDシステムの作成方法について説明します。ターゲットとしては、本家で配布しているISOイメージやKnoppixのようなLiveCDでは'''無く'''、昔はやった(?)1FDシステムのCD版の構築を想定しています。組み込むpackageを変更すれば上記LiveCDのような物も構築できますので、日本語版FreeSBIE LiveCDのようなものの構築に関心のある方にも参考になると思います。

FreeSBIEとは

FreeSBIEは、FreeBSDベースのLiveCD、もっと簡単に言うと、ハードディスクを書き換えることなくCDから直接起動するFreeBSDベースのOSです。FreeSBIEでは、こうしたLiveCDを作成するために、簡単に利用可能で拡張性の高いツールキットも開発しており、このツールキットはminiBSDやnanoBSDのようなCD-ROMイメージの作成に利用することも出来ます。(本家Topページより)

ツールキットの特徴

ツールキットとしてのFreeSBIEは、以下のような特徴を持っています。

  • Makefile+スクリプト群で構成された見通しの良いシステム
  • make pkgselectでCD-ROMに組み込むpackageの選択が可能
  • 簡潔にまとまった設定ファイル
  • make1発でISOイメージの作成まで自動的に実行

これらの特徴からも分かるように、慣れてしまえば楽にオリジナルのLiveCDを構築できる非常に便利なツールではあるのですが、ちょっと癖の強い一面も持っています。

注意点

FreeBSIEを使っていくうちに分かってきた注意点としては、以下のようなものが挙げられます。

  • CDにインストール可能なpackageは構築用環境にインストールされているものだけ
  • packageのコンパイルは構築用環境で行われるので、CD専用のmake.confを使うとpackageを作成したシステムとCD-ROMに焼かれるシステムとの間に不整合が生じる
  • CD構築用の作業領域がOSのベースから完全には分離されておらず、標準の設定で作業するとオブジェクトファイル群(/usr/obj以下)を上書きしてしまう。
  • スクリプトに癖があり、設定ファイルの書き方を間違えると作業環境のシステムを最悪壊してしまう
  • MINIMALセットではブートしないイメージが出来てしまう(??)

以下では、上記の注意点を回避したり放置したりしつつ、CDイメージを作成する方法について説明します。

作業環境の準備

なぜ作業環境を準備するのか?

上記注意点の項にも書いたとおり、FreeSBIEは下手をすると本体のシステムを書き換えて壊してしまいかねない危険なツールですので、確たる理由が無ければ本体とは隔離された環境を構築してそこで作業するようにしたほうが安全です。また、おいおい説明していきますが、CDに組み込むアプリケーションの構築環境とCDに実際に焼かれる環境とを統一するといった意味でも作業環境の構築にはメリットがあります。 ちなみに、ほとんど何もpackageを入れていない環境でISOイメージの作成まで完了した状態で、2GB強のディスク容量が必要でした。

以下では、jail(8)のマニュアルに記載されている方法を応用して、ISOイメージ作成用の作業環境を構築する手順を説明します。

作業環境の構築

まずは、ディレクトリツリーのベースを作成します。やり方はjail(8)のマニュアルに書いてある方法そのままです。利用するシェルとしてcshを想定していますので、sh系のシェルで作業をする場合は、適宜コマンドを読み替えてください。
setenv D /path/to/FreeSBIE/root
cd /usr/src
mkdir -p $D
make world DESTDIR=$D
make distribution DESTDIR=$D
mount_devfs devfs $D/dev ソースツリーとports, /etc以下もコピーします。まじめにjail用の環境を作るわけではないので、この辺は手抜きです。
cd /usr/src
tar cf - . | tar xfC - $D/usr/src
cd /etc
tar cf - . | tar xfC - $D/etc
cd /usr
tar cf - ports | tar xfC - $D/usr/ 以上で準備は完了です。後の作業は$Dにchrootして行います。FreeSBIEのスクリプトは内部でchflagsやmount/umountコマンドを使っているので、jailではうまくいきません。
chroot $D

FreeSBIEのインストール

環境の準備が整ったら、FreeSBIEのツールキットを'''作業環境に'''インストールします。

しつこいようですが、'''先ほど作成したディレクトリ($D)にchrootするのを忘れないで下さい。'''

FreeSBIEのツールキットはPorts Collectionに含まれていますので、これを使ってインストールします。
cd /usr/ports/sysutils/freesbie/
make install
make distclean これで、($D)/usr/local/share/freesbie にツールキットがインストールされます。

以上で作業環境の準備は完了です。ちなみに、'''外の環境にはFreeSBIEをインストールしない'''ようにしましょう。そうすることにより、/usr/local/share/freesbie の有無で、現在外の環境と作業環境のどちらで作業中なのかを判断することができ、混乱を防げます。

ISOイメージの作成

freesbie.confの修正

make.confの修正

ports/packagesのインストール

FreeSBIEでは、CDに組み込むアプリケーションをmake pkgselectというコマンドを実行することによって自由に選択することが出来ます。ただし、CDに組み込むことが出来るのは、作業環境に既にインストールされているpackageのみです。そこで、準備の最終段階として、CDに組み込みたいアプリケーションを作業環境にインストールします。方法としては、sysinstallを起動して[Configure]->[Package]を使ってバイナリをインストールする、上で解説したFreeSBIEと同様にPorts Collectionを使ってコンパイル、インストールする、あるいはportupgradeなどの管理用アプリケーションを使ってインストールするなどいくつかありますが、ハンドブックの第4章に詳しい解説がありますので、参考にしてください。

通常の環境で/etc/make.confやportupgrade packageの/usr/local/etc/pkgtools.confを使ってコンパイルオプションを設定していて、その設定を作業環境にも反映させたい場合には、($D)/etc/make.confや($D)/usr/local/etc/pkgtools.confにあらかじめコピーしておく必要がありますので注意しましょう。

ファイルの追加・上書き

ブートローダやカーネルに埋め込まれるユーザ名・ホスト名の変更

ISOイメージを作成すると、ブートローダやカーネルの起動時のメッセージの中に、ISOイメージを作成したユーザ名およびホスト名が表示されます。それらの内容を変更するには、環境変数USERとHOSTNAMEをセットします。
setenv USER <ユーザ名>
setenv HOSTNAME <ホスト名>

ISOイメージの動作確認と修正

Virtual PCを使ったISOイメージのテスト

作成したCD-ROMのイメージをテストするのに、いちいち焼いていたのではお金と時間を浪費するばかりです。そこで、ここではVirtual PCを使ったテスト方法について簡単に説明します。Virtual PCのインストールや使い方の具体的な方法についてはここでは書きませんので、こちらの検索結果のリンク先を参考にして下さい。

  1. 作成したFreeSBIEのISOイメージをコピーしておきます。
  2. Virtual PCをインストールします。
  3. テスト用のバーチャルマシンを作成します。
  4. 作成したバーチャルマシンを起動します
  5. 立ち上がったウィンドウのメニューに「CD(C)」という項目があるので、そこをクリックしてメニューを開き、「ISOイメージのキャプチャ(I)」をクリックします。
  6. ファイル選択のダイアログが表示されるので、最初にコピーしたISOイメージを選択します。
  7. もし、既に以下のようなメッセージが表示されていたら、メニューの「操作(A)」→「リセット(R)」をクリックしてVirtual PCを再起動します。
    Reboot and Select proper Boot device
    or Insert Boot Media in selected Boot device

これでOSが正しく起動するかどうか確認します。何か問題が見つかったらISOイメージを作成しなおします。

ISOイメージを作り直す

テストで問題が見つかりISOイメージを作り直す必要が出てきた時に、ツールキット標準のmake clean を使うと、全て作り直しになって時間をとられます。正攻法としては、freesbie.confのNO_BUILDWORLDやNO_BUILDKERNELオプションを必要に応じて変更するということになりますが、ここでは少し手を抜く方法を説明します。

ツールキットの工程管理

具体的な方法の説明に入る前に、ツールキットがどのようにして工程管理を行っているのかを説明します。

ツールキットでは、ISOイメージ作成までの作業工程をユーザーランドのコンパイル(buildworld)、カーネルのコンパイル(buildkernel)、ユーザーランドの(CD用環境への)インストール(installworld)、カーネルのインストール(installkernel)、パッケージのインストール(pkginstall)、拡張機能のインストール(extra)、ファイルシステムのクローンの作成(clonefs)、ISOイメージの作成(iso)という8段階に分けています。また、それぞれの工程が完了したときには .done_buildworld, .done_isoのように、頭に'.done_'のついたファイルを作り、それらのファイルの有無を各工程の終了判定に用いています。つまり、これらのファイルを削除することによって、必要な工程のみを実行することが可能になります。

修正内容に応じた工程のやり直し

では、具体的に修正箇所に応じてどの工程をやり直せばよいのか見ていきます。

カーネルの再構築:カーネルコンフィグレーションを変更したりしてカーネルの再構築が必要になった場合、.done_buildkernel, .done_installkernel, .done_clonefs, .done_iso を削除してmakeコマンドを実行します。
ユーザーランドの再構築:ユーザーランドの再構築が必要になった場合、done_buildworld, .done_installworld, .done_clonefs, .done_isoを削除してmakeコマンドを実行します。
extraへのファイルの追加と差し替え:extraディレクトリ以下に置いたファイルを追加・差し替える場合、新たしいファイルを置いた後、.done_extra,. done_clonefs, .done_isoを削除してmakeコマンドを実行します。
extraからのファイルの削除:実はこれが一番厄介なパターンです。なぜなら、追加・差し替えと同じ方法を使うと古いファイルが残ってしまうからです。手っ取り早い(が間違いを犯しやすい)方法としては、extra以下とBASEDIR以下の該当するファイルを削除して、.done_extra, .done_clonefs, .done_isoを削除した上でmakeを実行するというやり方がありますが、確実な方法として以下をお勧めします。
  1. sh ./scripts/launch.sh cleandir を実行して、BASEDIR, CLONEDIRを削除する
  2. .done_installworld, .done_installkernel, .done_extra, ,done_pkginstall, .done_clonefs, .done_iso を削除する
  3. make を実行してISOイメージを作り直す
パッケージの追加と削除:パッケージを追加・削除する場合、make pkgselectを実行してパッケージを選択した後、.done_pkginstall, .done_clonefs, .done_iso を削除してmakeコマンドを実行します。pkginstall.shスクリプトは内部でpkg_delete -aを実行していったん全てのパッケージを削除してからパッケージの再インストールを行いますので、削除した時などにイメージ内に古いパッケージが残る心配はありません。
パッケージの更新(未検証):未検証ですが、パッケージを更新する場合、まずCD構築用の環境でパッケージを更新してからmake pkgselectを再実行してインストールするパッケージのバージョンを最新の内容に修正してから、パッケージの追加・削除と同じ手順でイメージを作り直せば大丈夫と思われます。
make.confを修正した場合:make.confを修正すると、ユーザーランドやカーネル、パッケージのコンパイルオプションが変わる可能性がありますので、変更の影響範囲に確信が無い場合、make cleandir して全てを再構築するのが無難でしょう。

賢明な方は、ここまで読んで、実はBASEDIR以下を直接変更して.done_clonefs, .done_isoを削除、makeという手順がISOイメージを作るだけなら一番手っ取り早いということに気付かれたかと思いますが、その方法ではまっとうな手順でイメージを作り直す際に変更した内容を再現できないというミスを犯す可能性が高まりますので、あえて避けています。

あと、ISOイメージを完全に再構築するためには、make cleanではなく、make cleandir を使う必要があるというのも覚えておくと良いでしょう。

実機での動作確認

Virturl PCでの動作確認が完了したら、いよいよISOイメージをCDに焼いて実機での動作確認です。基本的には動作確認は終わっていますので、そのまま動くはずです。ただし、私がそうだったのですが、古いマシンを復活させようとか、古いバージョンで動いていたものを6系の環境で動かそうとすると、いろいろとトラブルに遭遇します。そうしたトラブルに遭遇した場合でも、あきらめずに以下を試してみてください。

トラブルシューティング

ここでは、私が経験した事柄を元に、いくつかのトラブルシューティングについて説明します。

まず、古いPCを使おうとしている場合は、ここまで述べてきたような全ての作業を開始する前に、公式ページ等から入手可能な6.1-RELEASEのインストールディスクでOSが正しく起動し、インストールメニューまで進むかどうか確認しましょう。できれば、つぶしても良いHDDを接続して、インストールまでできるかどうか確認するのが望ましいでしょう。インストールディスクが起動したという実績があれば、『動かないはずは無い』という確信を持ってその後の作業が出来ますので、これほど心強いものはありません。 不幸にしてインストールディスクが起動しない場合でも、あきらめるのはまだ早いです。次の事柄を試して見ましょう。

ブートローダの読み込みに失敗する:CD-ROMドライブがSeconday Masterになっている場合、ブートローダの読み込みに失敗することがあります。CD-ROMのジャンパを確認してSlaveにしてみましょう。
起動の途中でフリーズする:起動メニューで'''2. Boot FreeBSD with ACPI disabled'''を選択して起動するかどうか確認して下さい。これでうまくいった場合、作成するCD-ROMの/boot/device.hintsに「hint.acpi.0.disabled="1"」という行を追加する必要があります。

私がインストールディスクで経験したトラブルは以上です。これ以下は作成したCD-ROMで発生するトラブルについての記述となります。

CD-ROMのマウントに失敗する:原因が良く分からないのですが、起動の途中で以下のようなメッセージが表示されて、/ ファイルシステムのマウントに失敗することがあります。
Trying to mount root from cd9660:/dev/iso9660/FreeSBIE

Manual root filesystem specification:
<fstype>:<device> Mount <device> using filesystem <fstype>
eg. ufs:da0s1a
? List valid disk boot devices
<empty line> Abort manual input

私が遭遇したケースでは、freesbie.confでMINIMAL=YESを指定して、カーネルも最小限の機能のみにした時に上記のトラブルが発生し、それらの設定を解除することによって解消しました。カーネルのどのオプションとか、make.confのどのオプションが作用しているのかまでは追っていません。

「Trying to mount root from cd9660:/dev/iso9660/FreeSBIE」と表示されたところで固まってしまう:古いマザーボードでUDMAに対応していないのに、カーネルがUDMAモードでCD-ROMにアクセスすると、このような現象が起きる場合があるようです。起動メニューで'''6. Escape to loader prompt'''を選択して、
set hw.ata.atapi_dma="0"
boot

と入力し、うまく起動するようであれば、CD-ROMの/boot/loader.confに、hw.ata.atapi_dma="0"という行を追加することにより、この問題を回避できます。


Last modified:2009/12/12 11:01:25
Keyword(s):
References:[雑記録] [SideMenu]