

なお、本記事は Linux カーネル解説の第5回「ファイルシステムの機能」に関する記事です。
- 【Linux カーネル: OS 入門1】OS、カーネルとは
- 【Linux カーネル: OS 入門2】CPU、プロセス管理
- 【Linux カーネル: OS 入門3】メモリ管理
- 【Linux カーネル: OS 入門4】ストレージ管理、ファイル
- 【Linux カーネル: OS 入門5】ファイルシステムの機能 ←イマココ
- 【Linux カーネル: OS 入門6】RAID
- 【Linux カーネル: OS 入門7】I/O デバイス管理
- 【Linux カーネル: OS 入門8】IPC (プロセス間通信)
ファイルシステムの主な機能
ファイルシステムの主な機能は以下の5つです。
ファイルシステムの機能 | 説明 |
---|---|
ファイルアクセスメカニズム | ファイルを利用してストレージにアクセス |
パーミッション | ファイルのアクセス許可 |
シンボリックリンク | ファイルのショートカット |
スナップショット | 任意の時点でのストレージのデータを記録 |
ジャーナリング | ファイルとストレージのデータの整合性を保つ |
以降では、ファイルシステムの上記5つの機能について説明します。
ファイルアクセスメカニズム
ファイルアクセスメカニズムはファイルを利用してデータにアクセスする方法のことです。
ファイルアクセスメカニズムには以下の3つが存在します。
- シーケンシャルアクセス
- ランダムアクセス(ダイレクトアクセス)
- インデックスシーケンシャルアクセス
なお、ファイルアクセスメカニズムで利用する情報は i-node から取得します。
シーケンシャルアクセス
シーケンシャルアクセスとは、指定したアドレスから連続でブロックにアクセスする方法です。

例えば、mai というファイルは 19 番ブロックから 6 ブロック(19, 20, 21, 22, 23, 24)にアクセスすれば良いことがわかります。
- ○: ストレージのアクセス速度が速い(1度ブロックを探すと順番に読み込むだけ)
- ✗: ストレージでフラグメンテーションが発生します。
ランダムアクセス (ダイレクトアクセス)
ランダムアクセスとは、指定したアドレスのブロックに直接アクセスする方法です。
各ブロックには次に読み込むブロックの情報があり、ブロックが隣接している必要がありません。

jeep というファイルは 9番ブロックから読み込みを開始し、9番ブロックには次に16番ブロックを読み込むように書かれていて・・・・最後に25番ブロックを読み込むまでこれを続けます。
- ○: ストレージのフラグメンテーションの影響を受けない
- ✗: 読み込み速度が遅い(アクセスするブロックのアドレスを毎回探す必要がある)
インデックスシーケンシャルアクセス
インデックスシーケンシャルアクセスとは、Index ブロックと呼ばれるブロックを利用する方法です。
Index ブロックには、ファイルを構成する全てのブロックのアドレスを順番に格納しています。

jeep というファイルの index ブロックは 19 番です。
index ブロックには次に読み込むべきブロック(1, 9, 10, 16, 25)が記載されています。
- ○: ストレージのフラグメンテーションの影響を受けない
- ○: ランダムアクセスより速い
- ✗: index ブロック用に無駄にスペースを食う
パーミッション
パーミッションとは、ファイルに設定する「ユーザー」・「ユーザーグループ」ごとのアクセス権限のことです。
Linux は複数のユーザーが同時に操作することを想定されているため、ユーザーごとにファイルのアクセス権限を設定できます。
パーミッションについては、以下の記事にまとめています。
シンボリックリンク
シンボリックリンクとは、ファイルやディレクトリを指し示す別のファイルのことです。
Windows でいうショートカットのことです。
シンボリックリンクは ln -s <リンク元> <リンク先> で作成できます。
symbolic_test
スナップショット
スナップショットは任意の時点でのデータを保存することです。
スナップショットは取得時点ではデータブロックへのポインタを取得するだけなので、バックアップと比較して非常に短い時間で済みます。
スナップショットの種類には以下の2つが存在します。
- Copy on Write (CoW)
- Redirect on Write (RoW)
スナップショットでは、コピー時にデータブロックのポインタを取得するだけでデータブロックはコピーしません。
Copy on Write (CoW) スナップショット
データブロックを更新する際に、元のデータを「スナップショット予約済みスペース」にコピーする方法です。

