オペレーティングシステムは、ハードドライブに保存されているファイルにどのようにアクセスしますか?

オペレーティングシステムは、ハードドライブに保存されているファイルにどのようにアクセスしますか?

私はオペレーティングシステムがハードディスクから最初にアクセスすることがスーパーブロックであることを知っています。

しかし、それではどうなりますか?

答え1

オペレーティングシステムは、読み取り/書き込みにさまざまなファイルシステム用のドライバを使用するカーネルに依存します。ファイル処理は、ドライバとシステムコールを介してインタフェースを介して抽象化されるため、open("file.txt")ファイルがディスクなどに保存される方法を知る必要はありません。さまざまな種類のファイルシステムがあり、それぞれ独自の作業方法があります。これはextシステムの一般的なスニペットです。


拡張の例。

  1. ビルディングブロック:ディスクは次のように分割されています。ビルディングブロック連続空間。
  2. ブロックグループ:ブロックはグループに分けられます。
  3. インデックスノード:アイテム(ファイル、ディレクトリなど)の構造化情報セット。
  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 数

重複コピーは、ブロックグループ0に保存されているだけでなく、バ​​ックアップ(破損)として他の場所に保存されます。


ブロックグループ記述子テーブル直接スーパーブロック。これには以下が含まれます。

  • 数量ブロックグループ分割中
  • 各記述子ブロックグループ

各記述子は、記述子のデータ構造に関する情報を含む。ブロックグループ横になる。


ブロックグループとりわけ、次のように確立されました。

  • inodeテーブルが起動されるブロックアドレス
  • グループのディレクトリ数

ビットマップ使用量に関する情報を保存します。0未使用と1中古。


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

inode構造の機能は次のとおりです。いいえキャッチ:

  • 名前
  • ファイルデータ

インデックスノードには、次の情報が含まれます。

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

ファイルのデータはブロックに保存されます。 inodeには、ファイルが占めるブロックに関する情報が含まれています。これは、inodeのポインタを介して行われます。 1つ以上がありますタイプ針。データPTRへのポインタを呼び出すと、次のようになります。

[PTR]データブロックのアドレス

  • 12 - 直接ポインタ:
    • [PTR]データブロックのアドレス
  • 1 - 単一間接ポインター:
    • [S_PTR] PTRリストを含むブロックアドレス
  • 1 - 二重間接ポインター:
    • [D_PTR] S_PTRリストを含むブロックアドレス
  • 1 - トリプル間接ポインタ:
    • [T_PTR] D_PTRリストを含むブロックアドレス

ポインタの数詰まったに従ってブロックサイズ


目次

ディレクトリはインデックスノードです。そのデータにはファイルに関する情報が含まれています。各エントリは名前とインデックスノードにリンクされます。各ディレクトリには、親ディレクトリに効果的に関連付けられた.独自のディレクトリもあります。..これは削除できません。

ルートディレクトリには常に拡張子にinode 2があります。やっstat /てみcd /; stat .てください。その..リンクは.

ファイルが作成されると、正しいディレクトリに方向的に追加されます。


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

?コマンドのリストを入力してください。


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

関連情報