EN JA
PICOBSD(8)
PICOBSD(8) FreeBSD System Manager's Manual PICOBSD(8)

名称

picobsdスモール FreeBSD ディスクイメージを構築する

書式

picobsd [ options][ config-name [ site-name]]

解説

picobsd ユーティリティは、最小実装の FreeBSD (歴史的に PicoBSD と呼ばれます) の生成に使用可能なスクリプトです。生成物は、典型的にはフロッピディスクのような小さなメディアに収まるか、 CDROM やフラッシュメモリのようなメディア、あるいは etherboot 経由から単一のイメージファイルとしてダウンロード可能なものです。

picobsd ユーティリティは、もともとファイアウォールやブリッジのような単純なスタンドアロンシステムを構築するために作られたものですが、サーバに存在するものとは違うソースツリーを使用してイメージをクロスビルドできるため、開発者にとっては、システムを再インストールせずに自分の書いたコードをテストできるので大変便利でしょう。

ブートメディア (歴史的にはフロッピディスクですが、小さな CD-ROM や USB メモリでもよい) は、ブートローダと、メモリファイルシステムを含む圧縮カーネルを含みます。メディアに依存しますが、追加ファイルをいくつか含むかもしれません。これらは、実行時に更新可能であり、メモリファイルシステム中のファイルの書き換え/更新に使用されます。

システムは、カーネルを通常の方法でロードし、メモリファイルシステムを伸長し、これをルートとしてマウントします。その後、メモリファイルシステムを、ブートメディアからのファイルで更新し (存在する場合のみ)、特別なバージョンの /etc/rc を実行します。ブートメディア (フロッピ等) は、ロードのためだけに必要であり、一般には、読み込み専用で使用されます。ブートフェーズ後は、システムは、完全に RAM で実行されます。

次のオプションが使用可能です (詳細は、 picobsd スクリプトも参照してください)。共通の操作のための最も重要なオプションは、 -src, -init, -n-v です。

--all_in_mfs
カーネル内に含まれているメモリファイルシステムイメージにあるファイルシステムの内容をすべて置きます。これは、デフォルトの動作であり、 etherboot または pxeboot(8) を使用して、完全に機能するシステムとしてカーネルそのものをロードできるため大変便利です。
-c, -clean
前回の構築時にできた生成物を消します。
--cfg file
追加設定コマンドを含むファイルを指定します。
--floppy_size size
ディスクイメージのサイズを設定します。フロッピーディスクのための典型的な値は、1440 または 2880 ですが、他のメディアのために (フラッシュメモリ、CDROM、ネットワークブートされたカーネル) 他の値を使用することができます。このオプションは、設定ファイル (イメージツリーの設定、または - -cfg) で指定されたもの) の内容によって上書きされることに注意してください。
--init
--src オプションと一緒に使用した場合、後で picobsd イメージを構築するのに必要となる< SRC_PATH> /../usr サブツリーを初期化します。
--iso
ディスクイメージ picobsd.bin に加えて、ISO イメージ、 picobsd.iso を生成します。
--modules
カーネルモジュールも構築します。カーネルモジュールは、 picobsd イメージには入りませんが、構築用ディレクトリには、利用可能なまま残っています。
-n
スクリプトを、非対話的にします。最初のメニューをスキップし、ユーザの入力を必要とせずに構築処理に進みます。
--no_all_in_mfs
floppy.tree に含まれているファイルを picobsd メージに残します。これにより、ファイルをカーネルとは別にロードすることができます (そして、個別にファイルを更新してイメージをカスタマイズできます)。
--no_loader
/boot/loader を省略して、カーネルをロードすために単に boot2 を当てにします。これは、いくらかの空間を節約しますが、4MB を超えるカーネルで問題があるかもしれません。
--objdir directory
以前の buildworld の結果があるディレクトリを指定する。これは、イメージを作成する前に、 - -init 呼び出しの必要性を省きます。
--src SRC_PATH
/usr/src にあるものではなく SRC_PATH にあるソースツリーを使用します。このオプションは、 picobsd イメージをクロス構築する際に便利です。このオプションを使用する際には、< SRC_PATH> /../usr にサブツリーを作成し、クロスビルドに必要な正しいヘッダファイルやライブラリ、そしてツール ( config(8) のような) を置いてツリーを初期化しておく必要があります ( --init オプションを参照してください)。ソースファイルは、 picobsd スクリプトによっては、変更されません。しかし、ソースツリーは、完全に読み込み専用であるというわけではありません。なぜなら、 config(8) は、カーネル設定ファイルがソースツリーのサブディレクトリにあるものとしていますし、また usr サブツリーを初期化する過程でソースツリーのいくつかの部分に触れてしまうからです (この動作は、リリースビルド用スクリプトのバグであり、時間がたてばこのバグは、取り払われるでしょう)。
-v
スクリプトを冗長表示にし、実行するコマンドを表示し、それらの実行前にユーザの入力を待ちます。デバッグ時に有用です。