https://technoscooop.wordpress.com/tag/copy-on-write/
スナップショット予約済みスペースには、元の B と D のデータブロックが保存されます。
ちなみに Windows では VSS(ボリュームシャドウコピー)と呼ばれてます。

Redirect on Write (RoW) スナップショット
データブロックを更新する際に、更新後のブロックを「スナップショット予約済みスペース」に書き込み、オリジナルのポインタをリダイレクトします。(元のデータは更新しません。)

https://technoscooop.wordpress.com/tag/copy-on-write/
スナップショット予約済みスペースには、更新分の「B(削除), D+, E, F」が記録されます。
バックアップとスナップショットの違い
バックアップはデータブロックをコピーします。

スナップショットはデータブロックのポインタを取得するだけです。
その後データブロックが更新される度に、差分・増分のデータブロックを別途保存します。

そのため、バックアップとスナップショットの以下のような違いがあります。
- スナップショットのほうが取得が速い
- スナップショットのほうが容量が少ない
- バックアップはオリジナルのデータが消えても問題ない
- スナップショットは初回時に全体をバックアップする必要がある
ジャーナリング
ジャーナリングとは、ファイルの更新中に電源断等が発生しても、元のファイルに復元可能な仕組みです。
ジャーナリングが無い時
データブロックを更新した後に電源断が発生すると、データブロックやメタデータ(スーパーブロック・i-node テーブル)で不整合が発生する可能性があります。
mv コマンドで /hoge/bar ファイルを /bar に移動させる例を見てみます。


「②/bar のリンクを追加」の状態で電源断が発生すると、inode にある /hoge/bar のハードリンクが削除されないまま処理が終了してしまいます。
ジャーナリングがある時
ジャーナリングを利用すると以下の手順でファイルを更新します。




以上の手順で1〜4のどの段階で電源断が発生してもファイルを元の状態に復元することが可能です。
「メインメモリ上のメタデータを更新」で電源断
メインメモリのデータが消えるだけです。
ストレージのデータに影響は無いため、最初からもう1度やり直します。

「メタデータの更新をストレージ上のジャーナルログに書き出す」で電源断

ジャーナルログの書き込み完了記録フラグが立ってない場合は、ジャーナルログを廃棄して最初からやり直します。
ストレージの実際のファイル(データブロック・スーパーブロック・i-node)は更新していないので問題ありません。
「実際にファイル(データブロック・スーパーブロック・i-node)を更新」で電源断


ジャーナルログにある処理がコミットされていない場合は、ジャーナルログを用いてをロールバックします。これにより、ファイルが復元されます。
その後、ジャーナルログを最初から実行します。
「ジャーナルログを破棄」で電源断

ジャーナルログにある処理がコミットされている場合はジャーナルログの廃棄を再開します。
Linux カーネルの関連記事
Linux カーネル「ファイルシステムの機能」に関する説明は以上となります。
Linux カーネル入門記事の続きは、以下をご覧ください。
- 【Linux カーネル: OS 入門1】OS、カーネルとは
- 【Linux カーネル: OS 入門2】CPU、プロセス管理
- 【Linux カーネル: OS 入門3】メモリ管理
- 【Linux カーネル: OS 入門4】ストレージ管理、ファイル
- 【Linux カーネル: OS 入門5】ファイルシステムの機能 ←イマココ
- 【Linux カーネル: OS 入門6】RAID
- 【Linux カーネル: OS 入門7】I/O デバイス管理
- 【Linux カーネル: OS 入門8】IPC (プロセス間通信)