Linuxのファイルシステム

ファイルシステム

ファイルシステムとは、記憶装置に保存されたデータを管理し、操作するために必要な機能のことである。OSが提供する機能の一つで、ほとんどのOSはファイルシステムでファイルを管理している。

ファイル

ファイルとは、記憶装置に保存された情報のことである。ソフトウェアやユーザーが作成したデータ、HDDレコーダーに録画したテレビ番組や、DVDに焼かれた映画などもファイルに含まれる。普段、HDDレコーダーにテレビ番組を録画したり、再生したりするとき、気付かないうちにファイルシステムを使っているということになる。

ファイルシステムは、ファイルを操作するためのインターフェイスも提供している。ファイルを階層構造に格納してラベルをつけ、必要なときにファイルを使えるようにする。ファイルシステムがないと、データを正しく保存できなかったり、保存した位置がわからなくなる。

フォーマット(初期化)

ファイルシステムの機能のひとつにフォーマット(初期化)がある。フォーマット(論理フォーマット)とは、使用しているOSのファイルシステムに合わせて記憶領域を区切り、番号を設定することであり、データを消すことではない。フォーマットすることでその記憶装置が認識され、使用できるようになる。

クラスタ

フォーマットで作成する区切りをクラスタと呼ぶ。クラスタは、ファイルを保存するための最小単位で、クラスタのサイズが小さいほどディスクを無駄なく使うことができる。

Linuxファイルシステム

Linuxでは複数のファイルシステムが開発されており、 利用者は好きなファイルシステムを利用することができる。 ファイルシステムはモジュール化して提供されているため、 新しいファイルシステムを利用したい場合は、動的に組み込むことが可能である。

Linuxがサポートしているファイルシステムは /proc/filesystems という 仮想ファイルに一覧化されている。この仮想ファイルはテキストファイルなので、 vi や cat などで内容を確認することができる。

$ cat /etc/filesystems
ext4
ext3
ext2
nodev proc
nodev devpts
iso9660
vfat
hfs
hfsplus


ファイルシステムの構造

ファイルシステム内で領域を割り当てる基本単位を論理ブロックという。ディスクデバイスの連続する物理ブロックから構成される。

i-node

i-nodeはファイルシステムにおけるデータ構造である。1ファイル、ディレクトリごとにi-node tableの1エントリが使用される。i-node内には以下の情報が保存される。

ファイルの種類
オーナ(UID)
グループ(GID)
パーミッション
タイムスタンプ(ファイルに最後にアクセスした時刻/ファイルを最後に変更した時刻/ファイルの属性を最後に変更したした時刻)
ハードリンクカウント
バイト単位のファイルサイズ
ファイルに割り当てたブロック数
ファイルデータを保存したデータブロックへのポインタ

i-nodeでは、i-node内に保持しているデータブロックへのポインタによって、ファイルデータを持つデータブロックを特定する。この構造によってファイルは連続したブロックを保持する必要がなく、ディスクを効率良く使用することができる。同時にi-nodeサイズの固定化、複数のデータブロックにまたがる巨大ファイルサイズのファイルの格納が可能、小さなサイズファイルのファイルに対して低レイテンシでアクセス可能になった。

レイテンシー

レイテンシーとは、データの転送要求などのリクエストを発してから、リクエストの結果が返ってくるまでにかかる遅延時間のことである。例えばメモリやハードディスクなどの記憶装置からデータを読み出す場合には、命令を送ってから記憶装置におけるデータが記録された箇所までアクセスする時間と、記憶装置から読み出されたデータが命令の結果として返ってくるまで、わずかながら遅延時間が生じる。

仮想ファイルシステム

仮想ファイルシステム(Virtual File System)は、実際のファイルシステムの上位に位置する抽象化層である。VFSの目的はクライアントアプリケーションが様々なファイルシステムに同じ方法でアクセスできるようにすることである。例えば VFS を使うと、クライアントアプリケーションはローカルな記憶装置にもネットワーク上の記憶装置にも透過的にアクセスできるため、その違いを意識する必要がない。あるいは、WindowsMac OSUNIXといったオペレーティングシステム (OS) の違いを超えてファイルシステムの違いを意識することなくアクセスすることが可能となる。

