initrdとinitramfsの違い?
質問
私の知る限りでは
initrd
はブロックデバイスとして動作するため、 ファイルシステムドライバ (例えば
ext2
). のファイルシステムを検出するために、カーネルは少なくとも一つの組み込みモジュールを持っていなければなりません。
initrd
. この記事では
初期RAMディスクの新しいモデルであるinitramfsの紹介
と書かれています。
しかし、ラムディスクは実際にはキャッシュのためにさらにメモリを浪費しています。Linux は ブロックデバイスから読み書きされるすべてのファイルやディレクトリエントリをキャッシュするように設計されています。 ブロック デバイスに読み書きされるすべてのファイルとディレクトリ エントリをキャッシュするように設計されているため、Linux はラムディスクとの間でデータを にコピーし、quot;ページ・キャッシュ(ファイル・データ用) ディレクトリ・エントリー)。ラムディスクがブロックデバイスのふりをすることの欠点は、ブロックデバイスのように扱われることです。 ブロックデバイスのように扱われることです。
何が
page cache
と
dentry cache
? 段落の中で、データが重複したのは
ramdisk
はブロックデバイスとして扱われるため、すべてのデータがキャッシュされるということでしょうか?
対照的に
ramfs
:
数年前、Linus Torvalds は、Linux のキャッシュをファイルシステムのようにマウントできたらどうだろう、という素敵なアイデアを思いつきました。 をファイルシステムのようにマウントできたらどうだろう? Linux のキャッシュをファイル システムのようにマウントできたらどうだろう? 削除されるか、システムがリブートされるまで、キャッシュは決して取り除かれることはないのです。 Linus は "ramfs" と呼ばれる、キャッシュの小さなラッパーを書きました。 カーネル開発者は "tmpfs" と呼ばれる改良版を作成しました(これはスワップ領域にデータを書き込むことができます)。 スワップ領域にデータを書き込むことができ、特定のマウントポイントのサイズを制限することができます。 と呼ばれる改良版が作られました(スワップ領域にデータを書き込み、特定のマウントポイントのサイズを制限して、利用可能なメモリをすべて消費する前に満タンにすることができます)。Initramfs はtmpfsのインスタンスです。
これらのラムベースのファイルシステムは、格納するデータのサイズに合わせて自動的に大きくなったり小さくなったりします。
これらのラムベースのファイルシステムは、それらが含むデータのサイズに合わせて自動的に拡大または縮小します。ramfs にファイルを追加する (または既存のファイルを拡張する) と、より多くのメモリが自動的に割り当てられます。 にファイルを追加する (または既存のファイルを拡張する) と、より多くのメモリが自動的に割り当てられ、ファイルを削除または切り捨てることでそのメモリが解放されます。 ファイルを削除したり、切り詰めたりすると、そのメモリは解放されます。ブロックデバイスとキャッシュの間に重複はありません。 ブロックデバイスがないため、ブロックデバイスとキャッシュの間に重複はありません。キャッシュ内のコピーは キャッシュのコピーは、データの唯一のコピーです。何より素晴らしいのは、これは新しいコードではなく コードではなく、既存のLinuxキャッシングコードの新しいアプリケーションです。 つまり、サイズをほとんど追加せず、非常にシンプルで、非常によくテストされたインフラをベースにしているのです。 つまり、サイズをほとんど追加せず、非常にシンプルで、非常によくテストされたインフラストラクチャに基づいています。
まとめると
ramfs
は、ファイルを開いてメモリに読み込んだだけですよね?
どちらも
initrd
と
ramfs
はコンパイル時にzipで圧縮されますが、その差は
initrd
は起動時にカーネルによってマウントされるように解凍されたブロックデバイスであるのに対し
ramfs
はcpio経由でメモリにアンパックされます。私は正しいのでしょうか?それとも
ramfs
は非常に最小限のファイルシステムですか?
最後に、今日に至るまで
initrd
のイメージは、最新のカーネルでも提示されています。しかし、その
initrd
は実際に
ramfs
は現在も使われており、その名称は歴史的な目的のためだけなのでしょうか?
どのように解決するのですか?
デントリ(およびinode)キャッシュ
Linuxのファイルシステムサブシステムには3つの層があります。VFS (仮想ファイルシステム) は、システムコールインターフェイスを実装し、クロスマウントポイントとデフォルトの許可および制限のチェックを処理します。その下には、個々のファイルシステム用のドライバーがあり、それらは順番にブロック デバイス (ディスク、メモリ カードなど。ネットワーク インターフェイスは例外) 用のドライバーに接続します。
VFS とファイルシステムの間のインタフェースはいくつかのクラスです (プレーン C なので、関数へのポインタを含む構造体などですが、概念的にはオブジェクト指向のインタフェースです)。主な 3 つのクラスは次のとおりです。
inode
で、これはファイルシステム内の任意のオブジェクト (ファイルやディレクトリ) を記述します。
dentry
はディレクトリ内のエントリを記述し
file
は、プロセスによって開かれたファイルを記述します。マウントされると、ファイルシステムドライバは
inode
と
dentry
をルートとし、他のものはプロセスがファイルにアクセスしたいときに必要に応じて作成され、最終的に失効します。これがデントリキャッシュとインノードキャッシュです。
そうです、開いているすべてのファイルとルートまでのすべてのディレクトリに
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 をマウントしています。
関連
-
Linux sarコマンドによるシステム性能の詳細解析事例
-
Kali Linuxのデスクトップの外観スタイルを変更するには? KALIの外観の最適化のヒント
-
deepin depth systemはどのような内容でアップデートされましたか?deepinの最新版アップデート内容まとめ
-
エラーの解決方法 お客様のバージョンは /bin/bash: java: コマンドが見つかりませんでした。
-
sudo が sudo として表示される: setuid root である必要がある
-
Apache の一般的な設定エラー
-
[解決済み] cronは内部でどのようにジョブをスケジューリングしているのですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] フォルダとそのサブフォルダ/ファイルのパーミッションを一括で変更する方法
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
LinuxでSteamをダウンロードしインストールする方法
-
Linux ddコマンド詳細説明:データのバックアップ、およびバックアッププロセスでのフォーマット変換のケース
-
Linuxにおけるxinetdサービスの管理方法に関するケーススタディ
-
Linuxのデスクトップの背景を画像で引き伸ばし表示にする方法とは?
-
Linux Mintシステムでプログラムをアンインストールするには? Linux で不要なアプリケーションをアンインストールするためのヒント
-
Linux Mintで入力メソッドを削除する方法は?Linux Mintで冗長な入力メソッドを削除するためのヒント
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] Linuxで特定のポートで動作しているプロセスを停止させる方法は?
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する
-
[解決済み】オペレーティングシステムなしでプログラムを実行するには?