Chapter 24. FreeBSD の内部

Table of Contents
FreeBSDのブート処理の流れ
PC におけるメモリの利用
DMAとはどういったものでどういう働きをするのか
FreeBSD VM システム

FreeBSDのブート処理の流れ

原作: Poul-Henning Kamp . v1.1, April 26th.

訳: 中井 幸博 . September 6 1996.

FreeBSDのブートには基本的に3つの段階があります: カーネルの読み込み, ルートのファイルシステムの決定, そして ユーザ領域にあるものの初期化です. このことは下に述べる いくつかの興味深い可能性につながっています.

カーネルの読み込み

現在, カーネルの読み込みには基本的に下に挙げる3つの方法が あります: これらはカーネルが次に何をしたらいいのかという情報をカーネルに 与えます.

Biosboot

Biosboot は ``ブートブロック'' に相当するもので, 2つのファイル から構成されており, フロッピーディスクやハードディスクのブートを 開始する側の 8K バイトにインストールされています.

Biosboot は FreeBSD のファイルシステムからカーネルを 読み込むことができます.

Dosboot

Dosbootは DI. Christian Gusenbauerによって書かれましたが, 不幸にしてこの場合には, コードのある一部分が マイクロソフトの コンパイラ向けに書かれているため, FreeBSD 単体ではコンパイル することはできません.

Dosboot は MS-DOS のファイルから, またはディスクの FreeBSD ファイルシステムのパーティションから カーネルをブートします. これは MS-DOS システムのハイメモリ領域に潜んでいる メモリマネージャ等の さまざまな怪しい代物とメモリの取り合いをして, なんとかブートしています.

Netboot

Netboot はサポートされているイーサネットカードを検出し, BOOTP や TFTP, NFS を使ってブートするカーネルを探そうとします.

ルートファイルシステムの決定

カーネルが読み込まれ, ブートプログラムがカーネルに移行したら, カーネルは自身の初期化をし, どんなハードウェアが組み込まれいるか を決定し, それからルートファイルシステムを探さなくてはなりません.

現在サポートされているルートファイルシステムは 次の通りです :

UFS

UFS は, もっとも一般的なタイプのルートシステムです. フロッピーディスクやハードディスク上に存在します.

MSDOS

技術的に可能ですが, あまり有用ではありません. なぜならば, FAT ファイルシステムではリンクやデバイスノードなどの ``UNIX 主義'' を実現できないからです.

MFS

MFS はカーネル内部に組み込みになっている UFS ファイルシステムです. つまり MFS を機能させるのに ディスクやフロッピーディスクなどのハードウェアは 必要ではありません.

CD9660

CD9660 は CD-ROM をルートファイルシステムに使用したものです.

NFS

これはルートシステムにファイルサーバを使用していて, 基本的に ディスクレスのマシンのためにあります.

ユーザ領域にあるものの初期化

ユーザ領域で動作させるようにするために, カーネルが初期化を終えると, カーネルは pid == 1のプロセスを生成し, ルートファイルシステム 上のプログラムを実行します. このプログラムは通常 /sbin/init です.

/sbin/init を別なプログラム置き換えてしまうことは可能ですが, そのプロセス には以下のような制約があります:

pid が 1 のプロセスには stdin/stdout/stderr は割り当てられていませんので, プログラムは自分でこれらをオープンしないとなりません. このプロセスが終了するとカーネルはパニックメッセージを表示して 停止します. また, このプロセスに対するシグナル処理は特殊です.

この例として, インストール用のフロッピーディスクにある /stand/sysinstallがあります.

興味深い連係

カーネルを MFS でブートするのには次のような特別の /sbin/init を使います.

A --- DOS を使う場合
  • C:/C: にマウントします.

  • C:/freebsd.fs/dev/vn0 にアタッチします.

  • /dev/vn0/rootfs にマウントします.

  • シンボリックリンクを作ります. /rootfs/bin -> /bin /rootfs/etc -> /etc /rootfs/sbin -> /sbin (etc...)

これでハードディスクのパーティションを切り直さずに FreeBSD を 使うことができます.

B --- NFS を使う場合

NFS はサーバ:~you/FreeBSD/nfs にマウントし, ルートディレクトリを /nfs に変更して, そこで /sbin/init を実行します.

これで FreeBSD をディスクレスで実行できますが, NFS サーバを コントロールできないままです...

C --- X-server を起動する場合

これで X ターミナルが手に入りました. これは, これでハードウェア に費用を割いたりするよりはいい, と上司が主張した, Windows で 動作する遅くて何がおこなわれているのか 見ることができるような すすけた X Window エミュレータなんかよりよいものです.

D --- テープを使う場合

/dev/rwd0 のコピーを取って, リモートにあるテープ ステーションやファイルサーバに書き込んでください.

これで一年前に取っておくべきだった バックアップをやっと 取ることができました.

E --- ファイアウォール/Web サーバとして動作させる場合 (私の知っている範囲で...)

これは特に面白いもので, 書き込み禁止のフロッピーディスクから ブートができて, ルートのファイルシステムに書き込むことができる というものです.