rootfsとは何ですか?
Rootfs
の特別なインスタンスramfs
(またはtmpfs
、有効になっている場合)であり
、2.6システムに常に存在します。initプロセスを終了できないのとほぼ同じ理由で、マウントrootfs
を解除 することはできません。空のリストをチェックして処理する特別なコードを用意するのではなく、特定のリストが空にならないようにするだけの方がカーネルにとっては小さくて簡単です。
ほとんどのシステムでは、別のファイルシステムをマウントしrootfs
て無視します。ramfsの空のインスタンスが占めるスペースの量はごくわずかです。
CONFIG_TMPFSが有効な場合、デフォルトでrootfs
はtmpfs
なくが使用ramfs
されます。力にramfs
、追加"rootfstype=ramfs"
のカーネルコマンドラインに。
initramfsとは何ですか?
すべての2.6 Linuxカーネルには、カーネルの起動時に抽出される gzip圧縮された"cpio"
形式のアーカイブが含まれています。 抽出した後ならば、カーネルかどうかを確認し、ファイルが含まれている、としてそれを実行している場合、PID 1. もしが見つかっ、このプロセスは、位置と実際のルートデバイスを取り付け、システムの道までの残りの部分をもたらすなどのために責任があります(存在する場合)。埋め込まれたアーカイブがそこに抽出された後にプログラムが含まれていない 場合、カーネルはルートパーティションを見つけてマウントするために古いコードにフォールスルーし、その中からいくつかのバリアントを実行します。rootfs
rootfs
"init"
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はピボットルートを作成してから、ラムディスクをアンマウントします。しかし、initramfsはrootfsです。pivot_rootrootfsもアンマウントもできません。 代わりに、rootfsからすべてを削除してスペースを解放し(find -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_INITRAMFS_SOURCE(で一般的なセットアップ中menuconfig,
との生活では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つは、root
アクセス許可を設定したり、新しいアーカイブにデバイスノードを作成したりする必要がないことです。
(これらの2つの「ファイル」エントリの例では、「init.sh
」および「busybox
」という名前のファイルinitramfs
がlinux
-2.6。*ディレクトリの下の「」というディレクトリにあると想定しています。詳細については、Documentation / early-userspace / READMEを参照してください。)
カーネルは外部ツールに依存しませんcpio
。構成ファイルの代わりにディレクトリを指定すると、カーネルのビルドインフラストラクチャはそのディレクトリから構成ファイルを作成し(をusr/Makefile
呼び出しscripts/gen_initramfs_list.sh
)、構成ファイルを使用してそのディレクトリをパッケージ化します(usr/gen_init_cpio
から作成されるにフィードすることによりusr/gen_init_cpio.c
)。 カーネルのビルド時cpio
作成コードは完全に自己完結型であり、カーネルのブート時抽出も(明らかに)自己完結型です。