環境

サイズ制限が極めて厳しいため、 picobsd の環境は、通常の FreeBSD といくつかの点で異なっています:
  • ダイナミックライブラリは、存在せず、 /usr/lib ディレクトリもありません。そのため、スタティックリンクした実行体のみ実行可能です。
  • 実行体のサイズを減らすため、特定のフロッピ内のすべての実行体は、 crunchgen(1) を利用して単一の実行体にまとめられています。
  • プログラムによっては、最小限のバージョンが提供されています。 ns は、 netstat(1) の機能限定版であり、 vm は、 vmstat(8) の機能限定版です。

PicoBSD の構築

picobsd のソースは、ディレクトリ /usr/src/release/picobsd の下の階層にあります。以下では、相対パス名は、すべてこのディレクトリからの相対位置です。

サポートされている構築スクリプトは、どこからでも実行することができる /usr/src/release/picobsd/build/picobsd です、そしてファイルシステムをマウントするために mdconfig か root の特権を必要としないでファイルシステムを構築するために sysutils/makefs ports に頼っています。対話型モードで実行するとき、 ( -n オプションなしのデフォルト)、利用者は、スクリプトによって PicoBSD イメージを構築するために使用される様々なパラメータを設定することができます。イメージは、以下で説明されるファイルとディレクトリを使用して設定されます。ベースシステムは、歴史的な理由から bridge と呼ばれるテンプレートを含んでおり、様々な種類のネットワークアプライアンス (装置) を構築するためのベースとして使用することができます。

利用者は、次のいくつかのファイルとディレクトリを含んで選んだ名前 (例えば、 FOO) でディレクトリを作成することによって、利用者独自の PicoBSD 設定を定義することができます。これらのファイルを作成するための詳細情報については、標準の picobsd の設定のどれか 1 つを参考資料として見てください。

PICOBSD
カーネル設定ファイル (必須)。これは、大抵の場合標準のカーネル設定ファイルですが、場合によっては、カーネルサイズを小さくするために必要のないドライバやオプションを削っているためファイルが小さくなっていることがあります。

picobsd カーネル設定ファイルとして認識されるためには、次に示すように“ #PicoBSD”で始まる行も含め、対応する MD_ROOT_SIZE オプションも含める必要があります:

#marker    def_sz  init   MFS_inodes    floppy_inodes 
#PicoBSD   4200    init   8192          32768 
options MD_ROOT_SIZE=4200      # def_sz と同じ

この設定でメモリファイルシステムのサイズをスクリプトに教え、イメージを構築する方法に関する他の詳細をいくつか与えます。

crunch.conf
crunchgen(1) 設定ファイル (必須)。この設定には、プログラムソースを含んだディレクトリのリスト、構築されるバイナリのリスト、およびこれらのバイナリプログラムが使用するライブラリのリストが含まれています。このファイルの文法に関する正確な詳細は、 crunchgen(1) マニュアルページを参照してください。

picobsd の設定を扱う際には、次の点がとりわけ重要です:

  • makefile のオプションに、makefile が理解できる構築用オプションを渡すことができます。プログラムのサイズを減らすためです。次の形式の行を用いて実現されます。

    buildopts -DNO_PAM -DRELEASE_CRUNCH ...
  • ソースファイルのあるディレクトリのリストを与えるときは、次のエントリを最初にリストしておくと便利です:

    srcdirs /usr/src/release/picobsd/tinyware

    こうすると、 picobsd 特有のバージョンのプログラムがこのディレクトリで見つけられるようになります。

  • 文字列“ @__CWD__@”は、 picobsd 設定ファイルが入っているディレクトリ (すなわち、 PICOBSD, crunch.conf などが見つかるディレクトリ) のフルパス名に置き換わります。設定ファイルのあるディレクトリの中に存在するソースコードを参照するのに便利でしょう。例えば、次のようにです。

    srcdirs @__CWD__@/src