VFSは、カーネルと実際のファイルシステムとのインタフェースあるいは規約を定義している。従って、その規約に従うことで簡単に新たなファイルシステムカーネルに追加することができる。規約の条件はリリースの度に非互換な変更を加えられる可能性があり、ファイルシステムは新たなリリースに対応するために修正を施したり、再コンパイルする必要がある。

ジャーナリングシステム

ジャーナリングファイルシステムとは、ファイルシステムの種類の一つで、管理領域を変更する際にジャーナルあるいはログと呼ばれる更新履歴を残すことで管理領域の破損を防ぐ機能を持ったものである。

通常のファイルシステムでは、ファイルを書き込んだり書き換えたりする際、ファイルシステムの管理領域(メタデータ)の内容を変更している最中に不意の電源断などのトラブルが生じると、管理領域の内容に矛盾が生じ、データへの参照が失われたり、復旧に膨大な時間がかかる場合がある。

ジャーナリングファイルシステムではいきなり管理情報(メタデータ)を書き換えるのではなく、一旦これから行う変更をジャーナルと呼ばれる特殊な領域に時系列で保存し、それから管理情報の書き換えを行う。操作中に障害が発生しても、ジャーナルの内容を参照すれば即座に変更の破棄あるいは復旧を行うことができ、管理領域の一貫性を保ちつづけることができる。

データベース管理システム(DBMS)のトランザクション処理などに類似しているが、あくまで管理領域のみを保護する機構であり、ファイルの内容(データ本体)の保全は行わないため、データの喪失を防ぐには他の仕組みを併用する必要がある。ジャーナリング機能を持つファイルシステムとしてはext3ext4、XFS、ZFS、ReiserFS、NTFSなどがよく知られ、高い信頼性が求められるサーバ用途などで利用される。

fsck

fsck(file system checkあるいはfile system consistency check)とはUNIXオペレーティングシステム (OS)でファイルシステムの一貫性を調査するためのツールである。sckは、OSがクラッシュするなどで正常にシャットダウンしなかった後に再起動すると自動的に実行される。 fsckには多くの場合、対話的に対応方法を聞きながら発見した問題を修復する機能も備わっている。

また、fsckは問題があるファイルシステムに対して管理者が手動で実行することもできる。 ただし,ファイルを破壊してしまう危険性もあるため、障害が発生した場合(特に論理障害である場合)は、可能な限りデータのバックアップを実施した上で行うことが重要である。

マウント

Unixでは全てのディスクやネットワーク上の記憶資源は一つのツリー構造の 中に展開される。ツリー構造は / を頂点として、枝分かれしており、 それぞれのディスク上のファイルシステムは全てこのツリー構造の中のどこかの 枝の中に組み込まれるようになっている。逆に、ディスク資源を利用可能に するためには、ツリー構造への組み込み作業が必要であり、これをマウント と言う。マウントすることで、OSがファイルシステムを介してストレージデバイス上のファイルやディレクトリを利用できるようになる。

パーティション

コンピュータのハードディスクのパーティション (Partition) とは、ハードディスクの記憶領域を論理的に分割すること、あるいは分割された個々の領域を指す。パーティションを作成することをパーティショニング (Partitioning) とも言う。パーティショニングは、ひとつのハードディスク上に複数のファイルシステムを持つことを可能にする。

物理ディスクとは別に、ハードウェアにリンクした管理単位を定義し、その管理単位でのアセスを制御することで、とあるパーティションで障害が発生しても、他パーティション及びハードディスク全体に被害が及ばないように、障害の局所化が可能となる。

固有パーティションにおいて、ディスクの空きが枯渇しても、全データ区分に影響が及ばないように局所化する事ができる。ただし、システム使用パーティションの一部においては、そのパーティションの残量が枯渇した場合、システム自体の動作が停止してしまうことがある。

用途によってパーティション分割する場合もある。例えば、ほとんど書き込まれることがないパーティションがあれば、それを読み込みのみを許可する状態で使用する(マウントする)ことも考えられる。小さなファイルを多数格納するファイルシステムは、パーティションとして独立させてiノードを多数にするような設定をすることもできる。


参考:ファイルシステムとは?今さら聞けない基礎知識とOSごとの種類|発注成功のための知識が身に付く【発注ラウンジ】