TLDP からのこの画像は非常に素晴らしいです。ユーザー空間にファイルシステムへの実際の読み取り、書き込み、オープン アクセスを与える前に、ブロックが仮想ファイルシステムにマップされることを示しています。
そしてウィキペディア異なるレイヤーに 3 つのバージョンのファイル システムがあることを示します。
それで、標準(SDノード)は物理的なものを指すのでしょうか、それともライトVMマップされた仮想ファイルシステム?
それとも、パーティションだけを指しているのでしょうか?(つまり、パーティションに直接書き込むとファイルシステム ドライバーがスキップされ、それがなければファイル自体を操作することすらできなくなります)
もしそうなら、どのデバイスがファイルシステム ドライバーやファイルシステムを表しているのでしょうか。まったくわかりません。カーネルによるディスク使用法について説明しているものを誰かリンクしていただけませんか?
答え1
要約:/dev/sdaX
はパーティションを表します。ファイルシステムとパーティションの違いについて、根本的な誤解があると思います。パーティションは非常に単純で、基本的にはディスクの先頭のパーティション テーブルで定義されるディスクのセクションにすぎません。ただし、ファイルシステムははるかに高度なものです。ファイルシステムは基本的に、カーネル (具体的にはファイルシステム ドライバー) が読み取りおよび書き込みできるファイルを追跡するために使用されるデータ構造です。そのデータ構造は技術的にはディスク上のどこにでも配置できますが、fs データ構造の先頭はパーティションの先頭と同じであることが期待されます。
質問の中で LVM について言及されていますが、これはより高度なトピックなので、今のところは忘れておきましょう (LVM については最後に説明します)。
ゼロしか入っていない 100GB のハードディスクが 1 台あるとします。この場合、/dev/sda
100GB のファイル (ただし、du
ブロック スペシャルなので、eg では長さがゼロであると報告されます) があり、そのファイルにはゼロしか入っていません。は、/dev/sda
カーネルが raw デバイスの内容をユーザー空間に公開して読み取りと書き込みを行う方法です。これが、ディスクと同じ量のデータがあり、ディスクと同じ内容である理由です。5 番目のビットを/dev/sda
0 ではなく 1 にすると、カーネルは物理ドライブの 5 番目のビットをそれに合わせて反転します。提供された図では、この書き込みはシステム コール インターフェイスを経由してカーネルに入り、次に IDE ハードディスク ドライバーを経由して、最終的にハードディスク自体に送られます。
さて、そのドライブで何か役に立つことをしたい、例えばそこにファイルを保存するなどしたいとします。そこでファイルシステムが必要になります。Linuxカーネルでは、膨大な数のファイルシステムが利用可能です。それぞれのファイルシステムは、ディスク上の異なるデータ構造を使用してファイルを追跡し、また、異なる方法でデータ構造を変更することもあります。例えば、アトミック書き込み保証されます (つまり、書き込みは成功するか失敗するかのどちらかであり、マシンがクラッシュしてもデータが半分書き込まれることはありません)。これが、人々が「ファイルシステム ドライバー」について話すときに意味するものです。ファイルシステム ドライバーは、ディスク上の特定のファイルシステムのデータ構造を読み書きする方法を理解するコードです。例としては、ext4、btrfs、XFS などがあります。
ファイルを格納したいとします。ファイルシステムとして ext4 を選択したとします。次に、ディスクをフォーマットして、空のファイルシステムのデータ構造がディスク上に存在するようにします。これを行うには、 を使用してmkfs.ext4
に書き込むように指示します/dev/sda
。mkfs.ext4
は、 の先頭から空の ext4 ファイルシステムを書き込みます/dev/sda
。次に、カーネルは への書き込みを受け取り/dev/sda
、それを物理ディスクの先頭に適用します。これで、ディスクにファイルシステムのデータ構造が含まれるようになったので、たとえば を実行して、mount /dev/sda /mnt
新しいファイルシステムをマウントしたり、そこにファイルを移動したりすることができます。 のファイルへの書き込みは、/mnt
システム コール インターフェイスを経由して、ext4 ファイルシステム ドライバー (このドライバーは、より抽象的な「このデータをこのようなファイルに書き込む」という処理を、ディスク上の fs データ構造に必要な具体的な変更に変換する方法を知っています) に送られ、次に IDE ハード ディスク ドライバーに送られ、最後にドライブ自体に送られます。
さて、上記の方法はうまくいきますが、通常はそうではありません。通常、パーティションドライブ上のパーティションは、基本的にドライブの特定のセクションです。パーティションを使用すると、パーティションテーブルドライブの先頭に、各パーティションが物理的にどこにあるかを示す番号があります。パーティションは、ドライブを複数のセクションに分割して、さまざまな目的に使用できる便利な機能です。
では、作成したいとしましょう二ドライブには 2 つのファイルシステムがあり、どちらも約 50GB (つまり半分ずつ) です。まず、ドライブをパーティション分割する必要があります。これを行うには、fdisk
または などのツールを使用しますgdisk
。どちらも異なるタイプのパーティション テーブルを作成し、ツールに に書き込むように指示します。パーティション分割が完了すると、 、、が作成/dev/sda
されます。と は、カーネルがディスク内の異なるパーティションを表す方法です。 の先頭に書き込むと、にある 2 番目のパーティションの先頭に書き込まれます。/dev/sda
/dev/sda1
/dev/sda2
/dev/sda1
/dev/sda2
/dev/sda2
ディスクの中央。
これを説明する別の方法は、 の内容について話すことです/dev/sda
。/dev/sda
は、ビット単位で物理ハード ドライブの内容です。 は/dev/sda1
、ビット単位でハード ドライブの最初のパーティションの内容です。つまり、 には、/dev/sda
パーティション ヘッダーという小さなデータがあり、/dev/sda1
その後にの正確な内容が続き/dev/sda2
、/dev/sda1
と が/dev/sda2
ディスク上の特定の領域、つまり構成したパーティションにマップされます。
ここから、mkfs.ext4
を再度使用して にファイルシステムを作成できます。これにより、/dev/sda1
パーティション ヘッダーの直後からディスクに書き込みが行われます。mkfs.ext4
を で使用すると/dev/sda2
、パーティションの先頭から書き込みが行われます。これはディスクの中央 (つまり/dev/sda
の内容の中央) にあります。
ここで、例えば を実行できますmount /dev/sda2 /mnt
。これは、カーネルに、2 番目のパーティションの先頭からファイルシステム データを読み取り、より便利な形式 (つまり、 の場所にあるファイルとディレクトリ) で公開するように指示します/mnt
。ここでも、カーネルはファイルシステム ドライバーを使用して実際にこのマッピングを実行します。
ここで、LVM について簡単に説明します。LVM は基本的にパーティションの抽象化にすぎません。パーティションは、ディスク上の物理的な場所に非常に直接的にマップされます。上記の 2 つのパーティションの例では、最初のパーティションを削除し、2 番目のパーティションを新しく解放されたスペースに拡張するとします。パーティションはディスク領域に直接マップされるため、これを行う唯一の方法は、50 GB のパーティション データ全体を物理的にディスクの先頭に移動し、パーティションを末尾まで拡張することです。
LVM は、この負担を軽減するように設計されています。基本的に、LVM に大量の生のストレージを与え、そのストレージの使用方法を指示します。LVM は、パーティションのように分割できる仮想「ディスク」を提供しますが、その基礎となるストレージは、割り当てた生のストレージ プール内のどこにでも配置できます。上記の例を使用すると、LVM にディスク全体を割り当てて 2 つに分割した場合、最初の「パーティション」を削除して 2 番目の「パーティション」を拡張し、そのスペースを即座に埋めることができます。これは、LVM が、厳密に「順序どおり」である必要なしに、ディスク上のデータの場所を追跡できるためです。
LVM の仕組みの詳細については、次の回答を参照してください。https://unix.stackexchange.com/a/106871/29146
答え2
/dev/sda
は、ハード ドライブ全体へのインターフェイスです。権限があれば、ドライブ内の任意の場所を直接シークできます。は、/dev/sda1
ドライブ上の最初のパーティションです。この時点では、ファイル システムはまだ関与していません。パーティション内には、ファイル システムを直接配置することも、LVM コンテナーを配置することもできます。