初期ユーザ空間サポート
======================

最終更新日: 2003-08-21


「初期ユーザ空間」とは、その重要性から Linux カーネルのブート中に利用
可能である必要はあるのだけれどもカーネル自身の内部で実行する必要はない、
といった類の各種機能を提供するライブラリ群とプログラム群のセットです。

これは、複数の主要基盤コンポーネントで構成されています。

- gen_init_cpio
    ルートファイルシステムのイメージを含む cpio フォーマットのアーカイブ
    を構築するプログラムです。このアーカイブは圧縮され、そしてその圧縮
    されたイメージはカーネルイメージにリンクされます。

- initramfs
    カーネルのブートプロセス中に、圧縮された cpio イメージを解凍する
    コードの塊です。

- klibc
    ユーザ空間Ｃライブラリで、現在は別個にパッケージングされています。
    正確さとサイズ縮小を目指して最適化されています。

initramfs が使用している cpio ファイルフォーマットは "newc" ("cpio -c"
として知られています) フォーマットであり、"buffer-format.txt" ファイル
内に文書化されています。gen_init_cpio を使い倒すかわりに直接独自の cpio
ファイル群を生成したいという場合は、gen_init_cpio の実行を省いて単純に
独自の initramfs_data.cpio.gz が配置されるようにするため、usr/ 内のビルド
プロセスを短絡化する必要があるでしょう。


どこに進んでいくのか？
======================

klibc ディストリビューションには、初期ユーザ空間を便利なものにするのに
必要なソフトウェアが含まれています。klibc ディストリビューションは現在、
カーネルとは別々に管理されていますが、2.7 の早い段階でこの状況は変わる
かもしれません (2.5 には間に合いませんでした)。

あまり頻繁には更新されていませんが、klibc のスナップショットを次の場所
から取得することができます。

    ftp://ftp.kernel.org/pub/linux/libs/klibc/

アクティブユーザの方は、http://klibc.bkbits.net/ にある klibc の
BitKeeper レポジトリを利用するとよいでしょう。

スタンドアロンの klibc ディストリビューションは現在、klibc ライブラリの
ほかに三つのコンポーネントを提供しています。

- ipconfig
    ネットワークインターフェースの設定をおこなうプログラムです。静的に
    設定をおこなうか、もしくは動的に情報を取得するために DHCP を利用
    します ("IP autoconfiguration" として知られています)。

- nfsmount
    NFS ファイルシステムのマウントを可能にするプログラムです。

- kinit
    ipconfig と nfsmount を使用し、以前の IP autoconfig サポートを置き
    換え、NFS ファイルシステムをマウントし、そのファイルシステムをルート
    として使用しながらシステムのブートを続行する「グルー」プログラムです。

kinit は、空間を節約するため、静的にリンクされた単一のバイナリとして構築
されます。

最終的には、カーネル機能の幾つかの処理は、うまくいけば初期ユーザ空間へ
移行されていくでしょう:

- ほぼ全ての init/do_mounts* (この処理の始めの部分については既に移行
  されています)

- ACPI テーブルの解析

- 実際にはカーネル空間に置いておく必要のないサブシステムをここに置く

もしも kinit があなたの現在の要求を満たしておらず、作り直す必要がある
場合には、klibc ディストリビューションには Bourne シェル互換の小さな
シェル (ash) と他の多くのユーティリティが含まれていますので、kinit を
置き換え、あなたの要求にぴったりと合うカスタム initramfs イメージを
ビルドしてください。

質問をしたくなったり手助けが必要になったりした場合には、
http://www.zytor.com/mailman/listinfo/klibc で初期ユーザ空間のメーリング
リストにサインアップしてください。


どのように動作するのか？
========================

現在のところ、カーネルがルートファイルシステムをマウントする方法には三つ
あります。

a) 必要とされるデバイスとファイルシステムのドライバを全てカーネルに組み
   込み、初期 RAM ディスクを使用しないようにします。init/main.c:init()
   は、root= オプションに基づき、および、init/main.c:init() の末尾に
   リストされているもの以外の初期バイナリを使用する場合には、任意である
   init= オプションにも基づき、最終的なルートファイルシステムをマウント
   するために prepare_namespace() を呼び出します。

b) 幾つかのデバイスとファイルシステムのドライバをモジュールとしてビルド
   し、初期 RAM ディスクに格納します。初期 RAM ディスクは、これらのドラ
   イバモジュールをロードする '/linuxrc' バイナリを含んでいなければなり
   ません。また、linuxrc 経由で最終的なルートファイルシステムをマウント
   し、pivot_root システムコールを使用することも可能です。初期 RAM ディ
   スクがマウントされ、prepare_namespace() 経由で実行されます。

c) initramfs を使用します。prepare_namespace() の呼出しをスキップする
   必要があります。これは、バイナリが全ての仕事をおこなわなければなら
   ないことを意味します。同バイナリは、usr/gen_init_cpio.c を修正する
   か、新しい初期 RAM ディスクフォーマットである cpio アーカイブ経由の
   どちらかにより、initramfs に格納することができます。このバイナリは
   "/init" でなければならず、prepare_namespace() がおこなうであろう全
   ての仕事を実行する責任を負います。

  後方互換性を維持するため、/init バイナリは、initramfs cpio アーカイブ
  からのものである場合のみ実行されます。そうでない場合は、init/main.c:
  init() は、最終的なルートファイルシステムをマウントするために
  prepare_namespace() を実行し、事前に定義された init バイナリのうちの
  一つを実行します。

Bryan O'Sullivan <bos@serpentine.com>


------------------------------------------------------------
翻訳団体： JF プロジェクト < http://www.linux.or.jp/JF/ >
最終更新： 2004/06/29
翻訳者：   川崎 貴彦 <takahiko(a)hakubi.co.jp>
校正者：   小林 雅典 <zap03216(a)nifty.ne.jp>
