ファイルシステム

記憶装置をファイルとして使えるようにする仕組み

ファイルシステムとは、HDDやSSDなどの記憶装置に保存されたデータを、ファイルやディレクトリとして扱えるようにする仕組みです。単にファイルを並べるための分類方法ではなく、データの保存位置、名前、階層構造、容量、所有者、アクセス権限、更新日時、空き領域などを一体的に管理しています。

私たちは普段、記憶装置の中に文章ファイルや画像ファイルが、そのまま一つの物体として収まっているように考えます。しかし、物理的な記憶装置の内部に、紙の書類や写真のような形でファイルが存在しているわけではありません。

0と1の並びに構造を与える

HDDでは磁気の状態、SSDでは電荷の状態としてデータが記録されています。コンピューターは、それらの物理的な状態を0と1の並びとして抽象化して扱います。

ファイルシステムは、そのデータの並びに一定の規則を与えます。どの部分が管理情報で、どの部分がファイルの内容であり、どの領域が現在空いているのかを区別し、それぞれを関連づけて管理します。

そのため、「0と1の並びがファイルシステムによって成形される」という理解は、直感的にはかなり近いものです。技術的には、ファイルシステムが記憶領域を構造化し、それぞれの領域に役割を与えて管理している、と表現する方が正確です。

記憶装置上の物理状態
↓
0と1のデータとして扱う
↓
ファイルシステムが構造化する
↓
ファイルやディレクトリとして参照できる

ファイルとファイルシステムの違い

ファイルとファイルシステムは、管理される対象と、それを管理する仕組みという関係にあります。

たとえば、report.txtは一つのファイルです。その中には文章のデータが保存されています。一方、ファイルシステムは、そのファイルの名前がreport.txtであることや、記憶装置上のどこに内容が保存されているか、どれだけの大きさがあるか、誰が読み書きできるかといった情報を管理しています。

つまり、ファイルは一つのデータのまとまりであり、ファイルシステムは、多数のファイルやディレクトリを保存し、整理し、探し出すための仕組みです。

ファイルの場所と内容は別々に解釈される

ここで重要なのは、ファイルシステムがファイルの内容そのものまで理解しているわけではないという点です。

たとえばJPEG画像を開く場合、ファイルシステムは、そのJPEGファイルが記憶装置のどこに保存されているかを特定し、データを読み出せる状態にします。しかし、そのデータを画像として解析し、画面に表示するのは画像アプリケーションの役割です。

同様に、PDFファイルのページ構造を解釈するのはPDF閲覧ソフトであり、音声ファイルを音として再生するのは音声アプリケーションです。

ファイルシステムは主として、データの名前、場所、長さ、所有者、権限などを管理します。ファイル内部のデータを文章、画像、音声などとして意味づけるのは、各アプリケーションです。

ファイルシステム
= ファイルの名前や保存位置を管理する

アプリケーション
= ファイルの内容を解釈する

ディレクトリがファイルを整理する

ディレクトリも、ファイルシステムの中で重要な役割を持っています。ディレクトリとは、ファイルや別のディレクトリを階層的に整理するための構造です。日常的には「フォルダ」と呼ばれることも多く、技術的な文脈では「ディレクトリ」という言葉が使われます。

/home/user/
├─ report.txt
├─ photo.jpg
└─ documents/
   └─ memo.md

このような階層構造が、記憶装置の内部に見た目どおりの木の形で置かれているわけではありません。実際には、ファイル名と管理情報との対応関係がデータとして保存されています。OSがその情報を読み取り、人間やアプリケーションにとって扱いやすいディレクトリツリーとして見せています。

UNIX系のファイルシステムでは、ディレクトリも特殊な種類のファイルとして扱われます。通常のファイルが文章や画像などの内容を持つのに対し、ディレクトリは主として、名前と管理対象との対応関係を保持します。

inodeがファイルの管理情報を持つ

たとえば、report.txtという名前から実際のデータへたどり着く際には、まずディレクトリに記録された対応情報が参照されます。その後、ファイルの所有者、権限、サイズ、保存位置などを持つ管理情報が読み取られ、最終的に記憶装置上のデータへ到達します。

Linuxで広く使われるext4などでは、この管理情報を保持する仕組みとしてinodeがあります。inodeには、ファイルの種類、所有者、アクセス権限、ファイルサイズ、更新日時、データの保存位置などが記録されています。

通常、ファイル名はinodeそのものではなく、ディレクトリ側に記録されています。

ファイル名
↓
ディレクトリからinodeを特定する
↓
inodeから保存位置や権限を確認する
↓
実際のデータを読み出す

ファイルシステムには物理的な実体がある

このことから分かるように、ファイルシステムには実体があります。ただし、一つの独立した物体として存在するのではありません。

記憶装置上に書き込まれた管理情報、ディレクトリ情報、空き領域の情報、ファイルの内容などが組み合わさり、全体としてファイルシステムを構成しています。

一方、画面上に表示されるファイルやフォルダの階層は、OSがそれらの情報を解釈して作り出した論理的な構造です。

