【初心者向け】ファイルシステムのアーキテクチャ【５分で読める】

# ファイルシステムのアーキテクチャ

理解のために小咄形式でまとめました。

:::note info
システムパフォーマンス関連記事の目次
- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)
:::

**登場人物**
- **太郎（後輩）**：入社1年目の若手エンジニア。
- **花子（先輩）**：システムエンジニア歴3年の先輩。

**場面：オフィスの会議室**
*太郎が `ファイルシステムのアーキテクチャ` に関する資料を見ながら、花子に質問する。*

**太郎**：「花子先輩、`ファイルシステムのアーキテクチャ` について調べてるんですが、 `どの部分がどんな役割をしているのか` が整理しきれません。」

**花子**：「なるほど。 `ファイルシステムのアーキテクチャ` は、 `I/O スタック` や `キャッシュ` などの `複数のレイヤー` で構成されているわ。それぞれの役割を `6 つの要素` に分けて説明するわね。」

---

### **ファイルシステムのアーキテクチャ**
**花子**：「`ファイルシステムのアーキテクチャ` は、大きく `6 つのコンポーネント` で構成されるの。」

1. **ファイルシステム I/O スタック**
2. **VFS（Virtual File System）**
3. **ファイルシステムキャッシュ**
4. **ファイルシステムのパフォーマンスに関わるその他の機能**
5. **ファイルシステムタイプ**
6. **ボリュームとプール**

---

#### **1. ファイルシステム I/O スタック**
**花子**：「`ファイルシステム I/O スタック` とは、 `アプリケーションがファイルを操作するときに通る処理の流れ` のことよ。」

- **アプリケーション** → `ファイルを開いたり、データを読み書きする`
- **カーネル（システムコール層）** → `アプリケーションからの I/O リクエストを受け取る`
- **VFS（仮想ファイルシステム）** → `どのファイルシステムを使っているかに関わらず、共通の操作を提供`
- **ファイルシステム** → `ext4, XFS, ZFS などの実際のファイルシステムが処理`
- **ブロックデバイス** → `ディスクデバイスに I/O を転送し、実際にデータを読み書き`

「これは `工場の生産ライン` みたいなもので、 `注文（I/O リクエスト）` が `原料（データ）` を `完成品（ファイルの読み書き）` に変えるまでのプロセスね。」

**太郎**：「なるほど！ `I/O がどのレイヤーで処理されるのかを理解すれば、どこで遅延が発生しているのかが分かりやすくなりますね！」」

---

#### **2. VFS（Virtual File System）**
**花子**：「`VFS（仮想ファイルシステム）` は、 `異なるファイルシステム間の共通インターフェース` を提供するの。」

- **OS にとっての抽象化レイヤー** であり、 `ext4, XFS, NFS` などを統一的に扱える。
- **アプリケーションは VFS を通じて操作し、特定のファイルシステムに依存しない。**
- **Linux の VFS は `i ノード` や `スーパーブロック` などの概念を利用する。**

「これは `翻訳機` みたいなもので、 `アプリケーションの指示を各ファイルシステムに合わせて変換している` のよ。」

**太郎**：「つまり、 `VFS があるおかげで、異なるファイルシステムでも統一的にファイル操作ができる` ってことですね！」

---

#### **3. ファイルシステムキャッシュ**
**花子**：「`ファイルシステムキャッシュ` は、 `I/O のパフォーマンス向上` に欠かせない仕組みよ。」

- **ページキャッシュ** → `よく使うデータをメモリに保持し、ディスクアクセスを減らす。`
- **ディレクトリキャッシュ** → `ディレクトリ情報をキャッシュし、ファイル検索を高速化。`
- **バッファキャッシュ** → `書き込みデータを一時的に保持し、後でまとめてディスクに書き込む。`

「たとえば `ノートの付箋` みたいなもので、 `頻繁に使う情報をメモに残しておけば、いちいち本を開かなくても済む` のと同じね。」

**太郎**：「確かに！ `キャッシュを有効活用すれば、ディスクへのアクセスを減らして I/O を高速化できる` んですね！」

---

#### **4. ファイルシステムのパフォーマンスに関わるその他の機能**
**花子**：「`ファイルシステムのパフォーマンス` には、 `さまざまな機能` が影響を与えるわ。」

- **ジャーナリング** → `障害時のデータ保護（ext4, XFS）`
- **スナップショット** → `過去の状態を保存（ZFS, Btrfs）`
- **データ圧縮** → `ディスク使用量の削減（ZFS, Btrfs）`
- **データ重複排除** → `同じデータを一度だけ保存（ZFS, Btrfs）`

「これは `データ管理の工夫` みたいなもので、 `バックアップやデータ整理を自動でやってくれる機能` よ。」

---

#### **5. ファイルシステムタイプ**
**花子**：「`ファイルシステムには、さまざまな種類` があるわ。」

- **ext4** → `Linux で一般的に使われる標準的なファイルシステム。`
- **XFS** → `大規模なファイルに強い。高スループット。`
- **ZFS** → `データ整合性、スナップショット、圧縮などの高度な機能を持つ。`
- **Btrfs** → `ZFS に似た機能を持つが、Linux カーネルに統合されている。`
- **FAT32** → `互換性が高く、Windows・macOS・Linux で利用可能。4GB以上のファイルを扱えない。`
- **exFAT** → `FAT32 の制限を克服したファイルシステム。4GB以上のファイルに対応し、Windows・macOS・Linux で使える。`
- **NTFS** → `Windows の標準ファイルシステム。大容量ファイルやアクセス制御をサポートし、ジャーナリング機能も備える。`
- **APFS** → `macOS・iOS向けの最新ファイルシステム。高速でスナップショットや暗号化をサポート。`

「これは `収納ボックスの種類` みたいなもので、 `用途に応じて適したものを選ぶ必要がある` のよ。」

---

#### **6. ボリュームとプール**
**花子**：「`ボリュームとプール` は、 `ファイルシステムを格納するストレージの管理単位` ね。」

- **ボリューム** → `ストレージの一部を切り出した単位（パーティション、LVM など）`
- **プール** → `複数のストレージをまとめた管理単位（ZFS, Btrfs）`

「これは `貯水タンク` みたいなもので、 `一つの大きなタンクから水（データ）を取り出せる` のよ。」

---

### **まとめ**
**花子**：「ファイルシステムの `アーキテクチャ` を理解すると、 `どの層で問題が発生しているのか` を分析しやすくなるわ。」

**太郎**：「ありがとうございます！ `VFS の影響を調べるために、strace コマンドでシステムコールの流れを見てみます！」

# 参考リンク

システムパフォーマンス関連記事の目次

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)