スポンサーリンク

PICOBSD(8) FreeBSD システム管理者マニュアル PICOBSD(8)

名称

picobsd − フロッピディスクベースの FreeBSD システム

書式

picobsd [options] [floppy-type [site-name]]

解説

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

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

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

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

次のオプションが使用可能です (詳細は picobsd スクリプトも参照してくださ い):

       −-src SRC_PATH

/usr/src にあるものではなく SRC_PATH にあるソースツリーを使用しま す。このオプションは、フロッピイメージをクロスビルドする際に便利 でしょう。このオプションを使用する際には、 ⟨
SRC_PATH
/../usr に サブツリーを作成し、クロスビルドに必要な正しいヘッダファイルやラ イブラリ、そしてツール (config(8) のような) を置いてツリーを初期 化しておく必要があります (後述の −-init オプションを参照してくだ さい)。ソースファイルは picobsd スクリプトによっては変更されませ ん。しかし、ソースツリーは完全に読み込み専用であるというわけでは ありません。なぜなら、 config(8) はカーネル設定ファイルがソースツ リーのサブディレクトリにあるものとしていますし、また usr サブツ リーを初期化する過程でソースツリーのいくつかの部分に触れてしまう からです (この動作はリリースビルド用スクリプトのバグであり、時間 がたてばこのバグは取り払われるでしょう)。

−-init
−-src
オプションと一緒に使用した場合、後で picobsd イメージを構築 するのに必要となる ⟨
SRC_PATH
/../usr サブツリーを初期化します。

−-modules
カーネルモジュールも構築します。カーネルモジュールはフロッピイ メージには入りませんが、構築用ディレクトリには利用可能なまま残っ ています。

−n
スクリプトを、非対話的にします。最初のメニューを表示せず、ユーザ の入力を要せずに構築処理に進みます。

−v
スクリプトを冗長表示にし、実行するコマンドを表示し、それらの実行 前にユーザの入力を待ちます。デバッグ時に有用です。

−-all_in_mfs
カーネル内に含まれているメモリファイルシステムイメージにあるファ イルシステムの内容をすべて置きます。これはデフォルトの動作であ り、 etherboot もしくは pxeboot(8) を使用して、完全に機能するシス テムとしてカーネルそのものをロードできるため大変便利です。

−-no_all_in_mfs
floppy.tree
に含まれているファイルをフロッピイメージに残します。 これにより、ファイルをカーネルとは別にロードすることができます ( そして、個別にファイルを更新してフロッピイメージをカスタマイズで きます)。

−-floppy_size size
フロッピイメージのサイズを設定します。 CDROM に焼くイメージ用 に、1440 以外の値を使用可能です。

−c, −clean
前回の構築時にできた生成物を消します。

環境

サイズ制限が極めて厳しいため、 picobsd の環境は通常の FreeBSD といくつか の点で異なっています:

 ダイナミックライブラリは存在せず、 /usr/lib ディレクトリもありません。そのため、スタティックリンクした実行体のみ実行可能です。

実行体のサイズを減らすため、特定のフロッピ内のすべての実行体は、 crunchgen(1) を利用して単一の実行体にまとめられています。

プログラムによっては最小限のバージョンが提供されています。 nsnetstat(1) の機能限定版であり、 vmvmstat(8) の機能限定版です。

PicoBSD の構築

picobsd のソースはディレクトリ /usr/src/release/picobsd の下の階層にあり ます。以下では、相対パス名はすべてこのディレクトリからの相対位置です。 picobsd の構築過程は、時とともに少し変化しました。コード量がやむなく増加 していることに対応するため、なるべく多くのものをフロッピに詰め込むための からくりがだんだんと多く必要となったからです。 FreeBSD 4.3 以降では、サ ポートされている構築スクリプトは /usr/src/release/picobsd/build/picobsd であり、どこからでも実行可能です。対話的モードで実行した場合 (−-n オプ ションをつけなければこれがデフォルトです)、スクリプトによってフロッピイ メージを構築するのに使用されるさまざまなパラメータを設定可能です。認識す るフロッピイメージは次の種類があります。私達は、このイメージを機能するも のに維持し、カーネルおよびアプリケーションのサイズがやむを得ず大きくなっ ていますがそれでも 1.44MB フロッピに収まるように努めています。

       bridgeブリッジ、ルータおよびファイアウォールに適した設定です。

