あなたの言うことはまったく正しいと思います。
起動時に必要な手順に従えば、違いは簡単にわかります:
initrd
- A
ramdev
ブロックデバイスが作成されます。これは RAM ベースのブロック デバイスであり、物理ディスクの代わりにメモリを使用するシミュレートされたハードディスクです。 initrd
zcat initrd | dd of=/dev/ram0
を実行したかのように、ファイルが読み取られ、デバイスに解凍されます。 または似たようなもの。initrd
ファイルシステムのイメージが含まれているため、通常どおりファイルシステムをマウントできます:mount /dev/ram0 /root
.当然、ファイルシステムにはドライバーが必要なので、ext2 を使用する場合は、ext2 ドライバーをカーネル内でコンパイルする必要があります。- 完了!
initramfs
- A
tmpfs
マウントされています:mount -t tmpfs nodev /root
. tmpfs はドライバーを必要とせず、常にカーネル上にあります。デバイスや追加のドライバーは必要ありません。 initramfs
この新しいファイルシステムに直接解凍されます:zcat initramfs | cpio -i
、または同様のもの。- 完了!
はい、まだ initrd
と呼ばれています 多くの場所で initramfs
ですが 、特にブートローダーでは、それは単なる BLOB であるためです。違いは、起動時の OS によって異なります。
Dentry (および inode) キャッシュ
Linux のファイルシステム サブシステムには 3 つの層があります。 VFS (仮想ファイルシステム) は、システム コール インターフェイスを実装し、クロス マウントポイントとデフォルトのアクセス許可と制限のチェックを処理します。その下には、個々のファイルシステムのドライバーと、ブロック デバイス (ディスク、メモリ カードなど。ネットワーク インターフェイスは例外) のドライバーへのインターフェイスがあります。
VFS とファイルシステムの間のインターフェースはいくつかのクラスです (単純な C であるため、関数へのポインターなどを含む構造体ですが、概念的にはオブジェクト指向のインターフェースです)。主な 3 つのクラスは inode
です 、ファイルシステム内の任意のオブジェクト (ファイルまたはディレクトリ) を記述します dentry
、ディレクトリ内のエントリと file
を記述します 、プロセスによって開かれたファイルについて説明します。マウントすると、ファイルシステム ドライバーは inode
を作成します。 と dentry
それはルートであり、他のプロセスはファイルにアクセスする必要があり、最終的に期限切れになったときにオンデマンドで作成されます。これは dentry と inode キャッシュです。
はい、開いているすべてのファイルとルートまでのすべてのディレクトリに inode
が必要です。 と dentry
それを表すカーネルメモリに割り当てられた構造。
ページ キャッシュ
Linux では、ユーザーランド データを含む各メモリ ページは統一された page
で表されます。 構造。これにより、ページが匿名としてマークされるか (利用可能な場合はスワップ スペースにスワップされる可能性があります)、ページが inode
に関連付けられます。 いくつかのファイルシステムで(ファイルシステムに書き戻され、ファイルシステムから再読み取りされる可能性があります)、任意の数のメモリマップの一部になることができます。つまり、一部のプロセスのアドレス空間で表示されます。現在メモリにロードされているすべてのページの合計がページ キャッシュです。
ページは mmap インターフェイスを実装するために使用され、通常の読み取りおよび書き込みシステム コールは他の方法でファイルシステムによって実装できますが、インターフェイスの大部分は、ページも使用する汎用関数を使用します。ファイルの読み取りが要求されたときにページを割り当て、ファイルシステムを呼び出してそれらを1つずつ埋める一般的な関数があります。ブロック デバイス ベースのファイルシステムの場合、適切なアドレスを計算し、この入力をブロック デバイス ドライバーに委譲します。
ramdev (ラムディスク)
Ramdev は通常のブロックデバイスです。これにより、任意のファイルシステムをその上に重ねることができますが、ブロック デバイス インターフェイスによって制限されます。そして、呼び出し元によって割り当てられたページに入力して書き戻すメソッドだけがあります。これはまさに、ディスク、メモリ カード、USB 大容量ストレージなどの実際のブロック デバイスに必要なものですが、ramdisk の場合は、データがメモリ内に 2 回存在することを意味します。
これは initrd
を実装する古い方法です . initrd が珍しく風変わりな存在だった時代から。
tmpfs
tmpfs は異なります。ダミーのファイルシステムです。それが VFS に提供するメソッドは、それを機能させるための絶対的な最低限のものです (そのため、inode、dentry、および file メソッドが何をすべきかについての優れたドキュメントです)。ファイルは、対応する i ノードと dentry が i ノード キャッシュに存在する場合にのみ存在し、ファイルの作成時に作成され、ファイルが削除されない限り期限切れになりません。ページは、データが書き込まれるときにファイルに関連付けられ、それ以外の場合は匿名ページとして動作します (データはスワップに保存される場合があります、page
ファイルが存在する限り、構造は引き続き使用されます)。
これは、メモリ内にデータの余分なコピーがないことを意味し、全体がはるかに単純になり、そのためにわずかに高速になります。他のファイルシステムのキャッシュとして機能するデータ構造をプライマリ ストレージとして使用するだけです。
これは initrd
を実装する新しい方法です (initramfs
、しかし、画像はまだ initrd
と呼ばれています ).
これは、「posix 共有メモリ」を実装する方法でもあります (これは単に tmpfs が /dev/shm
にマウントされていることを意味します) アプリケーションはそこにファイルを自由に作成し、それらを mmap します。シンプルで効率的)、最近では /tmp
も そして /run
(または /var/run
) 多くの場合、特にノートブックに tmpfs をマウントして、SSD の場合にディスクをスピンアップさせたり、摩耗を回避したりする必要がないようにします。