4-1. マウントとrootfs
ここからはrootfs (ルートファイルシステム) に関する処理を実装していきます。
実装に入る前に、1章でも少し触れたマウントとrootfsについて、もう少し深掘りしてみましょう。
マウント
マウントは、何らかのファイルシステムを特定のディレクトリに紐付ける操作です。
ここで、ファイルシステムについておさらいしておきましょう。
ファイルシステムは、コンピューターがストレージにどのようにデータを読み書きするかを定義する仕組みです。
私たちが普段使っているディレクトリ・ファイルの構造をストレージに書き込み・読み込みする際、どう変換されるかを決めています。
代表的なファイルシステムの規格をいくつか紹介します。
- ext4: Linuxでよく使われるファイルシステム
- FAT32: USBメモリやSDカードでよく使われるファイルシステム
- NTFS: Windowsの標準ファイルシステム
ファイルシステムを持つ「何か」は、マウント操作を用いて特定のディレクトリに紐付けることで、実際に私たちがOSの中でファイル・ディレクトリとして操作できるようになります。
「ファイルシステムを持つ『何か』」は多くの場合HDDやSSDなどのストレージデバイスやネットワーク越しの共有ディレクトリ (NASなど) です。
rootfsと/ (ルートディレクトリ)
LinuxなどのUNIX系OSにおいて、OS全体のディレクトリ構造の土台となるのがrootfs。
rootfsは、/ (ルートディレクトリ) の中身が全て入ったファイルシステムです。
ここで注意したいのが、rootfsとルートディレクトリは別物だということ。
rootfs (ルートファイルシステム) と呼ばれるファイルシステムを、/ (ルートディレクトリ) にマウントすることで、みなさんは/以下のディレクトリ・ファイルを使えるようになるのです。

また、これらとは別に見かけ上のルートディレクトリという概念があります。
見かけ上のルートディレクトリとは、あるプロセスがルートだと認識するディレクトリのことです。
基本/に設定されていますが、見かけ上のルートディレクトリは任意のディレクトリに変更できます (4-2)。
rootfs、 / (ルートディレクトリ)、見かけ上のルートディレクトリという3つの要素が揃って、私たちは初めて普段使っているファイル群にアクセスできるようになるのです。
特殊なファイルシステム
先ほど紹介した通り、多くの場合マウントされるファイルシステムはストレージデバイスやネットワーク越しの共有ディレクトリですが、Linuxでは他にも特殊なファイルシステムをマウントすることができます。
バインドマウント
特定のディレクトリをファイルシステムとして扱い、別のディレクトリに紐付けるマウントです。
コンテナで、ホストマシンのディレクトリ・ファイルをコンテナ内でも扱いたいとき「バインドマウント」をしますが、これがまさにその例です。
挙動としてはシンボリックリンクに近いですが、実体は全く異なり、ファイルシステム操作の自由度を格段に上げてくれる、非常に便利なマウントタイプです。
この後の実装でも、バインドマウントを多用します。
オーバーレイマウント (OverlayFS)
複数のファイルシステムを重ねて、1つのファイルシステムとして扱うマウントです。
詳しいことはここでは取り扱いませんが、Production Readyなコンテナランタイムにて使われています。
procfs
カーネル内の情報をファイルとして読み書きできるようにした、仮想的なファイルシステムです。
procfsは主にプロセスの情報を扱います。
Linuxでは必ず/procにマウントされています。「仮想的」なので、procfsの (/proc以下の) ファイルはストレージ上には存在せず、RAM上に実体があります。
カーネルが動的に書き込むプロセスの状態をリアルタイムに読めるほか、procfsのファイルに書き込むことでプロセスの設定を書き換えることも可能です。
sysfs
procfsと同様、カーネル内の情報をファイルとして読み書きできるようにした、仮想的なファイルシステムです。
sysfsは主にカーネルデバイス・ドライバ等の情報を扱います。
Linuxでは必ず/sysにマウントされています。これもストレージ上には存在せず、RAM上に実体があります。
devtmpfsなど、他の特殊なファイルシステムもありますが、ここでは割愛します。
興味がある方は、ぜひ更に深ぼってみてください!