80

私が知る限り、initrdはブロック デバイスとして機能するため、ファイルシステム ドライバ (などext2) が必要です。のファイルシステムを検出するために、カーネルには少なくとも 1 つの組み込みモジュールが必要ですinitrd。この記事、初期 RAM ディスクの新しいモデルである initramfs の紹介では、次のように書かれています。

しかし、RAM ディスクは実際にはキャッシングのためにさらに多くのメモリを浪費します。Linux は、ブロック デバイスから読み書きされるすべてのファイルとディレクトリ エントリをキャッシュするように設計されているため、Linux は RAM ディスクとの間でデータを「ページ キャッシュ」(ファイル データの場合) と「dentry キャッシュ」(ディレクトリ エントリの場合) にコピーします。 . ブロック デバイスのふりをする RAM ディスクの欠点は、ブロック デバイスのように扱われることです。

page cacheとは何dentry cacheですか?その段落ではramdisk、ブロックデバイスとして扱われ、すべてのデータがキャッシュされるため、データが複製されたということですか?

対照的に、ramfs:

数年前、Linus Torvalds は素晴らしいアイデアを思いつきました: Linux のキャッシュをファイルシステムのようにマウントできるとしたら? ファイルをキャッシュに保持するだけで、ファイルが削除されるかシステムが再起動するまで削除されませんか? Linus は「ramfs」と呼ばれるキャッシュの小さなラッパーを作成し、他のカーネル開発者は「tmpfs」と呼ばれる改良版を作成しました (これは、データをスワップ スペースに書き込み、特定のマウント ポイントのサイズを制限して、消費する前にいっぱいになるようにします)。使用可能なすべてのメモリ)。initramfs は tmpfs のインスタンスです。

これらの RAM ベースのファイルシステムは、含まれるデータのサイズに合わせて自動的に拡大または縮小します。ファイルを ramfs に追加する (または既存のファイルを拡張する) と、より多くのメモリが自動的に割り当てられ、ファイルを削除または切り詰めると、そのメモリが解放されます。ブロック デバイスがないため、ブロック デバイスとキャッシュの間に重複はありません。キャッシュ内のコピーは、データの唯一のコピーです。何よりも、これは新しいコードではなく、既存の Linux キャッシング コードの新しいアプリケーションです。つまり、サイズがほとんど追加されず、非常にシンプルで、非常によくテストされたインフラストラクチャに基づいています。

要するに、ramfsファイルを開いてメモリにロードするだけですよね?

initrdとはどちらもramfsコンパイル時に圧縮されますが、違いは、initrdブート時にカーネルによってマウントされるようにアンパックされたブロック デバイスであり、一方ramfsは cpio を介してメモリにアンパックされます。私は正しいですか?それともramfs、非常に最小限のファイル システムですか?

最後に、今日まで、initrdイメージは最新のカーネルで表示されています。しかし、それはinitrd実際にramfs今日使用されており、その名前は単に歴史的な目的のためのものですか?

4

4 に答える 4

79

私はあなたがすべて正しいと思います。

起動時に必要な手順に従えば、違いは簡単にわかります。

initrd

  • ramdevブロック デバイスが作成されます。これは RAM ベースのブロック デバイスであり、物理ディスクの代わりにメモリを使用するシミュレートされたハードディスクです。
  • initrdファイルが読み取られ、デバイスに解凍されますzcat initrd | dd of=/dev/ram0
  • にはファイル システムのinitrdイメージが含まれているため、通常どおりファイル システムをマウントできますmount /dev/ram0 /root。当然、ファイルシステムにはドライバーが必要なので、ext2 を使用する場合は、ext2 ドライバーをカーネル内でコンパイルする必要があります。
  • 終わり!

initramfs

  • Atmpfsがマウントされています: mount -t tmpfs nodev /root. tmpfs はドライバーを必要とせず、常にカーネル上にあります。デバイスも追加のドライバーも必要ありません。
  • initramfs、この新しいファイルシステムに直接解凍されます:zcat initramfs | cpio -iなど。
  • 終わり!

はい、まだinitrd多くの場所で呼び出されていますがinitramfs、特にブートローダーでは、それらは単なる BLOB であるためです。違いは、起動時の OS によって異なります。

于 2012-05-15T15:27:32.507 に答える
56

Dentry(およびiノード)キャッシュ

