このブログ記事では、LinuxにおけるVFSやFHSを紹介します。

ファイルシステム
ファイルシステムはOSの中で最も重要な機能の1つであり、ファイルがどのように整理・アクセスされるかを決定します。 ファイルシステムがなければ、常に手動でメモリバッファやストレージのスペースを割り当て、 ファイルの読み書きのためにポインタをデリファレンスする必要があります。 Unix系のファイルシステムはインデックスノード(inode)に格納されたメタデータ(名前、サイズ、アクセス権など)にもアクセスできるため、 ファイルを効率的に整理、検索、アクセスすることが可能です(多くの場合B(+)ツリーが使われます! 詳細はC++プログラマへの道 - B(+)木をご覧ください)。
マウントもファイルシステムの重要な役割で、外部デバイスのファイルを特定のディレクトリ(マウントポイント)に表示し、 デバイスからアクセス可能にします。さまざまなファイルシステムが開発されており、ext4やXFS、HFSなどが挙げられますが、近年の一部のファイルシステムは、 ファイルの変更履歴をジャーナルに記録し、非常時にファイルの復旧を可能にしています。
Linuxは多様なファイルシステムをサポートするため、バーチャルファイルシステム(Virtual File System, VFS) を提供しています。 VFSはユーザースペースの共有インターフェースとして動作し、異なるファイルシステムでのファイル操作を可能にします。 また、すべてのデバイス上のファイルがルートディレクトリ下の階層にあるように見せかけます。 ほぼすべてのLinuxディストリビューション(Ubuntuを含む)は、ファイルを特定の場所に配置するルールに従っており、 これをファイルシステム階層標準 (Filesystem Hierarchy Standard, FHS) と呼びます。
ファイルシステム階層標準
FHSは、異なるUnix系OS間での移行時に、重要なファイルの場所を学び直す手間を省くための強力な標準です。 Linuxユーザーとしては、FHSを理解し、各ディレクトリやファイルを適切に使用することが求められます。 以下は、FHSの階層と各ディレクトリの目的を要約した表です。
ディレクトリ | 用途 |
---|---|
/ | 階層の最上部に位置するルートディレクトリ。 |
/bin | cat 、ls 、cp などの重要なコマンド(バイナリ)を格納するディレクトリ。 |
/boot | ブートローダーに関連するファイルを格納するディレクトリ。 |
/dev | デバイスをファイルとして格納するディレクトリ。ファイルを/dev/null に移動することで破棄できます。 |
/etc | 最初は「etcetera」の略でしたが、後に「editable text configuration(編集可能なテキスト設定)」などと再定義され、システム全体の設定ファイルが格納されています。 |
/home | ユーザーのホームディレクトリ(ルートを除く)を格納するディレクトリ。ユーザーは通常、自分のホームディレクトリ内で作業します(環境変数には.bash_profile 、エイリアスなどには.bashrc を使用)。 |
/lib | /bin に格納された重要なコマンドに必要なライブラリを格納するディレクトリ。 |
/media | USBなどのメディアのマウントポイントとして機能します。 |
/mnt | ファイルシステムの一時的なマウントポイントとして使用されます。 |
/opt | オプションの追加されたソフトウェアパッケージを格納するディレクトリ。 |
/proc | プロセスやカーネル情報を表示するためにVFSによって作成されたファイルを格納するディレクトリ。 |
/root | ルートユーザーのホームディレクトリ。 |
/run | 直近のブート以降の実行中のシステムに関するファイル(ログインユーザーや実行中のデーモンなど)を格納するディレクトリ。 |
/sbin | 重要なシステムバイナリを格納するディレクトリで、通常はrootのみが実行可能。 |
/srv | データ、スクリプト、ウェブサーバー、バージョン管理のリポジトリなど、サイト固有のデータを格納するディレクトリ。 |
/sys | デバイス、ドライバ、カーネル機能に関するファイルを格納するディレクトリ。監視が主な用途で、アクセスは/dev を使用。 |
/tmp | 一時ファイルを格納するディレクトリで、再起動後には消去されることが多い。 |
/usr | 読み取り専用のユーザーデータ(ユーザーがインストールしたソフトウェアやユーティリティ)を格納するディレクトリ。サブディレクトリには、すべてのユーザーが利用する非必須バイナリが含まれる/usr/bin や、それらのバイナリ用ライブラリの/usr/lib 、ホスト固有のバイナリやデータを格納する/usr/local などがあります。 |
/var | システム運用中に継続的に変更されるファイル(ログ、アプリケーションキャッシュなど)を格納するディレクトリ。 |
FHSの一部には解釈の余地があり、例えば/opt
と/usr/local
の違いについてはさまざまな解釈が存在します
(筆者の解釈では、/opt
はサードパーティ製ソフトウェア用、/usr/local
は自作ソフトウェア用です)。
FHSに必ず従う必要はありませんが、無視すると権限の問題などに繋がることもあります。
OSに不慣れで、上記の表にある用語に馴染みがなくても、後に重要な概念をカバーした後にこの記事に戻って確認できます。 今のところは、LinuxにはVFSがあり、すべてがファイルのように扱われ、FHSによって上のような特定の方法で整理されていることだけ覚えておきましょう。
結論
この記事では、ファイルシステムの概念、LinuxがVFSを使用して複数のファイルシステムをサポートすることや、 Unix系OSがFHSを使用してディレクトリやファイルをどのように整理するかについて説明しました。 コマンドの練習やディレクトリが何のためにあるかの理解を深めてみることを兼ねて、 前の記事で学んだコマンドを使ってこれらのディレクトリを探索してみることをお勧めします。
リソース
- Linux Journey. n.d. The Filesystem. Linux Journey.
- Kamimori, K. 2018. Linuxのファイルシステムについて. Qiita.