config
picobsd スクリプトが読み込むシェル変数 (省略可能)。ここで最も重要な変数は、次のものです:
MY_DEVS
( FreeBSD 5.0 では、 devfs(5) がありますので使用されていません) イメージの /dev ディレクトリに作成されるべきデバイスのリストを設定すべきです (これは、 MAKEDEV(8) に渡される引数そのものですから、デバイスの名称については、そのマニュアルページを参照してください)。
fd_size
picobsd イメージのサイズ (キロバイト単位) です。デフォルトでは、 fd_size は、1440 に設定されます。この値では、標準のフロッピディスクに適したイメージを生成します。

CDROM にイメージを保存するつもりなら (例えば、“El Torito”フロッピエミュレーションを用いて)、 fd_size を 2880 に設定できます。ハードディスク (パーティション内もしくはディスク全体) にイメージをダンプするつもりなら、標準のフロッピサイズに制限されることはありません。それ自体がサイズの大きなイメージを使用しても実行時に RAM が浪費されることはありません。なぜなら、実際にイメージからロードされるファイルしかメモリ使用量には関わってこないからです。

import_files
フロッピツリー内に取り込まれるファイルのリストを含みます。絶対パス名の場合標準ファイルシステムを、相対パス名の場合使用しているソースツリー (すなわち SRC_PATH/..) のルートディレクトリを表します。通常、共有ライブラリやデータベースなどのファイルを取り込みたい場合に、 floppy.tree/ ディレクトリ配下の設定内でそれらのファイルの複製を最初に作らなくても良いように、このオプションを使用できます。
floppy.tree.exclude
標準フロッピツリーから得る、コピーしたくないファイルのリスト (省略可能)。
floppy.tree/
標準フロッピツリーへの、ローカルな追加 (省略可能)。このサブツリーの内容は、フロッピイメージにそのままコピーされます。
floppy.tree.< site-name>
上と同じですが、サイト固有です (省略可能)。

構築過程に関する更なる情報は、 picobsd スクリプトのコメントに記述されています。

別のソースツリーの使用

構築スクリプトは、別のソースツリーを使用するよう、 --src SRC_PATH オプションで指示可能です。指定するツリーは、カーネルおよびイメージに含める全プログラムのソースすべてを含む必要があります。例として、RELENG_4 ソースツリーを使って bridge フロッピをクロスビルドするには、次のようにしてできます:

cd <some_empty_directory> 
mkdir FOO 
(cd FOO; cvs -d<my_repository> co -rRELENG_4 src) 
picobsd --src FOO/src --init # これは 1 回だけ必要です 
picobsd --src FOO/src -n -v bridge

構築が成功するなら、ディレクトリ build_dir-bridge/ は、etherboot でダウンロードできる kernelpicobsd.bin と呼ばれるフロッピイメージ、と他のディレクトリでのコンパイルの生成物を含みます。 FOO/src のソースツリーを変更したいなら、単に次を実行することによって、新しいイメージを生成することができます。

picobsd --src FOO/src -n -v bridge

それに対して、変更がインクルードファイルまたはライブラリに影響するなら、例えば、次を再実行して、最初に、それらを更新する必要があります。

picobsd --src FOO/src --init # これは, 1 回だけ必要とされる

上記は、この種のあらゆる変更に対して通常行なわれるでしょう。

PicoBSD のインストール

フロッピのインストール

歴史的に、 picobsd は、単に、次のようにしてインストールができる、フロッピディスクから実行されます。

dd if=picobsd.bin of=/dev/rfd0

そして、フロッピは、いつでもブートできます。

ハードディスクのインストール

イメージをハードディスク (ボリューム全体もしくはスライスの 1 つ) に置くのにも同じプロセスが使用できます。

dd if=picobsd.bin of=/dev/ada2 
dd if=picobsd.bin of=/dev/ada2s3 
dd if=picobsd.bin of=/dev/ada2 oseek=NN

1 番目の形式では、イメージをディスク全体にインストールします。このときには、イメージは、フロッピに対するときと同じ方法で動作します。

