【Linux カーネル: OS 入門5】ファイルシステムの機能

ファイルシステムとはファイルシステムとは、ストレージ等を「ファイル」単位で管理するカーネルの機能です。
これにより、ファイル名を経由してストレージ上のデータへアクセスできるようになります。

ファイルシステムには様々な機能がありますが、本記事では以下を紹介します。

ファイルシステムの機能説明
ファイル割り当て方法ファイルの内容をストレージのブロックに割り当てる方法
シンボリックリンクファイルのショートカット
スナップショット任意の時点でのストレージのデータを記録
パーミッションファイルのアクセス許可
ジャーナリングファイルストレージのデータの整合性を保つ
Linux カーネルの機能
スポンサーリンク

ファイルシステムの種類

Linux の主なファイルシステムは、以下のとおりです。

ファイルシステムの種類説明
ext4RHEL6/CentOS6 のデフォルト。安定してる
XFSRHEL7,8/CentOS7,8 のデフォルト。断片化に対する影響がない
NFS同じネットワーク間でファイル共有に使用
SMBWindows とのファイル共有に使用
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/managing_file_systems/index#types-of-file-systems_overview-of-available-file-systems

以降では、多くのファイルシステムに共通する機能を紹介します。

スポンサーリンク

ファイル割り当て方法

ファイル割り当て方法 (File Allocation Methods)ファイル割り当て方法とは、ファイルの内容をストレージのブロックに割り当てる方法です。

ファイル割り当て方法には以下の3つが存在します。

  • 連続割り当て
  • 連結リスト割り当て
  • インデックス割り当て

連続割り当て

連続割り当てとは、ファイルを指定したアドレスから連続するブロックに割り当てる方法です
inode ファイル名・開始ブロックのアドレス・長さを記録
https://www.geeksforgeeks.org/file-allocation-methods/

上記の mai ファイル (6ブロック分のデータ) で、連続割り当てを説明します。

  1. 開始ブロックのアドレスを 19 番に決定 (start)
  2. 連続する6ブロック (19, 20, 21, 22, 23, 24) 割り当て (length)

連続割り当ての特徴

連結リスト割り当て

連結リスト割り当てとは、各ブロックが次のブロックへのポインターを持つ割り当て方法です
inodeファイル名・開始ブロックのアドレス・終了ブロックのアドレスを記録
https://www.geeksforgeeks.org/file-allocation-methods/

上図の jeep ファイルで、連結リスト割り当てを説明します。

  1. 開始ブロックのアドレスを9番に決定 (start)
  2. ブロックにデータを割り当て、次のブロックのポインターを記録
  3. 2を繰り返し、全データの割り当てが完了するとポインターに -1 を記録して終了 (end)

連結リスト割り当ての特徴

  • メリット○:
  • デメリット✗:
    • 読み込み速度が遅い(アクセスするブロックのアドレスを毎回探す必要がある)
    • ダイレクトアクセスできない (前からポインターを順番に辿る必要がある)

インデックス割り当て

インデックス割り当てとは、インデックスブロックと呼ばれる「全てのブロックへのポインターを順番に持つブロック」を利用する割り当て方法です。
inodeファイル名・インデックスブロックのアドレスを記録
https://www.geeksforgeeks.org/file-allocation-methods/

上図の jeep ファイルで、インデックス割り当てを説明します。

  1. インデックスブロックのアドレスを 19 番に決定 (index block)
  2. 空いてるブロックにデータを割り当てる
  3. 2のブロックのアドレスをインデックスブロックに記録
  4. 全てのデータを割り当てるまで、2と3を繰り返す

インデックス割り当ての特徴

  • メリット○:
  • デメリット✗:
    • インデックスブロック用のスペースを無駄に食う

まとめ:割り当て方法の比較

連続連結リストインデックス
シーケンシャルアクセス
ダイレクトアクセス×
フラグメントを克服×
ファイルサイズの変更×
ポインターのオーバーヘッド○ (無し)×
アクセス速度×
スポンサーリンク
シンボリックリンクシンボリックリンクとは、ファイルやディレクトリへのリンクを持つファイルのことです。
Windows でいうショートカットのことです。

シンボリックリンクは ln -s <リンク元> <リンク先> で作成できます。

