本記事は、書籍『Linuxの仕組み』を読んで学んだことをアウトプットするために作成しました。Linuxのファイルシステムについて、基本的なファイル作成の流れから、データの不整合を防ぐ機能、そして高度な仮想ファイルシステムまで、要点を絞って解説します。
記事全体は、5分程度で読むことが可能です。
ファイルの仕組みについて
Linuxを触ったことがある方なら、一番上の階層を「ルートディレクトリ(/)」と呼ぶことはご存知でしょう。ルートディレクトリはシステムの初期セットアップで作成されるため、通常は深く意識する必要はありません。
それよりも、私たちが日常的に行う touch や vi などでファイルを作成した際、システム内部でどのような動きをしているかを知る方が重要です。
Linuxでは、ファイル作成は POSIX (Portable Operating System Interface) という規格に準拠した システムコール によって行われます。具体的には、カーネルが提供する creat() や open() といったシステムコールが実行され、ファイルシステム上に実体が作成されます。
プログラミング言語(Python, Go, C#など)でも、ファイルを操作するメソッドは最終的にこれらのシステムコールを呼び出しています。
ちょっと寄り道:ファイルの容量制限(クォータ) 用途ごとに使用できるファイルシステムの容量を制限する機能のことを「クォータ」と呼びます。マルチユーザー環境などで特定のユーザーがディスクを使い潰すのを防ぐために使われます。
■一般的なファイルシステムについて
ext4: 歴史が長く、最も標準的なファイルシステム。
XFS: 大容量ファイルや多数のファイルの扱いに優れる。RHELなどで標準採用。
Btrfs: 後述するコピーオンライトやスナップショットなど、高度な機能を持つ。
※上記が一般的で、それぞれの違いは、最大ファイルサイズ、最大ファイル数、そして
サポートする機能などにあります。詳細が気になる方は、上記の単語で理解を深めてみてください!
ファイルシステムの不整合を防ぐ機能について
ジャーナリング (ext4, XFS)
ジャーナリングは、アトミック(不可分)な処理を保証するための機能です。 実際のファイル書き込みを行う前に、「ジャーナル領域」と呼ばれる特別な場所に、これから行う処理の内容を記録します。
- ジャーナルへの書き込み: 処理内容(メタデータ)を記録。
- 実データの書き込み: ファイル本体を書き込む。
- ジャーナルの完了: 処理が正常に終わったことをマークする。
もしジャーナルへの書き込み中に電源が落ちた場合、カーネルは「不完全な処理」として、マウント時にその記録を破棄し、なかったことにします(実データは書き込まれていない)。 逆に、ジャーナルへの書き込みが終わり、実データの書き込み中に電源が落ちた場合は、ジャーナルの記録を基に実データの書き込みを再完了させ、完全な状態へ持っていこうとします。
コピーオンライト (Btrfsなど)
ext4やXFSは、既存のデータが存在する領域を直接更新(上書き)します。 これに対し、コピーオンライト (Copy-on-Write / CoW) 方式では、データを更新する際に元のデータを上書きせず、別の空いている領域に新しいデータを書き込みます。
最後に「新しいデータへのポインタ」を更新して処理を完了するため、書き込み中に電源が落ちても元のデータは完全に残っており、ファイルシステムが壊れることはまずありません。
fsckについて
ファイルシステムの検査・修復を行う fsck(file system check)ですが、これはジャーナリングやCoWで防ぎきれなかった致命的な不整合を、手動(または起動時の自動処理)で修復するツールです。「完全削除動作」が働くというよりは、破損した箇所を特定し、整合性を保つために孤立したデータを lost+found ディレクトリへ移動したり、最悪の場合は破損したinodeを削除したりします。この辺りの詳しい挙動は、私自身の今後の課題とします。
Btrfsによる高度なバックアップ機能について
スナップショット
コピー処理とは違い、ある時点のファイルシステムの「状態」を記録します。実データのコピーを行わないため、作成は一瞬で、領域もほとんど消費しません。 ただし、参照元のデータが完全に壊れた場合、スナップショットも破損するため、これは同一ストレージ内の「一時的なバックアップ」にはなりますが、ハードウェア故障に対する「完全なバックアップ」ではありません。
マルチボリューム (LVMとの連携)
通常は一つのパーティションに対して一つのファイルシステムを作成しますが、マルチボリューム(Btrfs自身が持つ機能やLVM)では、複数の物理ディスクをまとめて一つの大きな論理的なファイルシステムとして扱うことができます。
※LVM(Logical Volume Manager)の詳細は、以下などを参照してみてください。
特殊なファイルシステムについて
Linuxには、ディスク上のデータではなく、メモリやカーネル内部の状態を「ファイル」として扱う特殊なファイルシステムがあります。
■ tmpfs
メモリ上に作成されるファイルシステムです。Kubernetesなどで一時的なボリュームとして使われることもあります。ページ単位でメモリを獲得し、非常に高速ですが、再起動すると内容は消えます。
ネットワークファイルシステム
NFS や CIFS/Samba があり、リモートサーバー上のファイルをローカルにあるかのように操作できます。
procfs
/proc 配下にマウントされます。free や ps といったコマンドは、この下のファイルを読み込んで、現在のメモリ使用量やプロセス情報を取得しています。監視システムなどもここを参照します。
sysfs
/sys 配下にマウントされます。procfsよりも新しく(2.6カーネル以降)、カーネルが認識しているハードウェアデバイスの情報や、ドライバーのパラメータなどが整理されています。
まとめ
最後まで読んでいただきありがとうございました。
今回はやや設計よりの話もあったので、PGなどはあまり気にすることはないかもですが
DevOpsやSREなんて言葉が流行っている今日では、必要になってくる知識かもしれませんので是非何かしら役立ててくれると光栄です。
今回はLinuxの仕組みを読んで実際に覚えたいことや、
気にかけて開発したいと思った個所をブラッシュアップしてみました。
次回は、仮想記憶やコンテナについての記事をあげたいと思います!是非そちらも参照ください。


コメント