Linuxのファイルシステムサブシステムには3つの層があります。VFS(仮想ファイルシステム)。システムコールインターフェイスを実装し、交差するマウントポイントとデフォルトのアクセス許可を処理し、チェックを制限します。その下には、個々のファイルシステムのドライバーと、ブロックデバイス(ディスク、メモリカードなど。ネットワークインターフェイスは例外)のドライバーへのインターフェイスがあります。

VFSとファイルシステム間のインターフェイスはいくつかのクラスです(プレーンCであるため、関数などへのポインターを含む構造体ですが、概念的にはオブジェクト指向のインターフェイスです)。主な3つのクラスはinode、ファイルシステム内の任意のオブジェクト(ファイルまたはディレクトリ)dentryを記述し、ディレクトリ内のエントリをfile記述し、プロセスによって開かれたファイルを記述します。マウントされると、ファイルシステムドライバーが作成inodedentry、そのルートと他のドライバーは、プロセスがファイルにアクセスして最終的に期限切れになったときにオンデマンドで作成されます。これは、dentryおよびiノードのキャッシュです。

はい、それは、開いているすべてのファイルとルートまでのすべてのディレクトリに対して、それを表すカーネルメモリに割り当てられた構造が存在する必要があることinodeを意味します。dentry

ページキャッシュ

pageLinuxでは、ユーザーランドデータを含む各メモリページは統一された構造で表されます。これにより、ページが匿名としてマークされるか(使用可能な場合はスワップスペースにスワップされる可能性があります)、またはファイルシステムに関連付けられinode(ファイルシステムに書き戻され、ファイルシステムから再読み取りされる可能性があります)、任意の数のメモリマップの一部になる可能性があります、つまり、あるプロセスのアドレス空間に表示されます。現在メモリにロードされているすべてのページの合計がページキャッシュです。

ページはmmapインターフェイスを実装するために使用され、通常の読み取りおよび書き込みシステムコールは他の方法でファイルシステムによって実装できますが、インターフェイスの大部分はページも使用する汎用関数を使用します。一般的な関数があり、ファイルの読み取りが要求されたときにページを割り当て、ファイルシステムを呼び出してそれらを1つずつ入力します。ブロックデバイスベースのファイルシステムの場合、適切なアドレスを計算し、この入力をブロックデバイスドライバーに委任します。

ramdev(ramdisk)

Ramdevは通常のブロックデバイスです。これにより、その上に任意のファイルシステムを階層化できますが、ブロックデバイスインターフェイスによって制限されます。そして、それは、呼び出し元によって割り当てられたページを埋めて、それを書き戻すためのメソッドだけを持っています。これは、ディスク、メモリカード、USBマスストレージなどの実際のブロックデバイスに必要なものですが、ramdiskの場合、データは2回メモリに存在します。1回はramdevのメモリに、もう1回は発信者。

これは、を実装する古い方法ですinitrd。initrdがまれでエキゾチックな出来事だった時代から。

tmpfs

Tmpfsは異なります。これはダミーのファイルシステムです。VFSに提供するメソッドは、それを機能させるための最低限のものです(したがって、iノード、dentry、およびファイルのメソッドが実行する必要があることについての優れたドキュメントです)。ファイルは、対応するiノードとdentryがinodeキャッシュにある場合にのみ存在します。これは、ファイルの作成時に作成され、ファイルが削除されない限り期限切れになることはありません。ページは、データが書き込まれるときにファイルに関連付けられ、それ以外の場合は匿名のページとして動作します(データはスワップに保存される場合がありpage、ファイルが存在する限り構造は使用され続けます)。

これは、メモリ内にデータの余分なコピーがなく、全体がはるかに単純であるため、わずかに高速であることを意味します。プライマリストレージとして、他のファイルシステムのキャッシュとして機能するデータ構造を使用するだけです。

これは新しい実装方法ですinitrdinitramfsただし、イメージはまだ単にと呼ばれていますinitrd)。

これは「posix共有メモリ」を実装する方法でもあります(つまり、tmpfsがマウントされ/dev/shm、アプリケーションはそこにファイルを自由に作成してmmapできます。シンプルで効率的です)。最近では、/tmp特にノートブックにtmpfsがマウントされています。 SSDの場合、ディスクがスピンアップしたり、摩耗を回避したりするのを防ぐため。/run/var/run

于 2012-05-15T16:05:39.280 に答える