次の設定も存在はしますが、参照するにとどめてください。これらの設定の多く はもう直せないほど古いものになっていますし、体裁を整える努力はなんら払わ れていません。

dial ダイヤルアウト (ppp(8)) ネットワークに適した設定です。

isp ダイヤルイン (ppp(8)) ネットワークに適した設定です。

net 一般的なネットワークに適した設定です。

routerルータとして使用する場合に適した設定です。この特別な設定は、最低 限のハードウェアで動作することを目標としています。

これらの設定は、あなたが独自の変更を行うときに参考にするためだけにありま す。すべてがテストされたわけではありませんし、動かすため、もしくはコード 量増加時に空きディスク空間に納めるために、設定ファイルにちょっとした修正 が必要となるかもしれません。

あなた独自のフロッピタイプを定義可能です。それには、何か好きな名前 (例え ば FOO) を選んでディレクトリを作成し、その中に次のファイルおよびディレク トリのいくつかを含めれば良いのです。これらのファイルを作成するための詳細 情報については、標準の 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 -DNOPAM -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) に渡され る引数そのものですから、デバイスの名称については 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 スクリプトのコメントに記述されてい ます。サンプルの設定ファイルは /usr/src/release/picobsd/
floppy-type
/ にあります。

別のソースツリーの使用

構築スクリプトは、別のソースツリーを使用するよう、 −-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/ad2
      dd if=picobsd.bin of=/dev/ad2s3
      dd if=picobsd.bin of=/dev/ad2 oseek=NN

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

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

      disklabel -w ad0s2 auto
      disklabel -e ad0s2

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

a:5760 0 4.2BSD 512 4096

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

CDROM へのインストール

もう 1 つのオプションに、イメージを CDROM に置くというものがあります。 ディスクタイプ foo に対するイメージがディレクトリ build_dir-foo にあると 仮定します。そうすると、次のコマンドでブート可能な ‘‘El Torito’’ イメージ を生成する (さらに、焼く) ことができます:

      mkisofs -b picobsd.bin -c boot.catalog -d -N -D -R -T \
          -o cd.img build_dir-foo
      burncd -f /dev/acd0c -s 4 data cd.img fixate

イメージサイズは 1.44MB もしくは 2.88MB に制限されることに注意してくださ い。その他のサイズではまず動作しないでしょう。

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

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

PicoBSD のブート

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

etherboot を使用して、ロード済みで非圧縮のカーネルイメージをロードするこ ともできます。このイメージは、 picobsd 構築過程で生成される副産物です。こ の場合、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 つ またはそれより多い絶対パス名を取り、引数として渡されたファイルに対してエ ディタを実行し、そしてファイルを圧縮したコピーをディスクに保存します (こ の操作の前後でディスクをマウント / アンマウントします)。

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

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

関連項目

crunchgen(1), mdconfig(8), swapon(8), vnconfig(8)

作者

Andrzej Bialecki ⟨abial@FreeBSD.org⟩ です。スクリプト関連の仕事を Luigi Rizzo ⟨luigi@iet.unipi.it⟩ 等が引き継ぎました。マニュアルページと Makefile の作成は Greg Lehey ⟨grog@lemis.com⟩ が行いました。

バグ

picobsd を構築する際、構築作業を行うシステムのカーネルには vn(4) ドライバ がインストールされていなければなりません。

構築の過程は ‘‘root’’ で実行しなければなりません。 mdconfig(8)/vnconfig(8)mount(8) を実行する必要があるためです。

picobsd の構築には、依然、中身の見えにくいところがあります。最大の問題 は、どういうふうにすればフロッピにぴったり詰め込むことができるかを判断す ることです。現実的な方法は試行錯誤しかありません。

FreeBSD 10.0 March 9, 2002 FreeBSD 10.0

スポンサーリンク