2 番目の形式では、イメージをスライス番号 3 にインストールします (このスライスがイメージの内容を保存するのに充分な大きさを持っている必要があります)。しかし、このやり方は、指定したパーティションに正しいディスクラベルが入っていない場合にしか成功せず、正しいディスクラベルを持っている場合には、カーネルは、ラベルを上書きされないようにするでしょう。この場合、3 番目の形式を使うことができます。 NN のところは、実際のパーティションの開始位置で置き換えてください (開始位置は、 fdisk(8) を使用すると決定できます)。スライスにイメージを保存した後でも、まだ認識はされないということに注意してください。ラベルを正しく初期化するには、 disklabel(8) コマンドを使用しなくてはなりません (どうしてかは聞かないでください!)。初期化を行う 1 つの方法としては、

disklabel -w ada0s2 auto 
disklabel -e ada0s2

とし、エディタから実際のパーティションに対応する行を入力します。例えば、イメージが 2.88MB (5760 セクタ) である場合、パーティションに対して次の行を入力する必要があります:

a: 5760 0 4.2BSD 512 4096

この時点で、このパーティションは、ブート可能になります。イメージサイズは、スライスサイズ (パーティション“ c:”として示されます) よりも小さい可能性があることに注意してください。

CDROM のインストール

picobsd は、“El Torito”エミュレーションを使用しない picobsd.iso と名前が付けられた ISO イメージを作成できます、そのため、サイズの制限がありません。インストールは、ちょうどファイルをメディアに焼き付けることを意味します。

ネットワークからのブート

picobsd を用いたさらにもう 1 つの方法は、ネットワークからイメージをブートすることです。これを実現するためには、コンパイルによる副産物として入手できる非圧縮カーネルを使用する必要があります。さらなる詳細については、ネットワークブートに関するドキュメントを参照してください。 picobsd カーネルは、標準 FreeBSD kernel としてブート可能です。

PicoBSD のブート

picobsd をブートするには、フロッピを挿入してマシンをリセットします。ブート手順は、標準の FreeBSD ブートと似ています。フロッピからのブートは、普通は非常にゆっくりと進みます (1 〜 2 分というオーダです)。イメージをハードディスクやコンパクトフラッシュ、あるいは CDROM に保存している場合、事はずっと速く進みます。

また、利用者は、 picobsd の構築の副産物である前もってロードされている非圧縮のカーネルイメージをロードするために etherboot を使用することができます。この場合、10Mbit/s イーサネットでさえ、ロード時間は、数秒になります、

ブート後は、 picobsd は、メモリファイルシステムからルートファイルシステムをロードし、 /sbin/init を起動します。そして制御を 1 番目のスタートアップスクリプト /etc/rc に渡します。後者は、 /etc および /root ディレクトリにデフォルトファイル群と一緒に入っています。そして、ブートデバイスを同定し (フロッピやハードディスクのパーティション)、そして場合によっては、ルートファイルシステムの内容をブートデバイスから読み込んだファイルで上書きします。これによって、同一メディアにローカルの設定を保存することが可能です。このフェーズの後では、ユーザが明確に使用しようとしない限りブートデバイスは、もう使用されません。

この後、制御は、2 番目のスクリプト /etc/rc1 に渡ります (このスクリプトは、ブートデバイスから上書き可能です)。このスクリプトは、1 番最初にくるイーサネットインタフェースの MAC アドレスをキーに、そして /etc/hosts ファイルをルックアップテーブルに使用してホスト名とシステムとを関連づけようとします。そして、制御は、メインのユーザ設定スクリプト /etc/rc.conf に渡されます。このファイルは、 /etc/rc.conf.defaults で事前に設定されたいくつかの設定用変数の値を上書きするためにあります。 hostname 変数を用いて、同一ファイルから違った設定を作成することができます。制御が戻ってきたら、 /etc/rc1 は、初期化を完了し、このスクリプトの一部としてネットワークインタフェースを設定し、オプションでファイアウォール設定スクリプト /etc/rc.firewall を呼び出します。このスクリプトには、独自のファイアウォール設定を保存できます。

デフォルトでは、 picobsd は、すべてメインメモリから実行し、明示的に要求しなければスワップ領域は、持たないのだということに注意してください。 /etc/rc1 が制御を受け取った後では、ブートデバイスももう使用されません。何度も言いますが、明示的に要求しなければです。

