あなたが何をしても、あなたは持っていinitramfs
ます。それなしでやることはありません-それはあなたに課せられた唯一のファイルシステムです。kernel.orgから:
rootfsとは何ですか?
Rootfs
特別なインスタンスであるramfs
(またはtmpfs
、である、というのが有効な場合)
2.6システムで常に存在。 あなたはアンマウントすることはできませんrootfs
あなたがinitプロセスを殺すことができない、ほぼ同じ理由で、空のリストをチェックして処理する特別なコードを用意するのではなく、特定のリストが空にならないことを確認するだけでカーネルがより小さく簡単になります。
ほとんどのシステムは、単に別のファイルシステムをマウントしrootfs
て無視します。ramfsの空のインスタンスが占めるスペースはごくわずかです。
* CONFIG_TMPFS *が有効になっている場合、デフォルトでrootfs
はtmpfs
なくが使用ramfs
されます。力にramfs
、追加"rootfstype=ramfs"
のカーネルコマンドラインに。
initramfsとは何ですか?
2.6のすべてのLinuxカーネルには、gzip圧縮された"cpio"
形式のアーカイブが含まれており、カーネルの起動時に展開されrootfs
ます。 抽出した後ならば、カーネルかどうかを確認しrootfs
、ファイルが含まれている"init"
、としてそれを実行している場合、PID 1. もしが見つかっ、このinit
プロセスは、位置と実際のルートデバイスを取り付け、システムの道までの残りの部分をもたらすなどのために責任があります(もしあれば)。埋め込みアーカイブが抽出された後、プログラムrootfs
が含まれていない 場合、カーネルは古いコードに移動してルートパーティションを見つけてマウントし、その中からいくつかのバリアントを実行します。init
cpio
/sbin/init
これらはすべて、いくつかの点で古いinitrdと異なります。
古いinitrdは常に別のファイルでしたが、initramfsアーカイブはLinuxカーネルイメージにリンクされています。 (ディレクトリlinux-* / usrは、ビルド中にこのアーカイブを生成するために使用されます。)
古いinitrdファイルはgzip圧縮されたファイルシステムイメージ(カーネルに組み込まれたドライバーを必要とするext2などの一部のファイル形式)でしたが、新しいinitramfsアーカイブはgzip圧縮されたcpioアーカイブです(tarのように単純で、cpio(1)を参照)およびDocumentation / early-userspace / buffer-format.txt)。カーネルのcpio抽出コードは非常に小さいだけでなく、ブートプロセス中に破棄できる__initテキストとデータでもあります。
古いinitrd(/ initではなく/ initrdと呼ばれる)によって実行されるプログラムは、セットアップを行ってからカーネルに戻りましたが、initramfsからのinitプログラムはカーネルに戻ることはありません。(/ initが制御を渡す必要がある場合、新しいルートデバイスで/をオーバーマウントし、別のinitプログラムを実行できます。以下のswitch_rootユーティリティを参照してください。)
別のルートデバイスを切り替えるとき、initrdはpivot_rootしてからramdiskをアンマウントします。ただし、initramfsはrootfsです。pivot_rootrootfsもマウント解除もできません。 代わりに、rootfsからすべてを削除してスペースを解放し(-xdev / -exec rm '{}' ';'を見つけます)、新しいルートでrootfsをオーバーマウントします(cd / newmount; mount --move。/; chroot。)、 stdin / stdout / stderrを新しい/ dev / consoleに接続し、新しいinitを実行します。
これは非常に厄介なプロセスであるため(コマンドを実行する前にコマンドを削除する必要があります)、klibcパッケージにはこれをすべて行うヘルパープログラム(utils / run_init.c)が導入されました。他のほとんどのパッケージ(busyboxなど)は、このコマンドに「switch_root」という名前を付けています。
initramfsの設定:
2.6カーネルビルドプロセスは、常にgzip圧縮されたcpio形式のinitramfsアーカイブを作成し、結果のカーネルバイナリにリンクします。 デフォルトでは、このアーカイブは空です(x86では134バイトを消費します)。
configオプションCONFIG_INITRAMFS_SOURCE(menuconfigのGeneral Setupにあり、usr / Kconfigにあります)を使用して、initramfsアーカイブのソースを指定できます。これは、結果のバイナリに自動的に組み込まれます。このオプションは、既存のgzip圧縮されたcpioアーカイブ、アーカイブされるファイルを含むディレクトリ、または次の例のようなテキストファイル指定を指すことができます。
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
(カーネルのビルド後) "usr / gen_init_cpio"を実行して、上記のファイル形式を文書化した使用法メッセージを取得します。
構成ファイルの利点の1つは、新しいアーカイブにアクセス許可を設定したり、デバイスノードを作成したりするためにルートアクセスが必要ないことです。(これら2つの「ファイル」エントリの例では、「init.sh」および「busybox」という名前のファイルがlinux-2.6。*ディレクトリの下の「initramfs」というディレクトリにあることに注意してください。詳細。)
カーネルは外部cpioツールに依存しません。構成ファイルの代わりにディレクトリを指定すると、カーネルのビルドインフラストラクチャはそのディレクトリから構成ファイルを作成し(usr / Makefileがscripts / gen_initramfs_list.shを呼び出します)、構成ファイルを使用してそのディレクトリをパッケージ化しますusr / gen_init_cpio.c)から作成されたusr / gen_init_cpio。カーネルのビルド時cpio作成コードは完全に自己完結型であり、カーネルのブート時抽出プログラムも(明らかに)自己完結型です。