今回の紹介ではファイルシステムの初期化Robert Landleyはramfsの動機として以下を述べました。
しかし、仮想ディスクは、実際にはキャッシュのためにより多くのメモリを浪費する。 Linux はブロックデバイスから読み込んだり、ブロックデバイスに書き込んだすべてのファイルやディレクトリエントリをキャッシュするように設計されているため、Linux はラムディスクとデータを「ページキャッシュ」(ファイルデータ用)および「ディレクトリエントリキャッシュ」(ディレクトリエントリ用)にコピーします.します。 )。ブロックデバイスとして偽装する仮想ディスクの欠点は、ブロックデバイスとして扱われることである。
数年前、Linus Torvaldsは奇抜なアイデアを思い出しました。 Linuxのキャッシュをファイルシステムのようにマウントできるとしたらどうでしょうか?ファイルをキャッシュに保存し、ファイルが削除されるかシステムが再起動されるまで削除しないでください。 Linusは「ramfs」というキャッシュの周りに小さなラッパーを作成し、他のカーネル開発者は「tmpfs」と呼ばれる拡張バージョンを作成しました(スワップスペースにデータを書き込んで、指定されたマウントポイントのサイズを制限することで利用可能なすべてを埋めることができます) )。使用前のメモリ)。 Initramfs は tmpfs のインスタンスです。
これにより、ramfs(およびinitramfs)は、initramfsドライバを使用して内部キャッシュ構造をファイルシステムに公開するメカニズムであると考えました。
しかし、キャッシュ自体の存在はキャッシュされたブロックデバイスの存在に依存しませんか?~から?これは、純粋にRAMベースのファイルシステムを作成するためにramfs
キャッシュからブロックデバイスを作成(またはエミュレート)する必要があることを意味します。これは元のinitrdで発生した問題のようです。ここに何か抜けたものがあると確信していますが、何かはよくわかりません。
カーネルに渡されたcpioアーカイブはブロックデバイス(通常はハードドライブ)にありますが、initramfsコンテンツをマウントするにはカーネルにファイルシステムドライバがまだ必要ですか?
答え1
ramsfs/initrams の場合、fs をキャッシュするデバイスは「空」です。次の説明を見ると/Documentation/filesystems/ramfs-rootfs-initramfs.txt
:
通常、すべてのファイルはLinuxによってメモリにキャッシュされます。バックアップストア(通常はファイルシステムがマウントされているブロックデバイス)から読み取られたデータページは、必要な場合に備えて保持されますが、仮想メモリシステムで他の目的のためにメモリが必要な場合はクリーンアップ(解放可能)として表示されます。同様に、ファイルに書き込まれたデータはバックアップストアに書き込まれるとクリーンであるとマークされますが、仮想マシンがメモリを再割り当てするまでキャッシュの目的のために保持されます。同様のメカニズム(カタログエントリのキャッシュ)を使用すると、ディレクトリへのアクセス速度が大幅に向上します。
ramfs にはバックアップストアはありません。 ramfsに書き込まれたファイルには、通常どおりディレクトリエントリとページキャッシュが割り当てられますが、書き込む場所はありません。これは、これらのページがクリーンアップとしてマークされていないため、仮想マシンがメモリを回復しようとしたときに解放できないことを意味します。
したがって、「内部キャッシュ構造をファイルシステムのメカニズムとして公開する」には問題はありませんが、私が説明するものではありません。一般的な内部キャッシュ構造を使用するが「バックアップ」する場所を持たないファイルシステム。メモリディスクある) そうだった。ただキャッシュに存在し、ページを無効にして書き換えるメカニズムは使用されません。
cpio
文書についてはもう一度見てくださいramfs-rootfs-initramfs.txt
。
以前のinitrdは常に別々のファイルでしたが、initramfsアーカイブはLinuxカーネルイメージにリンクされました。 (linux- * / usrディレクトリは、ビルドプロセス中にこのアーカイブを生成するために特に使用されます。)
したがって、cpio
ブロックデバイス、ネットワーク、ハトベクトル、または他の方法でカーネルをロードするのと同じ方法でロードします。それは問題ではありません。ブートローダがこれを処理するため、カーネルにファイルシステムドライバは必要ありません。
答え2
ramfsのポイントは、ブロックデバイスを削除することです。ファイルシステムの内容はファイルシステムインタフェースを介して入力され、ブロックデバイスをサポートしていないため、データはキャッシュに残ります。以前の方法では、バックアップストアはファイルシステムイメージが書き込まれるブロックデバイスとして機能しました。次に、ファイルシステムとしてマウントします。このアプローチの問題(RAMがRAMにキャッシュされている)は、キャッシュを削除するのではなく、ブロックデバイスを削除することで解決されました。
はい、cpio
アーカイブは通常ブロックデバイスで作成されますが、必ずしもそうではありません。ネットワーク、生ブロックデバイスなどから来ることができます。 cpio アーカイブは、オプションでカーネルイメージの一部にすることもできます。もちろん、ブートローダにはカーネルとinitramfsをRAMにロードするメカニズムが必要ですが、これはカーネルではなくブートローダの問題です。 initramfsの重要な点は、選択できる12のファイルシステム、さまざまな低レベルのディスクドライブインターフェイスなど、結果のシステムが非常に多様であることです。 initramfsを使用すると、カーネルをより一般的に設定できるため、代わりにモジュールとして提供できる100万のドライバをコンパイルする必要はありません。実際、カーネルはファイルシステムドライバを必要とせず、必要に応じてすべてモジュールにロードできます。