PicoBSD システムの設定

picobsd システムの運用については、ブート時に読み込まれるいくつかのファイルを通して設定可能であり、標準の FreeBSD システムと大変良く似ています。しかしながら、保存しておくべきファイルおよび / もしくはカスタマイズすべきファイル数を減らし、それによってスペースを節約するために多少小さな違いがあります。設定ファイルの中では、違いがあるものには、次のものがあります:
/etc/hosts
伝統的に、このファイルには、IP とホスト名とのマッピングが入っています。このマッピングに加えて、 picobsd バージョンのものには、イーサネット (MAC) アドレスとホスト名とのマッピングも次のように含まれています:

#ethertable     start of the ethernet->hostname mapping 
# mac_address           hostname 
# 00:12:34:56:78:9a     pinco 
# 12:34:56:*            pallino 
# *                     this-matches-all

ここで、“ #ethertable”を含んだ行は、テーブルの始まりを表しています。

MAC アドレスが見つからなかった場合、このスクリプトは、システム用のホスト名と IP アドレスを入力するよう促します。そしてこの情報を (メモリ上の) /etc/hosts ファイルに保存し、後で簡単にディスク上に保存できるようにします。

アドレス部には、ワイルドカードを使用できますので、例の最後の行のようにすると任意の MAC アドレスにマッチし、システムに入力要求をさせないようにできるということに注意してください。

/etc/rc.conf
このファイルには、システムの運用状況を制御する変数がいくつか含まれています。例えば、インタフェース設定、ルータ設定、ネットワークサービスの起動などです。これらの変数の正確なリストおよびその意味については、 /etc/rc.conf.defaults を参照してください。

これらの変数の中には、 /etc 中のファイルの内容をいくつか上書きできるようにするものがあるということに触れておく価値はあります。このオプションは、さしあたり /etc/host.conf および /etc/resolv.conf 用に利用可能です。これらのファイルの内容は、一般的にとても小さく、この種の更新を行うには向いています。これらの変数を使用する場合、改行を適切に使うことを忘れないでください。例えば、次のようにです。

host_conf="# この行は /etc/host.conf に入ります 
hosts 
bind"

必須というわけではありませんが、このファイル中では、 /etc/rc.conf.defaults で示される変数しか設定してはいけません。そして、ネットワークが起動しているかどうかに依ってしまうサービスは、起動させずにおくべきです。ネットワークの起動は、後からでも行えます。 firewall_enable=“ YES”に設定した場合、 /etc/rc.firewall スクリプトがネットワークインタフェースの設定後に起動されますので、ファイアウォールを設定し、安全にネットワークサービスを起動したり、ルーティングやブリッジなどを有効にしたりできます。

/etc/rc.firewall
このスクリプトは、 ipfw(4) ファイアウォールを設定するために使用することができます。エントリ時に、 fwcmd 変数は、ファイアウォール用コマンドのパス名に設定されます。 firewall_type には、 /etc/rc.conf ファイル中で設定された値が入っており、 hostname には、ホストに割り当てられた名前が入っています。

update という名前の小さなスクリプトがあり、これを用いてブート後に変更したファイルを編集したり、ディスクに保存したりできます。このスクリプトは、1 つまたはそれより多い絶対パス名を取り、引数として渡されたファイルに対してエディタを実行し、そしてファイルを圧縮したコピーをディスクに保存します (この操作の前後でディスクをマウント / アンマウントします)。

引数無しでこのスクリプトを起動した場合、 update は、 rc.conf, rc.firewall および master.passwd ファイルを編集し、保存します。

引数の 1 つが /etc (ディレクトリ名だけ) である場合、このコマンドは、/etc ディレクトリにあり、 (例えば、前回の update の結果) すでにコピーがディスク上にあるファイルをみなディスクに (編集せずに) 保存します。

作者

Luigi Rizzo <luigi@iet.unipi.it>他によってスクリプトでその後の作業とともに、 Andrzej Bialecki <abial@FreeBSD.org。>マニュアルページと Makefile のは、 Greg Lehey <grog@lemis.com>によって作成されました。

バグ

文書は、まだ不完全です。
October 1, 2013 FreeBSD