ファイルシステムがストレージデバイスに対してどのように書き込みと読み取りを行うのか知りたい。
私はこれがどのように機能するかを考えています:
ファイルシステムはストレージデバイスに直接アクセスしませんが、ストレージデバイスは(非常に大きな)バイト配列として(ストレージデバイスのデバイスドライバーによって)ファイルシステムに提供されます。
たとえば、ファイルシステムがハードディスクにアクセスする場合、ハードディスクを表すバイト配列にアクセスするだけです。
このようにして、ファイルシステムは任意のタイプのストレージデバイス(従来のハードディスク、SSD、USBフラッシュドライブなど)で機能し、ストレージデバイスのデバイスドライバーのみが変更されます。
この画像は、今説明したことを示しています。
私の理解は正しいですか?
Linux(および1980年代のUnix)では、ストレージデバイス(多くの場合、 ディスクパーティション の一部の ハードディスク 、または一部の [〜#〜] ssd [〜#〜] )はブロック device ( thisを参照) ) blocks の[サブ-]シーケンスも同様です(これは物理的なI/Oの基本単位)。物理ブロックサイズはハードウェアに依存します(古いIDEディスクには512バイトのブロックサイズがあり、新しい大きな )[〜#〜] sata [〜#〜] ディスクのブロックサイズは4Kバイト、読み取り Advanced Format wikipage)、およびファイルシステムを作成するとき(例:mkfs
を使用)は、 mke2fs(8) )は、その物理ブロックサイズの倍数(多くの場合、1を含む2の小さな累乗)である論理ブロックサイズを指定できます。 論理ブロックアドレス指定 。
過去(1990年代のSun3ワークステーションを考えると)、ディスクは sectors (read [〜#〜] chsで編成されたヘッドで構成されたシリンダーでできていました) [〜#〜] wikipage)、ブロックを含むセクターがあります。今日でもこれらは残っていますが、ハードディスクコントローラ(ディスク自体の回路)によって提供される人工的な人工物です。一部のOSでは、ブロックデバイスドライバーが再スケジュールおよび再注文されましたIOディスクヘッドの移動と 回転待ち時間 を最小限にするための要求)。
このようにして、ファイルシステムはあらゆる種類のストレージデバイス(従来のハードディスク、SSD、USBフラッシュドライブなど)で機能し、ストレージデバイスのデバイスドライバーのみが変更されます。
はい、しかし悪は詳細にあります(たとえば [〜#〜] trim [〜#〜] および について読みます)増幅を書きます 、SSDに固有)。また、詳細は重要であるため、実際の実装は図よりも単純ではありません。 ファイルシステム (および クラスター化された およびリモートファイルシステム を含む)についての詳細を読む[〜#〜 ] smb [〜#〜] & [〜#〜] nfs [〜#〜] ;論理ボリュームマネージャー についても参照 )。
読み取り オペレーティングシステム:3つの簡単な部分 (およびその永続性部分)。
blockデバイスがFreeBSD でなくなっていることに注意してください(実際には、文字デバイスとブロックデバイスに共通の抽象化を提供しています)。 WindowsでもOSはパーティションやブロックサイズなどを認識していると思います(ただし、確認する必要があります)。
バジル・スタリンケビッチの言うことはすべて正しい。もう少し追加します。実際、ディスクドライブは「ブロック」ドライブでしたが、ブロックデバイス(および他の多くのデバイス)は、「raw」と「cooked」の2つの形式で提供されていました。 rawデバイスは、ネイティブストレージのチャンクサイズの倍数であるチャンクでのみアドレス指定できます。したがって、ローディスクデバイスは、1バイトまたは2バイトではなく、一度に1つまたは複数のブロックのみを読み書きできます。クックされたデバイスは、そのようなより小さな操作を可能にするレイヤー、および他のさまざまな機能を追加しました。
ファイルシステムはrawデバイスで動作するため、バイトの大きな配列ではなく、BSのような大きなブロックの配列と見なされていました。説明した。