1. ホーム
  2. linux

initrdとinitramfsの違い?

2023-10-02 09:32:11

質問

私の知る限りでは initrd はブロックデバイスとして動作するため、 ファイルシステムドライバ (例えば ext2 ). のファイルシステムを検出するために、カーネルは少なくとも一つの組み込みモジュールを持っていなければなりません。 initrd . この記事では 初期RAMディスクの新しいモデルであるinitramfsの紹介 と書かれています。

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

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

対照的に ramfs :

数年前、Linus Torvalds は、Linux のキャッシュをファイルシステムのようにマウントできたらどうだろう、という素敵なアイデアを思いつきました。 をファイルシステムのようにマウントできたらどうだろう? Linux のキャッシュをファイル システムのようにマウントできたらどうだろう? 削除されるか、システムがリブートされるまで、キャッシュは決して取り除かれることはないのです。 Linus は "ramfs" と呼ばれる、キャッシュの小さなラッパーを書きました。 カーネル開発者は "tmpfs" と呼ばれる改良版を作成しました(これはスワップ領域にデータを書き込むことができます)。 スワップ領域にデータを書き込むことができ、特定のマウントポイントのサイズを制限することができます。 と呼ばれる改良版が作られました(スワップ領域にデータを書き込み、特定のマウントポイントのサイズを制限して、利用可能なメモリをすべて消費する前に満タンにすることができます)。Initramfs はtmpfsのインスタンスです。

これらのラムベースのファイルシステムは、格納するデータのサイズに合わせて自動的に大きくなったり小さくなったりします。

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

まとめると ramfs は、ファイルを開いてメモリに読み込んだだけですよね?

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

最後に、今日に至るまで initrd のイメージは、最新のカーネルでも提示されています。しかし、その initrd は実際に ramfs は現在も使われており、その名称は歴史的な目的のためだけなのでしょうか?

どのように解決するのですか?

デントリ(およびinode)キャッシュ

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

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

そうです、開いているすべてのファイルとルートまでのすべてのディレクトリに inode そして dentry 構造体がカーネルメモリに割り当てられ、それを表現しています。

ページキャッシュ

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

ページは mmap インターフェースを実装するために使用され、通常の読み取りと書き込みのシステムコールはファイルシステムによって他の手段で実装できますが、大半のインターフェースはページを使用する汎用関数を使用しています。汎用関数には、ファイルの読み込みが要求されたときにページを割り当て、ファイルシステムを呼び出してページを1つずつ埋めていくものがあります。ブロックデバイスベースのファイルシステムでは、適切なアドレスを計算するだけで、この充填はブロックデバイスドライバに委ねられます。

ramdev (ラムディスク)

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

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

tmpfs

Tmpfsは違います。これはダミーのファイルシステムです。VFS に提供するメソッドは、VFS を動作させるための必要最低限のものです (そのため、inode、dentry、および file メソッドが何をすべきかを示す優れた文書となっています)。ファイルは、対応する inode と dentry が inode キャッシュに存在する場合にのみ存在し、ファイルが作成されたときに作成され、ファイルが削除されない限り有効期限はありません。ページはデータが書き込まれたときにファイルに関連付けられ、それ以外は匿名のものとして振る舞います(データはswapに保存されるかもしれません。 page 構造体はファイルが存在する限り使用され続けます)。

これは、メモリ内にデータの余分なコピーがないことを意味し、全体がよりシンプルになり、その結果、わずかに速くなります。他のどのファイルシステムでもキャッシュとして機能するデータ構造を、単に主要なストレージとして使用します。

これは、新しい実装方法である initrd ( initramfs と呼ばれるだけで、画像はまだ initrd ).

これはまた、"posix 共有メモリ" を実装する方法です (これは単に、tmpfs を /dev/shm にマウントされ、アプリケーションはそこに自由にファイルを作成し、それらを mmap することができます。 /tmp/run (または /var/run ) は、特にノートブックでは、ディスクをスピンアップさせないようにするため、または SSD の場合の摩耗を避けるために、しばしば tmpfs をマウントしています。