ファイルシステムとしてjffs
またはsd
を選択すると(initramfs
ではなく)、カーネルサイズが非常に小さくなる(initramfs
は3.4MBです)。これは、initramfs
がかなり大きなスペースを取ることを意味します。できれば完全に削除するので、カーネルが非常に小さくなります。
私の頭に浮かぶ基本的な質問は次のとおりです。なぜinitramfs
が必要なのですか? Linuxカーネルは、初期ファイルシステムがないと起動できませんか?
私の最終アプリケーションは計算と通信のみを行います-ストレージはまったくありません。したがって、少なくとも私のアプリケーションでは、ファイルシステムのないOSは理にかなっています。
Initramfsのサイズの増加は、ramfsドライバー(ほんの数キロバイトであり、とにかく他のものに必要です)によるものではなく、initramfs自体によるものです。 initramfsには、実際のルートファイルシステムをアセンブルおよびマウントするために必要なプログラムが含まれています。
Initramfsはそれをずっと簡単にし、場合によっては可能にします(例:暗号化/
)、システムを起動します。ホットプラグ可能な周辺機器がたくさんあるPCスタイルのハードウェアに保存することを強くお勧めします。一方、組み込みデバイスを、特定のハードウェア構成をサポートするカーネルでinitramfsなしでブートすることは、理にかなっています。
もちろんカーネルはファイルシステムから起動する必要があります。実行したいアプリケーションをロードするための何らかの方法が必要です。何も実行しない場合は、マシンの電源をオフにしておくこともできます。
Initramfsを使用したくない場合は、ブートローダーに渡さないように指示してください。もちろん、カーネルビルドの出力に1つは含めないでください—アーキテクチャとブートローダーに依存している場合にこれがどのように発生するか。たとえば、vmlinux
とbzImage
は含めないinitramfs(それぞれ生のカーネルと圧縮されたカーネル)ですが、uImage
(U-Bootの場合)はカーネルとinitramfsの両方をパックします(存在する場合)。
(技術的には mikeserv のように、常にinitramfsが存在しますが、デフォルトでは、これは空の134バイトのアーカイブです。表示され、削除したいものは「true」です。 、ビルドプロセスによって作成された空ではないinitramfsと、ルートファイルシステムをマウントするために使用されるツールが含まれます。
ちなみに、initramfsは、永続データのない単一アプリケーションシステムを作成するための合理的な方法です。すべてのアプリケーションをinitramfsに入れ、起動して保持します。これにより、永続ストレージまたはブートイメージを整理しやすくなります(必要なのは、バンドルできるカーネルとinitramfsだけです)。ただし、このアプローチには欠点があります。initramfs内のすべてのデータはRAMに永続的に保存され、ブートイメージ内のファイルを簡単に変更できないため、アーカイブを再構築する必要があります。
から [〜#〜] lfs [〜#〜] :
Initramfsの唯一の目的は、ルートファイルシステムをマウントすることです。 initramfsは、通常のルートファイルシステムにあるディレクトリの完全なセットです。単一のcpioアーカイブにバンドルされ、いくつかの圧縮アルゴリズムの1つで圧縮されます。
...
LFS環境でinitramfsを使用する主な理由は4つだけです:ネットワークからrootfsをロードする、LVM論理ボリュームからロードする、パスワードが必要な暗号化されたrootfsを持っている、またはrootfsをLABELまたはUUID。それ以外の場合は通常、カーネルが適切に構成されていなかったことを意味します。
...
ほとんどのディストリビューションでは、カーネルモジュールがinitramfsを持つ最大の理由です。一般的なディストリビューションでは、ファイルシステムのタイプやディスクレイアウトなど、多くの不明な点があります。ある意味では、これはLFSの反対であり、システムの機能とレイアウトは既知であり、カスタムカーネルは通常ビルドされます。この状況では、initramfsが必要になることはほとんどありません。
別のソース www.kernel.org
これ以外にも、initramfsを使用しないルーターのようなLinuxシステムがたくさんあります。
ルートfsへのアクセスを構成するには、いくつかのユーザーモードユーティリティが必要なため、ネットワークブート、lvm、raidなどのより複雑なセットアップにはinitramfsが必要です。ディスク上の単純な従来のパーティションの場合、カーネルにディスクドライバーが組み込まれていて、UUIDではなくデバイスパスでルート引数を指定している限り、initramfsなしで実行できます。もちろん、デバイスのパスは、接続しているプラグアンドプレイ(つまり、usb)デバイス、または単にランダムなタイミングの差異によっても変更される可能性があります。そのため、ほとんどの人が信頼性のためにuuidとinitramfsを使用しています。
これは古い質問ですが、まだ受け入れられた回答がないようですので、これを捨てます(私はここでは専門家ではありません。自分でこれを理解しようとしています)。
https://www.kernel.org/doc/Documentation/early-userspace/README から(2004年以降更新されていないことを示す、一番下にあるすべての方法。)
カーネルは現在ルートファイルシステムをマウントするための3つの方法を持っています:
a)カーネルにコンパイルされたすべての必要なデバイスおよびファイルシステムドライバー、initrdなし。 init/main.c:init()はprepare_namespace()を呼び出して、root =オプションとオプションのinit =に基づいて最終的なルートファイルシステムをマウントし、init/main.c:initの最後にリストされているもの以外のinitバイナリを実行します。 ()。
b)モジュールとして構築され、initrdに保存されている一部のデバイスおよびファイルシステムドライバー。 initrdには、これらのドライバモジュールをロードすることになっているバイナリ「/ linuxrc」が含まれている必要があります。 linuxrcを介して最終的なルートファイルシステムをマウントし、pivot_root syscallを使用することもできます。 initrdは、prepare_namespace()を介してマウントおよび実行されます。
c)initramfsを使用します。 prepare_namespace()の呼び出しはスキップする必要があります。これは、バイナリがすべての作業を実行する必要があることを意味します。このバイナリは、usr/gen_init_cpio.cを変更するか、新しいinitrd形式であるcpioアーカイブを使用してinitramfsに保存できます。 「/ init」と呼ばれる必要があります。このバイナリは、prepare_namespace()が実行するすべての処理を実行します。
下位互換性を維持するために、/ initバイナリは、initramfs cpioアーカイブを介する場合にのみ実行されます。そうでない場合、init/main.c:init()はprepare_namespace()を実行して最終ルートをマウントし、事前定義されたinitバイナリの1つを実行します。
価値があるのは、Raspberry Piなどのデバイス/ディストリビューションではinitramfsを使用しないことです。場合によっては、カーネルはルートパーティションにあります(必要なfsモジュールを備えたブートローダーによってマウントされます)。 /boot
パーティション。同じパーティション上のinitramfsには、他の人が述べているように、rootfsをマウントする前に直接アクセスできます。
場合によっては、initramfs canをカーネルと同じファイルに組み込むことができますが、常にそうであるとは限りません。 (a)場合によってはinitramfsが不要であるとかなり明確に述べているようです。
次の説明 の方がわかりやすい
initramfs
は、カーネルに組み込まれ、ブートプロセスの初期段階でロードされるルートファイルシステムです。 initrdの後継です。カーネルがブートプロセス中にそれ自体では簡単に実行できないことを実行できる初期のユーザー空間を提供します。Initramfsの使用はオプションです。デフォルトでは、カーネルは組み込みドライバーを使用してハードウェアを初期化し、指定されたルートパーティションをマウントし、インストールされているLinuxディストリビューションのinitシステムをロードします。その後、initシステムは追加のモジュールをロードし、最終的にログインを許可するまでサービスを開始します。これはデフォルトの動作であり、多くのユーザーにとって十分です。 initramfsは高度な要件を持つユーザー向けです。ルートパーティションがマウントされる前であっても、できるだけ早く作業を行う必要があるユーザー向け。
Initramfsでできることの例をいくつか示します。
- ルートパーティションをマウントします(暗号化されたパーティション、論理パーティション、その他の特別なパーティションの場合)。
- 最小限のレスキューシェルを提供します(何か問題が発生した場合)。
- 起動プロセスをカスタマイズします(ウェルカムメッセージの印刷、起動スプラッシュなど)。
- モジュール(サードパーティのドライバーなど)をロードします。
- カーネルが実行できないこと(たとえば、コマンドを実行するなどしてユーザー空間で実行できる限り)。高度な要件がない場合は、initramfsは必要ありません。