OS はハードディスクに保存されているファイルにどのようにアクセスするのでしょうか?

OS はハードディスクに保存されているファイルにどのようにアクセスするのでしょうか?

OS がハードディスク上で最初にアクセスするのはスーパーブロックであることはわかっています。

しかし、その後はどうなるのでしょうか?

答え1

OS はカーネルに依存しており、カーネルはさまざまなファイル システムのドライバーを使用して読み取り/書き込みを行います。ファイルの処理はドライバーとシステム コールを通じて抽象化されるため、open("file.txt")ファイルがディスク上にどのように保存されているかなどを知る必要はありません。ファイル システムは多岐にわたり、それぞれ独自の処理方法を持っています。以下は、ext システムに関する一般的なスニペットです。


Ext による例。

  1. ブロック: ディスクはブロック連続したスペース。
  2. ブロックグループ: ブロックはグループに分けられます。
  3. iノード: ファイル、ディレクトリなどのエントリに関する構造化された情報セット。
  4. ディレクトリ: inode <–> 名前のリスト

それぞれブロックグループグループに属する inode 構造体のテーブルを持ちます。


コアレイアウト:

                     Padding  1024 bytes
                 Super-Block  1 block          *
Block Group Descriptor Table  many blocks      *
                    Reserved  many blocks
           Data Block Bitmap  1 block          *
                inode Bitmap  1 block          *
                 inode Table  many blocks      *
                 Data Blocks  many more blocks *

スーパーブロック次のような情報を保持します。

  • inode の総数
  • ブロックの総数
  • グループ内のブロック数
  • グループ内のiノードの数

ブロック グループ 0 に保存されるほか、冗長コピーがバックアップとして別の場所に保存されます (破損の場合)。


ブロックグループ記述子テーブルの直後にスーパーブロックとりわけ、次のようなことが言えます。

  • ブロックグループパーティション内
  • それぞれの説明ブロックグループ

各記述子には、その記述子のデータ構造がどこにあるかに関する情報が含まれています。ブロックグループ位置しています。


ブロックグループとりわけ、次のようなことが当てはまります。

  • inode テーブルが始まるブロック アドレス
  • グループ内のディレクトリ数

ビットマップ使用に関する情報を保持します。0未使用の場合は「未使用」、1使用の場合は「使用済み」です。


iノード(インデックスノード)

inode構造はない所有:

  • 名前
  • ファイルデータ

inode には次のような情報が保持されます。

  • タイプ、権限、ユーザー、日付、…データへのポインタ

ファイルのデータはブロック単位で保存されます。inodeはファイルが占めるブロックに関する情報を保持します。これはinode内のポインタによって行われます。inodeには複数のブロックがあります。タイプポインター。データへのポインターを PTR として次のように呼び出すとします。

[PTR] DATAでブロックするアドレス

  • 12 - 直接ポインタ:
    • [PTR] DATAでブロックするアドレス
  • 1 - 単間接ポインタ:
    • [S_PTR] PTRのリストでブロックするアドレス
  • 1 - 二重間接ポインタ:
    • [D_PTR] S_PTRのリストでブロックするアドレス
  • 1 - 三重間接ポインタ:
    • [T_PTR] D_PTRのリストでブロックするアドレス

1つのポインタの数ブロック依存しているブロックサイズ


ディレクトリ

ディレクトリは inode です。そのデータにはファイルに関する情報が保持されます。各エントリは名前と inode をリンクします。各ディレクトリには.、それ自体の と、..親ディレクトリに実質的にリンクする もあります。これらは削除できません。

ルートディレクトリは常にextにinode 2を持っています。stat /または確認してcd /; stat .ください。...

ファイルが作成されると、適切なディレクトリに自動的に追加されます。


inode 番号はインデックスです。inode テーブル内の inode 構造への順序付けられたインデックスです。inode 構造のサイズは固定されているため、inode 構造がどこにあるかを計算することができます。

スーパーブロックにはグループあたりの inode 数ブロックグループは次のようにして見つけることができます。

block_group = (inode - 1) / inodes_per_group;

その後、インデックスを見つけます。

inode_index = (inode - 1) % inodes_per_group;

構造とデータへのリンクを読み取ります。データを読み取ります。

デバッグ

debugfsファイル システムに関するさまざまな情報を抽出するために使用できます。

-wデータが気になる場合はフラグを使用しないようにしてください。

必要に応じて、試すための小さなサンプルを作成します。

truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test

?コマンドのリストを表示するにはEnterを押します。


debugfs: stats(縮小版)

Inode count:              256
Block count:              2048
Reserved block count:     102
Free blocks:              953
Free inodes:              240
First block:              1
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Blocks per group:         8192
Inodes per group:         256
Inode blocks per group:   32
First inode:              11
Inode size:               128
Directories:              5
 Group  0: block bitmap at 18, inode bitmap at 34, inode table at 50
           953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
           [Checksum 0x055a]
...
debugfs:  imap hello.txt
Inode 12 is part of block group 0
    located at block 51, offset 0x0180

その他の例: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html

関連情報