ln -s /bin/ls symbolic_test
symbolic_test
ls -l symbolic_test
lrwxrwxrwx 1 ec2-user ec2-user 7  7月 23 10:40 symbolic_test -> /bin/ls
./symbolic_test /
bin boot dev etc home... var

スナップショット

スナップショットスナップショットとは、ある時点のデータを保存することです。

バックアップと似てますが、スナップショットは取得時点でポインタを取得するだけです。

スナップショットの場合
バックアップの場合

データブロックをコピーしないため、バックアップより短時間で取得可能です。

スナップショットの種類

スナップショットの種類には以下の2つが存在します。

  • Copy on Write (CoW)
  • Redirect on Write (RoW)

Copy on Write (CoW)

Copy on Write (CoW) スナップショットとは、データを更新する時に、更新のデータを「スナップショット予約済みスペース」にコピーする方法です。
After Modifications は元のデータブロックから B を削除して、D を変更し、E,F を追加
https://technoscooop.wordpress.com/tag/copy-on-write/
  1. スナップショットを取得 = ブロックのポインタを取得
  2. スナップショットを取得したブロックを更新する時、更新前のブロックをコピーして退避
  3. スナップショットのポインタを「スナップショット予約済みスペース」に変更

ちなみに Windows では VSS(ボリュームシャドウコピー)と呼ばれてます。

Redirect on Write (RoW)

Redirect on Write (RoW) スナップショットとは、データを更新する時に、更新のデータを「スナップショット予約済みスペース」に書き込む方法です。
After Modifications は元のデータブロックから B を削除して、D を変更し、E,F を追加
https://technoscooop.wordpress.com/tag/copy-on-write/
  1. スナップショットを取得 = ブロックのポインタを取得
  2. スナップショットを取得したブロックを更新する時、更新後のデータは「スナップショット予約済みスペース」に書き込む
  3. 元のデータのポインタを「スナップショット予約済みスペース」に変更

パーミッション

パーミッションパーミッションとは、ファイルに設定する「ユーザー」・「ユーザーグループ」ごとのアクセス権限のことです。

Linux は複数のユーザーが同時に操作することを想定されているため、ユーザーごとにファイルのアクセス権限を設定できます。

パーミッションについては、以下の記事にまとめています。

ジャーナリングファイルシステム

ジャーナリングファイルシステムジャーナリングファイルシステムとは、ファイルの更新中に電源断等が発生しても、元のファイルに復元可能な仕組みです。

ジャーナリングの動作

ジャーナリングは、以下の手順でファイルを更新します。

  1. メインメモリ上のメタデータを更新
  2. メタデータの更新内容をストレージ上のジャーナルログに書き出す
  3. 実際にファイルデータブロックi-node)を更新
  4. ジャーナルログを破棄

以降では、mv (ファイルを移動するコマンド) を用いてジャーナリングの動作を説明します。

1. メインメモリのメタデータを更新

/hoge ディレクトリに、foo, bar のファイルが存在すると仮定します。

まず、メインメモリ上のメタデータを更新するため、ストレージのデータに変化はありません。

1. メインメモリ上のメタデータを更新(ストレージのデータに変化なし)

この時点で電源が落ちると、ストレージに書き込まれていないので mv 実行前に戻るだけです。

2. メタデータの更新内容をストレージ上のジャーナルログに書き出す

/hoge/bar を /bar に移動させるメタデータをジャーナルログに書き込みます。

この時点で電源が落ちると、次の2パターンに分かれます。

  • ジャーナルログ書き込みが途中の場合:ジャーナルログの内容を全て廃棄します
  • ジャーナルログ書き込みが完了した場合:問題ないので、以下の3に進みます

実際にファイルを更新

ジャーナルログに従って、ファイルを更新のトランザクション処理を行います。

3. 実際にファイルデータブロックi-node)を更新
3. 実際にファイルデータブロックi-node)を更新

この時点で電源が落ちると、次の2パターンに分かれます。

ジャーナルログを廃棄

4. ジャーナルログを破棄

この時点で電源が落ちると、ジャーナルログが残っている場合は破棄します。

関連情報

Linux カーネルの機能

参考サイト

OS Exams Questions with Answers
OS Exams Questions with Answers - This tutorial covers concepts like overview of Operating System, Types, Services, Properties, Process Scheduling, CPU Scheduli...