したがって、ファイルシステムには、物理的な側面と論理的な側面があります。物理的には、HDDやSSD上に管理情報やデータ構造が記録されています。論理的には、それをOSがファイルやディレクトリの階層として提示しています。

ファイルを開くときに起きていること

ファイルを開くときには、OSがファイルシステムの管理情報を参照します。

アプリケーションがファイルのパスを指定すると、OSはディレクトリを順にたどり、対象のファイルを特定します。その後、ファイルの保存位置やアクセス権限を確認し、必要なデータをHDDやSSDからメモリへ読み込みます。アプリケーションは、OSから渡されたデータを、文章や画像などとして解釈します。

アプリケーションがパスを指定する
↓
OSがディレクトリをたどる
↓
ファイルの管理情報を確認する
↓
記憶装置上の保存位置を特定する
↓
データをメモリへ読み込む
↓
アプリケーションが内容を解釈する

この意味では、ファイルを呼び出すたびに、OSがファイルシステムの規則に従って対象を解釈していると言えます。

キャッシュによって読み出しを高速化する

ファイルを開くたびに、すべての情報をHDDやSSDから読み直しているわけではありません。一度読み込んだディレクトリ情報やファイルの内容は、OSによってメモリ上にキャッシュされることがあります。

必要な情報がキャッシュに残っていれば、記憶装置へ再度アクセスせず、メモリ上の情報が利用されます。

そのため、より正確には、ファイルを開くたびにファイルシステムの管理構造が参照されますが、その参照先がHDDやSSDである場合もあれば、メモリ上のキャッシュである場合もあります。

マウントによってファイルシステムを接続する

ファイルシステムを実際に利用するためには、マウントという操作も重要です。

マウントとは、HDD、SSD、USBメモリなどに記録されたファイルシステムを、現在のディレクトリツリーの特定位置から参照できるようにする操作です。

たとえばLinuxでUSBメモリを/mnt/usbへマウントすると、そのUSBメモリの内容を/mnt/usbというディレクトリから参照できるようになります。

sudo mount /dev/sdb1 /mnt/usb

この操作によって、USBメモリ内のファイルが/mnt/usbへコピーされるわけではありません。USBメモリにある別のファイルシステムを、現在使用しているディレクトリツリーの一地点へ接続しています。

USBメモリ内のファイルシステム
↓
/mnt/usbへ接続する
↓
/mnt/usbから内容を参照する

ディスクイメージファイルをマウントする

通常、ファイルシステムはディレクトリへマウントします。ただし、「ファイルをマウントする」という表現が使われる場合もあります。

代表的なのが、ディスクイメージファイルです。ディスクイメージとは、ディスクやファイルシステムの内容を一つのファイルとして保存したものです。disk.imgやISOファイルなどが該当します。

ディスクイメージファイルの内部にファイルシステムが格納されている場合、OSはそのファイルを仮想的な記憶装置として扱い、内部のファイルシステムをディレクトリへマウントできます。

sudo mount -o loop disk.img /mnt/image

この場合、マウント元はdisk.imgというファイルですが、実際に利用しているのは、そのファイル内部に格納されたファイルシステムです。

disk.imgというファイル
↓
仮想的な記憶装置として扱う
↓
内部のファイルシステムを解釈する
↓
/mnt/imageへ接続する

通常ファイルをバインドマウントする

Linuxには、バインドマウントという機能もあります。これは、既存のファイルやディレクトリを、別のパスからも参照できるようにする仕組みです。

たとえば、一つの設定ファイルを別のファイル位置へバインドマウントすると、二つのパスから同じ実体を参照できます。この場合、新しいファイルが複製されるのではなく、同じ対象への別の入口が作られます。

したがって、「ファイルを直接マウントできるか」という問いには、二つの異なる意味があります。

一つは、ディスクイメージファイルの内部にあるファイルシステムをマウントする場合です。もう一つは、通常のファイルを別のファイルパスへバインドマウントする場合です。

記憶装置からアプリケーションまでの役割分担

ファイルシステムを理解する際には、記憶装置、ファイルシステム、ファイル形式、アプリケーションを分けて考えることが重要です。

記憶装置は、データを物理的に保持します。ファイルシステムは、その記憶領域を構造化し、ファイルやディレクトリとして管理します。ファイル形式は、個々のファイル内部のデータの並び方を定めます。そしてアプリケーションは、その形式に従ってデータを解釈し、文章、画像、音声などとして利用者に提示します。

HDD・SSD
↓
データを物理的に保存する

ファイルシステム
↓
データをファイルやディレクトリとして管理する

ファイル形式
↓
ファイル内部のデータ構造を定める

アプリケーション
↓
内容を文章・画像・音声として解釈する

まとめ

ファイルシステムとは、単にファイルを入れる箱ではありません。物理的な記憶領域と、人間が扱うファイルやディレクトリとの間に入り、0と1のデータへ構造と名前を与える仕組みです。

私たちが普段目にしているファイルやフォルダは、記憶装置上にそのままの姿で存在しているものではありません。ファイルシステムが記憶領域を管理し、OSがその情報を解釈することで、初めて一つのファイルや階層的なディレクトリとして利用できるようになります。

Contents