ファイルシステム
ファイルシステムは、コンピュータのリソースを操作するための、オペレーティングシステム (OS) が持つ機能の一つ。ファイルとは、主に補助記憶装置に格納されたデータを指すが、デバイスやプロセス、カーネル内の情報といったものもファイルとして提供するファイルシステムもある。
より正確に定義すれば、ファイルシステムは抽象データ型の集まりであり、ストレージ、階層構造、データの操作/アクセス/検索のために実装されたものである。ファイルシステムを特殊用途のデータベース管理システム (DBMS) と見なせるかどうかは議論があるが、ファイルシステムとデータベース管理システムには多くの共通点がある。
目次
1 概要
2 分類
2.1 ディスクファイルシステム
2.2 データベースファイルシステム
2.3 トランザクションファイルシステム
2.4 ネットワークファイル共有とファイルシステム
2.5 特殊用途のファイルシステム
3 ファイルシステムとオペレーティングシステム
3.1 平坦なファイルシステム
3.2 UNIXとUnix系システムのファイルシステム
3.2.1 スワップファイルシステム
3.2.2 macOSのファイルシステム
3.3 ベル研究所のPlan 9のファイルシステム
3.4 Windowsのファイルシステム
3.4.1 Windowsのファイルシステムの歴史
3.4.2 NTFSの仕様
3.4.3 ドライブレター
3.4.4 ハイバネーション領域
3.4.5 リカバリー領域
3.5 OpenVMSのファイルシステム
3.6 MVS(IBM汎用コンピュータ)のファイルシステム
4 ファイルシステムと対応するパーティション番号
5 比較
5.1 一般情報
5.2 諸元
5.3 メタデータ
5.4 機能
5.5 アロケーションとレイアウト
6 注
7 関連項目
概要
最も身近なファイルシステムは補助記憶装置上のもので、「セクタ」などと呼ばれる通常512バイトの固定サイズの「ブロック」の配列にアクセスするものである。ファイルシステムはこのセクタ群を使用してファイルやディレクトリを構成し、各セクタがどのファイルに使用され、使用されていないセクターはどれなのかを把握する必要がある。
しかし、ファイルシステム自体は記憶装置を利用する必要はない。ファイルシステムは何らかのデータへの操作とアクセスを提供するものであり、そのデータが記憶装置に格納されているか(例えば、ネットワーク接続経由で)動的に生成させるかは問題ではない。
ファイルシステムがストレージ上にあるかどうかに関わらず、一般的なファイルシステムはファイルのファイル名を束ねるディレクトリを持つ。通常、ファイル名は何らかのファイル・アロケーション・テーブルのインデックスと対応しており、それはMS-DOSのファイルシステムであるFATでも、Unix系ファイルシステムでのinodeでもそのようになっている。ディレクトリ構造は平坦な場合もあるし、ディレクトリの下にサブディレクトリのある階層構造の場合もある。いくつかのファイルシステムではファイル名も構造化されていて、拡張子やバージョン番号の文法が存在する。そうでない場合、ファイル名は単なる文字列であり、ファイル毎のメタデータは適当な場所に格納される。
階層型ファイルシステムはUNIXで有名なデニス・リッチーの初期の研究対象であった。それまでの実装では階層はあまり深くできなかった。例えばIBMの初期に生まれたデータベース管理システムであるIMSなどがそうである。UNIXの成功により、リッチーはその後のOS開発(Plan 9やInferno)でもファイルシステムのコンセプトを様々な対象に広げていった。
初期のファイルシステムはファイルとディレクトリの生成、移動、削除といった機能を提供していた。ディレクトリへの追加リンクを生成する機能(UNIXにおけるハードリンク)、親リンク(Unix系OSにおける「..」)の名称変更、ファイル間の双方向リンクの生成といった機能は当初は存在しなかった。
初期のファイルシステムはファイルの切捨て(内容を一部削除すること)、ファイルとファイルの連結、ファイルの生成、ファイルの移動、ファイルの削除、ファイルの更新などの機能を提供していた。ファイルの先頭へのデータ挿入 (prepend)、ファイルの先頭からの内容切捨て、任意の位置の内容の削除や挿入などといった機能は提供されていなかった。提供された操作は対称性に乏しく、どんな状況でも便利というものではない。例えばUNIXにおけるプロセス間のパイプはファイルシステム上には実装できない。というのもパイプはファイル先頭からの切捨てに対応できないためである。
ファイルシステムの基本操作への安全なアクセスはアクセス制御リストまたはケーパビリティに基づいて行われる。研究によれば、アクセス制御リストは完全なセキュリティを確保するのが困難といわれており、研究中の最新のOSではケーパビリティが使われる傾向にある。商用ファイルシステムはまだアクセス制御リストを使用している(コンピュータセキュリティ参照)。
また、アプリケーションソフトウェアの中にも、独自のファイルシステムを採用しているものがある。(FMRシリーズ・FM TOWNS用のワープロソフトウェアである「FM-OASYS」など)
分類
ファイルシステムはディスクファイルシステム、分散ファイルシステム、特殊用途のファイルシステムに分類できる。
ディスクファイルシステム
「ディスクファイルシステム」は、直接的か間接的かに関わらずコンピュータシステムに接続された補助記憶装置、特にハードディスク上にファイルを格納するためのものである。ディスクファイルシステムとしては、FAT、NTFS、HFS、ext2、ext3、ext4、WAFL、ISO 9660、ODS-5、UDF、HPFS、JFS、UFS、VTOC、XFSなどがある。ディスクファイルシステムの一部はジャーナルファイルシステムまたはバージョニングファイルシステムでもある。
データベースファイルシステム
データベースに基づいたファイルシステムである。メインフレームにあったVSAMのように以前からあるものであり、何ら新しいコンセプトではない。通常のファイルシステムでは、設計の時点でその情報構造が決め打ちで決定されている、ファイルの型、内容、作者などといったメタデータの代わりに、各データベース毎に設定されるメタデータに基づいた管理するが、従来のファイルシステムをその上にマップすることもできる。操作はデータベース操作言語(例えばSQL)で行われる。データベース管理システムが通常のファイルにアクセスしてデータベースを操作するのに比べオーバーヘッドの削減による性能向上などが期待される。BFS、GnomeVFS、HFS+、WinFSなどがある。
トランザクションファイルシステム
ファイル操作により引き起こされる、ディスク上のデータ構造を操作するイベントやトランザクションを、それ用に確保してある領域にまず記録してから行うものである。多くの場合データ構造の操作は相互に関連しているため、「どれも全く行われていない」か「全て成功裏に完了した」のどちらかでなければ、壊れた状態ということになってしまう。例として銀行から銀行へ電子送金する場合を考えてみよう。銀行のコンピュータは、もう一方の銀行へ転送命令を「送信」し、自身の記録として転送開始したことを保持しておく。もし、コンピュータが記録を更新する前に何らかの原因でクラッシュしてしまった場合、転送したという記録が残っていないし、お金だけが失われる。トランザクションシステムは、このような間違いを、事前の記録と照合することにより検出して、切り戻すか再実行し、健全な状態を保とうとするシステムである。各トランザクションは記録され、どこで何をしたのかという完全な記録を残す。この種のファイルシステムはフォールトトレラント設計であることを意図して設計されているため、オーバーヘッドが大きくなる。
ネットワークファイル共有とファイルシステム
ネットワークに対応したOSの多くが、ファイル共有のためのプロトコルを備えている。これを分散ファイルシステムと呼ぶ。
Windowsで標準的なSMB/CIFS、あるいはMacintoshのAFP、UNIXのNFSなどが有名である。
こういったネットワークファイルシステムは、共有元のファイルシステムを抽象化した、別の一種のファイルシステムとして扱われる。
個々のOSが標準とするNTFS、UFS、HFS+、ext3、HPFS、BFSなどの差異も、Sambaなどを使ったファイル共有では実用上の問題はほとんど無くなる。ただし、ファイル名制限自体は存在し、また拡張属性等が利用できないなどの問題はあり得る。
なお、WindowsやmacOSを対象にしたNAS装置でも、内部のハードディスクドライブ (HDD) ではReiserFSやXFSなどが使われている場合が少なくない。
特殊用途のファイルシステム
特殊用途のファイルシステムとは、ディスクファイルシステムでも分散ファイルシステムでもないものを意味する。ソフトウェアが動的にファイルを用意するようなシステムがこれに当たる。用途としてはプロセス間の通信のためだったり、一時的なファイル空間のためだったりする。
特殊用途のファイルシステムはUNIXのようなファイル中心のOSで主に使用されている。例えば一部のUNIX系システムで使用されている procfs(/proc)ファイルシステムは、プロセスや他のOS機能の情報へのアクセスを提供している。
ボイジャー計画などの深宇宙探査機ではデジタルテープに基づいた特殊なファイルシステムが使われた。最近の探査機カッシーニはリアルタイムオペレーティングシステム (RTOS) のファイルシステム(あるいはRTOSに影響されたファイルシステム)を使用している。マーズ・パスファインダーのローバーもそのようなRTOSファイルシステムを使用しているが、これらはフラッシュメモリに実装されている点が重要である。
ファイルシステムとオペレーティングシステム
ほとんどのオペレーティングシステム (OS) はファイルシステムを提供しており、ファイルシステムは最近のOSの重要な部分となっている。初期のマイクロコンピュータのOSではファイル管理がほとんど唯一の仕事であり、「DOS」というその名前にも現われている。初期のOSにはディスクオペレーティングシステムと呼ばれるファイルシステム相当の部分が存在していた。マイクロコンピュータによっては、その部分だけをロードして使用することができた。初期のOSでは、唯一の名前のないファイルシステムがサポートされていた。例えば、CP/Mにも独自のファイルシステムがあるが、改めて名前を付けるほどの機能は持っていない。
一般に、OSはファイルシステムに関する次の2種類のインタフェースを提供する。1種類目はプログラムのためにカーネルが提供するシステムコール群であり、2種類目はユーザによるファイル操作のための、コマンド群やグラフィカルユーザインタフェースによるツール(いわゆるファイルマネージャ等)などである。真に重要なのは前者である。なぜなら後者はOSによって提供される以外のプログラムを使っても何ら問題ないからである。しかし後者だけがインタフェースの全てであるかのように思われていることもまた、多いようである。
組み込み用途向けや、特定用途向けのOSでは、ファイルシステムをサポートしていなかったり、ファイルシステムをサポートしていても、実際の利用時にファイルシステムを使用しないこともある。このようなケースでは、コンピュータは外部記憶装置を持っていないか、持っていてもOSからは単なるデータストリームとして認識し、直接アドレスを指定することでアクセスされる。このように、ファイルシステムはコンピュータやOSにとって必須の機能ではない。
平坦なファイルシステム
平坦なファイルシステムでは、ディレクトリが存在せず、ハードディスクドライブ (HDD) であれフロッピーディスクであれ、全てが唯一の階層に格納される。単純なシステムだが、ファイルの数が増えるにつれてユーザーがデータを分類して管理することが非常に困難となり、非能率的になった。
他の初期の小規模システムと同様、Mac OSは当初、平坦なファイルシステム、Macintosh File System (MFS) を採用していた。そのバージョンのMac OSでは、Finderがあたかも階層があるかのようにファイルシステムを見せかけていた。MFSは即座に本当のディレクトリをサポートしたHierarchical File Systemに置き換えられた。
UNIXとUnix系システムのファイルシステム
UNIXとUnix系OSは、各デバイスにデバイス名を設定するが、デバイス上のファイルにそれを使ってアクセスするわけではない。UNIXは仮想ファイルシステムを生成し、全てのデバイス上の全てのファイルがひとつの階層構造内にあるように見せかける。従って、UNIXにはひとつのルートディレクトリがあり、全てのファイルはその下のどこかに配置されるのである。さらにUNIXのルートディレクトリは物理的にデバイス上に存在している必要がない。それはそのシステムの1台目のディスクにあるとは限らず、そのシステム内にあるとも限らない。UNIXではルートディレクトリをネットワーク経由で共有することができる。
別のデバイス上のファイルにアクセスするため、最初にOSにそのデバイスのファイル群をディレクトリツリー上のどこに置くか(見せるか)を指示しなければならない。この処理をファイルシステムのマウント(英: mount)と呼ぶ。例えば、CD-ROM内のファイルにアクセスするには、OSに対して「このCD-ROMのファイルシステムを、このディレクトリの下にツリーとして見せろ」と指示しなければならない。このときに指定するディレクトリを「マウントポイント」と呼ぶ。Unix系システムには/mediaや/mntディレクトリがあることが多く、フロッピーディスクやCDといった媒体を一時的にマウントするのに使われる。マウントされるデバイスは何も格納されていないこともあるし、サブディレクトリがあるかもしれない。一般に、システムアドミニストレータ(すなわちスーパーユーザー)だけがファイルシステムのマウントを行うことができる。
Unix系OSにはマウント処理のためのソフトウェアやツールがあり、新たな機能も提供されている。そのひとつとして「自動マウント(英: auto-mount)」がある。
多くの場合、ルート以外のファイルシステムもブート直後からOSにとって必要とされる。全てのUnix系システムはブート時にファイルシステムをマウントする機能を提供している。システムアドミニストレータは、それらのファイルシステムをfstabファイルに定義しておく。fstabにはオプションやマウントポイントが記述される。
場合によっては、後で必要とされるとしてもブート時にファイルシステムをマウントする必要がないこともある。Unix系システムには要求されたときに初めてファイルシステムを自動的にマウントする機能もある。
可搬記憶媒体は非常に一般化してきた。可搬媒体は物理的に接続されていないコンピュータ間でプログラムやデータを転送することを可能とする。最も一般的なものとしてCD-ROMとDVDがある。それらが機器に挿入されたことを自動的に検知し、その中身がファイルシステムとして使用可能であることをチェックし、自動的にマウントするユーティリティも開発されてきた。
最新のUnix系システムでは「スーパーマウント(英: supermount)」と呼ばれる機能が登場している。実例としてthe Linux supermount-ng projectを参照されたい。例えば、スーパーマウントされたフロッピーディスクはシステムから物理的に取り去ることができる。通常、補助記憶装置は内容の同期を取る必要があり、その後にアンマウント (unmount) 処理をしてから取り去らなければならない。これに対して、スーパーマウントではアンマウントする必要が無く、続いて次の媒体を挿入することができる。システムは自動的にそれを検知しマウントポイント以下の内容を新たな媒体のものに変更する。
同様の機能として一部ユーザーが好んで使うのはautofsである。このシステムはスーパーマウントに似ていて、マウントコマンドを手で入力する必要がない。異なるのは、分散ファイルシステムなどを経由して使用する際の互換性に優れていて、媒体の挿入を検知するのではなく、アプリケーションがそのファイルシステムの中身にアクセスしようとしたときにマウントするようになっている点である。従って、ネットワークサーバなどで使われている。
スワップファイルシステム
Unix系OSではMS-DOS系のOSとは違い、仮想メモリのためのHDD利用に、仮想メモリファイルのほかにスワップファイルシステムも利用する。
MS-DOS系OSでは、HDDのパーティション内(OSからドライブとして認識されるFATやNTFSのファイルシステム内)に、スワップ用の隠しシステムファイルを作成する。
Unix系OSでは、たとえばLinuxではスワップ用パーティションを用意し、mkswap、swaponコマンドで利用可能とする。
FreeBSDなどの場合は、BIOSから扱われるパーティションをスライスと呼称し、その中にさらに独自に管理する複数のパーティションとしてスワップファイルシステムを構築する。
macOSのファイルシステム
macOSのファイルシステムはClassic Mac OSから継承したHFSX (HFS+) である。HFSXはメタデータが豊富で大文字/小文字保護をするファイルシステムである。macOSはPOSIXに準拠しているが、HFSXにもPOSIX ACL準拠のパーミッション情報が追加されている。HFSXにはジャーナルが追加されてファイルシステム構造の破損を防ぐようになり、自動的にフラグメント化したファイルを正規ブロックにするなどのアロケーション機能の最適化もいくつか導入されている。
ファイル名は最大255文字である。HFS+はファイル名の格納に独自のルールで正規分解したUnicodeを使用している。macOSではファイルフォーマットはファイル名のタイプコードや拡張子等から総合的に判断している。Mac OS X v10.5からはUTIを用いてより柔軟にフォーマットを判断する。
POSIX系のファイルシステムとは異なり、ファイルをディレクトリの相対位置でアクセスするため、理論上パス長に制限がない。ただ、基盤となるDarwinがUNIX互換を保つため、システムの多くの部分で1024文字を限界としている。Carbonを経由し、HFSXを直接アクセスする場合はこの限りではない。
HFSXには3種類のリンクがある。ハードリンクとシンボリックリンクとエイリアスである。エイリアスはリンク先のファイルが移動されたり改名されたりしてもリンクし続けるようになっている。
ベル研究所のPlan 9のファイルシステム
Plan 9 from Bell Labs (Plan 9) はUNIXの長所を拡張して新たなアイデアを導入し、UNIXの欠点を修正したものとして計画された。
ファイルシステムの観点から言えば、UNIX的に何でもファイルとして扱うという思想は変わっていないが、Plan 9では本当に「すべて」がファイルとして扱われ、アクセスされる(つまりioctlもmmapもない)。ファイルインターフェイスを汎用化すると同時にそれを大幅に単純化している。例えば、シンボリックリンクもハードリンクもsuidも古い機能とされ (obsolete)、アトミックなcreate/open操作が導入された。重要な点はファイル操作がうまく定義されているためにioctlなどを排除できたことである。
また、9Pプロトコルによってローカルとリモートのファイルの違いが無くなっている(時間的な遅延だけは残っている)。このため、ネットワーク経由で別のコンピュータシステム上のデバイス(これもファイルとして表される)をローカルにあるデバイスと全く同じように操作することが可能となっている。従ってPlan 9の元では、複数のファイルサーバをひとつのファイルシステムに見せることができる。この「合成」ファイルシステムのサーバ群は、システムの単純さを保ちながらマイクロカーネルの利点を生かしてユーザー空間で動作することもできる。
Plan 9では全てのものがファイルとして抽象化されている。ネットワーク、グラフィックス、認証、暗号化など様々なサービスをファイル識別子経由の入出力で扱える。例えば、NATなしでIPスタックのゲートウェイシステムを構築したり、追加コードなしでネットワーク透過なウィンドウシステムを提供したりできる。
Plan 9のアプリケーションはFTPサイトからFTPサービスを受けることもできる。ftpfsサーバによってリモートのFTPサイトをローカルのファイルシステムにマウントすることができ、普通のファイルシステムとして扱えるのである。仮想的なファイルやディレクトリを合成するファイルサーバで /mail/fs/mbox をユーザーのメールボックスとするような電子メールシステムもある。wikifsはwikiへのファイルシステムインターフェイスを提供する。
これらのファイルシステムは、プロセス毎のプライベートな名前空間によって構成される。そのため、各プロセスは分散システムに存在する数々のファイルシステムを固有の観点で見ることができる。
Infernoは、これらの概念をPlan 9から受け継いでいる。
Windowsのファイルシステム
Windowsのファイルシステムの歴史
Windowsは、CP/M、次いでMS-DOSを継承して開発されており、MS-DOSのファイルシステムであったFATはWindowsでも用いられている。FATファイルシステムの古い版では、ファイル名に強い制限があり、FATでフォーマットできるディスクやパーティションのサイズにも強い制限があった。
MS-DOSがUnix的なファイル管理を導入した事から、以降のマイクロソフト製OSでは同様の方針が継承されている。
また、IBMとマイクロソフトで共同開発していたOS/2には、FATに加え、FATの欠点を補ったHPFSというファイルシステムが用意された。Windows NTでも、NT 4.0までHPFSをサポートした。
Windows NTにはその後、OS/2のHPFSをより進化させたNTFSが用意された。その結果、Windowsでは FATとNTFSという2種類のファイルシステムが存在することとなった。
WindowsはGUIを通してユーザーと対話するため、ディレクトリを「フォルダの一種」として扱い、フォルダアイコンでグラフィカルに表示している。
NTFSの仕様
NTFSはACLベースのパーミッション制御を可能とした。ハードリンク、代替データストリーム、属性索引、クオータ管理、圧縮、ファイルシステム間のマウントポイント(ジャンクションと呼ばれる)、不良セクタの動的ホットフィックスなどがサポートされている。ただし、一部の仕様は未公開である。
ドライブレター
Windowsでは、UNIX系のファイルシステムとは異なり、「ドライブレター」によってディスクやパーティションをユーザーに見せている。例えば C:WINDOWS というパスはCドライブにある WINDOWSディレクトリを意味している。
Cドライブは1台目のハードディスクパーティションを表すものとして使われることが多く、そこにブート時に起動されるWindowsが格納される。この「伝統」は非常に堅固に植えつけられているため、一時期のWindowsには必ずCドライブにインストールされるという仕様が存在することもあった。これは、MS-DOSから受け継がれた伝統で、AとBがフロッピーディスクドライブ用に予約されていたために Cドライブ以降がハードディスクとなったものである。ネットワークドライブにも同様のドライブ文字がマップされる。ただし、PC-9800シリーズおよびその互換機では、HDD上のWindowsをOSとして起動したときAドライブがHDDに割り当てられた。
Windows NT系OSでは、NTエグゼクティブレベルではドライブレターそのものは実体として存在しなくなった。従前のドライブレターは例えばC:ならば、デバイスオブジェクト??C:からDeviceHarddiskVolume1などのボリュームデバイスオブジェクトへのシンボリックリンクで、従来のWindowsと互換性を持たせている。Windows NT系でも見かけ上ドライブレターに縛られていると誤解される場合があるが、例えばボリュームにドライブレターを与えず、ジャンクションによって特定のディレクトリにボリュームを割り当てた場合、ドライブレターを介する事なくボリュームにアクセスできるといった形でNT系ではドライブレターが必須の要素で無くなった事を知ることが出来る。ただし、Win32サブシステムの制約により、Win32アプリはNTエグゼクティブレベルのディレクトリを起点にパス名を指定する事はできない。例えば、Win32サブシステムの制約を受けないInterixサブシステムでは可能。また、WAIK(Automated Installation Kit)を利用する事でC:以外にもインストールする事も可能。
ハイバネーション領域
パーソナルコンピュータ(パソコン)ではハイバネーションという機能が使える場合がある。この機能を使うとメモリー内容をHDD等に保存して電源を落とし、再度電源投入した際に速やかに作業を再開できる。この為にはハイバネーションファイルを利用するものと、ハイバネーション用パーティションを作成するものが存在する。
ハイバネーション用パーティションを作成する場合は、特殊なファイルシステムとも考えられるが、実際には単にメモリーをベタ複製しているだけとも言える。
リカバリー領域
市販パソコンでは、リカバリー領域と呼ばれる隠しパーティションをもつものがある。
リカバリー領域のファイルシステムについての情報は通常、公開されていない。リカバリー領域をもつパソコンは実質すべてがWindows付属のため、Windows用のNTFSやFAT32等でフォーマットされていると推測される。
OpenVMSのファイルシステム
これについては、Files-11で解説する。
MVS(IBM汎用コンピュータ)のファイルシステム
これについては、MVSファイルシステムで解説する。
ファイルシステムと対応するパーティション番号
IBM PC/ATやPC-9800シリーズ等ではHDDのパーティションごとの利用目的を判別しやすくするため、パーティションごとに番号を与えている。
この番号により、OSの起動時の、利用すべきパーティションの自動判別が速やかに行なわれる。
ただし、正常な設定が行なわれていない場合も考えて、実際のファイルシステム状況を分析して認識する処理が一般的。
具体的には、HPFSと同じパーティション番号を引き継いで開発されたNTFSのような計画上の問題もあった。
また、開発組織がまったく違うために、Linux用のスワップファイルシステムとサン・マイクロシステムズのSolarisのファイルシステムが同じ番号を持ってしまったような例もある。
こういった状況では、誤った認識でデータ破壊が起きる可能性がある。
比較
一般情報
ファイルシステム名 | 開発者 | 登場年 | 最初にサポートしたOS |
---|---|---|---|
RT-11 | DEC | 1973年 | RT-11 |
FAT12 | マイクロソフト | 1977年 | Microsoft Disk BASIC |
ODS-2 | DEC | 1979年 | VMS |
UFS(FFS) | カーク・マキュージック | 1983年 | 4.2BSD |
HFS | アップル | 1985年 | Macintosh System 2.1 |
FAT16 | マイクロソフト | 1987年 | MS-DOS 3.31 |
HPFS | IBM & マイクロソフト | 1988年 | OS/2 |
JFS | IBM | 1990年 | AIX[1] |
VxFS | VERITAS | 1991年 | SVR4.0 |
NTFS | マイクロソフト | 1993年 | Windows NT |
ext2 | レミ・カール | 1993年 | Linux |
UFS(FFFS) | カーク・マキュージック | 1994年 | 4.4BSD |
XFS | SGI | 1994年 | IRIX |
UDF | ISO/Ecma International/OSTA | 1995年 | - |
FAT32 | マイクロソフト | 1996年 | Windows 95 OSR2[2] |
HFS Plus | アップル | 1998年 | Mac OS 8.1 |
ext3 | スティーブン・トウィーディ | 1999年 | Linux |
VMFS | VMware | 2000年 | VMware ESX |
ReiserFS | Namesys | 2001年 | Linux |
UFS2 | カーク・マキュージック | 2002年 | FreeBSD 5.0 |
HFSX | アップル | 2003年 | Mac OS X v10.3 |
ZFS | サン・マイクロシステムズ | 2004年 | Solaris |
Reiser4 | Namesys | 2004年 | Linux |
NILFS | NTT | 2005年 | Linux |
ext4 | Mingming Cao, Dave Kleikamp, Alex Tomas, Andrew Morton他 | 2006年 | Linux |
exFAT | マイクロソフト | 2006年 | Windows Embedded CE 6.0 |
btrfs | オラクル | 2007年 | Linux |
HAMMER-FS | Matthew Dillon (en:Matthew Dillon) | 2008年 | DragonFly BSD 2.0 |
ReFS | マイクロソフト | 2012年 | Microsoft Windows Server 2012 |
APFS | アップル | 2017年 | macOS High Sierra |
ファイルシステム | 開発者 | 登場年 | 最初にサポートしたOS |
諸元
最大ファイル名長 | ディレクトリ名に使える文字種[3] | 最大パス名長 | 最大ファイルサイズ | 最大ボリュームサイズ[4] | |
---|---|---|---|---|---|
Btrfs | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 16EiB | 16EiB |
ext2 | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 16GiB~2TiB[4] | 2TiB~32TiB |
ext3 | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 16GiB~2TiB[4] | 2TiB~32TiB |
ext4 | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 16GiB~16TiB | 1EiB |
FAT12 | 8.3形式(または255文字)[7] | NUL 以外の全Unicode[7][5] | 制限の定義無し[6] | 32MiB | 1MiB~128MiB |
FAT16 | 8.3形式(または255文字)[7] | NUL 以外の全Unicode[7][5] | 制限の定義無し[6] | 2GiB | 16MiB~4GiB |
FAT32 | 8.3形式(または255文字)[7] | NUL 以外の全Unicode[7][5] | 制限の定義無し[6] | 4GiB | 512MiB~2TiB[8] |
HFS+ | 255文字 (UTF-16)[9] | 任意の正しいUnicode [10][5] | 無制限 | 8EiB | 8EiB[11] |
HFS | 31バイト | : 以外の任意のバイト | 無制限 | 2GiB | 2TiB |
JFS | 255バイト | NUL以外の任意のバイト[5] | 制限の定義無し[6] | 8EiB | 512TiB~4PiB |
NILFS | 255文字 | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 8EiB | 8EiB |
NTFS | 255文字 | NUL 以外の全Unicode | Unicodeで32,767文字(ファイル名やディレクトリ名はそれぞれ255文字まで)[6] | 16EiB[12] | 16EiB[12] |
ReFS | 255文字 (UTF-16) | NUL 以外の全Unicode | Unicodeで32,767文字(ファイル名やディレクトリ名はそれぞれ255文字まで)[6] | 16EiB | 3.76ZiB |
Reiser4 | 不明 | 不明 | 制限の定義無し[6] | x86では 8TiB | 不明 |
ReiserFS | 4032バイト/255バイト(VFSによる制限) | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 8TiB[13] | 16TiB |
RT-11 | 12バイト | A-Z, 0-9, $ | 16バイト | 33,554,432バイト (65536 * 512) | 33,554,432バイト |
UDF | 255バイト | NUL 以外の全Unicode | 1023バイト[14] | 16EiB | 不明 |
UFS(FFS) | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 4GiB | 256TiB |
UFS(FFFS) | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 4GiB~256TiB | 256TiB |
UFS2 | 255バイト | NUL 以外の任意のバイト[5] | 制限の定義無し[6] | 512GiB~32PiB | 1YiB |
VxFS | 255バイト | NUL以外の任意のバイト[5] | 制限の定義無し[6] | 16EiB | 不明 |
XFS | 255バイト | NUL以外の任意のバイト[5] | 制限の定義無し[6] | 8EiB[15] | 8EiB[15] |
最大ファイル名長 | ディレクトリ名に使える文字種[3] | 最大パス名長 | 最大ファイルサイズ | 最大ボリュームサイズ[4] |
メタデータ
ファイル所有者名を保持 | POSIX式ファイルパーミッション | 作成時タイムスタンプ(TS) | 最新アクセス時TS | 最新メタデータ更新TS | 最新アーカイブTS | ACL | セキュリティ/MACラベル | 拡張ファイル属性/フォーク | チェックサム/ECC | |
---|---|---|---|---|---|---|---|---|---|---|
RT-11 | × | × | × | ○ | ○ | × | × | × | × | × |
FAT12 | × | × | ○ | ○ | × | × | × | × | × [16] | × |
FAT16 | × | × | ○ | ○ | × | × | × | × | × [16] | × |
FAT32 | × | × | ○ | ○ | × | × | × | × | × | × |
HPFS | ○ [17] | × | ○ | ○ | × | × | × | 不明 | ○ | × |
NTFS | ○ | ×[18] | ○ | ○ | ○ | × | ○ | 不明 | ○ | × |
ReFS | ○ | × | ○ | ○ | ○ | × | ○ | 不明 | ○ | ○ |
HFS | × | × | ○ | × | × | ○ | × | × | ○ | × |
HFS+ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | 不明 | ○ | × |
UFS(FFS) | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
UFS(FFFS) | ○ | ○ | × | ○ | ○ | × | ○ [19] | ○ [19] | × [20] | × |
UFS2 | ○ | ○ | ○ | ○ | ○ | × | ○ [19] | ○ [19] | ○ | × |
ext2 | ○ | ○ | × | ○ | ○ | × | ○ [21] | ○ [21] | ○ | × |
ext3 | ○ | ○ | × | ○ | ○ | × | ○ [21] | ○ [21] | ○ | × |
ext4 | ○ | ○ | ○ | ○ | ○ | × | ○ | ○ | ○ | ○ |
NILFS | ○ | ○ | ○ | × | ○ | × | × | × | × | ○ |
ReiserFS | ○ | ○ | × | ○ | ○ | × | ○ [21] | ○ [21] | ○ | × |
Reiser4 | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
XFS | ○ | ○ | × | ○ | ○ | × | ○ | ○ [21] | ○ | × |
JFS | ○ | ○ | ○ | ○ | ○ | × | ○ | ○ | ○ | × |
VxFS | ○ | ○ | ○ | ○ | ○ | × | ○ | 不明 | ○ [21] | × |
UDF | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | ○ | × |
ファイル所有者名を保持 | POSIX式ファイルパーミッション | 作成時タイムスタンプ (TS) | 最新アクセス時TS | 最新メタデータ更新TS | 最新アーカイブTS | ACL | セキュリティ/MACラベル | 拡張ファイル属性/フォーク | チェックサム/ECC |
機能
ハードリンク | ソフトリンク | ブロック・ジャーナリング または | メタデータのみのジャーナリング | 大文字/小文字区別 | 大文字/小文字保護 | ファイル更新ログ | インクリメンタル・スナップショット | XIP | |
---|---|---|---|---|---|---|---|---|---|
RT-11 | × | × | × | × | × | × | × | × | × |
FAT12 | × | × | × | × | × | × | × | × | × |
FAT16 | × | × | × | × | × | △ | × | × | × |
FAT32 | × | × | × | × | × | △ | × | × | × |
HPFS | × | × | × | × | × | ○ | × | 不明 | × |
NTFS | ○ | △[22] | × | ○ | ○[23] | ○ | ○ | ○ | 不明 |
ReFS | × | △ | 不明 | 不明 | ○ | ○ | 不明 | 不明 | 不明 |
HFS+ | △ | ○ | × | ○ [24] | △ [25] | ○ | ○ [26] | × | × |
UFS(FFS) | ○ | ○ | × | × | ○ | ○ | × | × | × |
UFS(FFFS) | ○ | ○ | × | × | ○ | ○ | × | × | × |
UFS2 | ○ | ○ | × | ×[27] | ○ | ○ | × | ○ | 不明 |
ext2 | ○ | ○ | × | × | ○ | ○ | × | × | ○[28] |
ext3 | ○ | ○ | ○ [29] | ○ | ○ | ○ | × | × | 不明 |
ext4 | ○ | ○ | ○ [30] | ○ | ○ | ○ | × | × | 不明 |
NILFS | ○ | ○ | ○ [31] | × | ○ | ○ | × | ○ | 不明 |
ReiserFS | ○ | ○ | ○ [32] | ○ | ○ | ○ | × | × | 不明 |
Reiser4 | ○ | ○ | ○ | × | ○ | ○ | × | 不明 | 不明 |
XFS | ○ | ○ | × | ○ | ○ | ○ | ○ | ○ | 不明 |
JFS | ○ | ○ | × | ○ | ○[33] | ○ | × | 不明 | 不明 |
ODS-2 | ○ | ○[34] | × | ○ | × | × | ○ | ○ | × |
UDF | ○ | ○ | ○[35] | ○[35] | ○ | ○ | × | × | ○ |
VxFS | ○ | ○ | ○ | × | ○ | ○ | ○ | ○[36] | 不明 |
ZFS | ○ | ○ | ○[37] | ×[37] | ○ | ○ | × | ○ | × |
ハードリンク | ソフトリンク | ブロック・ジャーナリング または | メタデータのみのジャーナリング | 大文字/小文字区別 | 大文字/小文字保護 | ファイル更新ログ | インクリメンタル・スナップショット | XIP |
アロケーションとレイアウト
Tail Packing | 透過的圧縮 | ブロックの分割割り当て | 遅延アロケーション | エクステント | 可変ファイルブロックサイズ [38] | |
---|---|---|---|---|---|---|
FAT12 | × | × [39] | × | × | × | × |
FAT16 | × | × [39] | × | × | × | × |
FAT32 | × | × [39] | × | × | × | × |
HPFS | × | × | × | × | ○ | × |
NTFS | × | ○ | △ | × | ○ | × |
ReFS | 不明 | × | 不明 | 不明 | 不明 | × |
HFS+ | × | × | 不明 | × | ○ | × |
UFS (FFS) | × | × | ● 8:1 [40] | × | × | × |
UFS (FFFS) | × | × | ● 8:1 [40] | × | × | × |
UFS2 | × | × | ● 8:1 [40] | × | × | ○ |
ext2 | × | × [41] | × [42] | × | × | × |
ext3 | × | × | × [42] | × | × | × |
ext4 | × | × | ○ | ○ | ○ | × |
NILFS | × | × | × | ○ | × | × |
ReiserFS | ○ | × | × | × | × | × |
Reiser4 | ○ | × [43] | × | ○ | ○ [44] | × |
XFS | × | × | × | ○ | ○ | × |
JFS | × | × | ○ | × | ○ | × |
VxFS | × | × | 不明 | × | ○ | × |
UDF | × | × | × | 不明 [45] | ○ | × |
ZFS | × [46] | ○ | 不明 | ○ [47] | × | ○ |
Tail Packing | 透過的圧縮 | ブロックの分割割り当て | 遅延アロケーション | エクステント | 可変ファイルブロックサイズ [38] |
注
^ IBMは1990年にAIX 3.1 リリース時に JFS を導入。これは現在 JFS1 と呼ばれている。新たなJFS(JFS2などと呼ばれる)は Linux移植版がベースで、1999年にOS/2 Warp Server for e-Business で最初に出荷された。
^ マイクロソフトはWindows 95 OSR2で最初に FAT32 を導入し、Windows 98で本格的に採用した。
- ^ abディスク上のディレクトリ構造自体に制限がある。特にInstallable File Systemのドライバはファイル名とディレクトリ名に制限がある。また、OSがファイルシステムの種類に寄らず全体に制限を加えていることもある。MS-DOS, Microsoft Windows, OS/2は全ファイルシステムについて / : ? * " > < | NUL といった文字をファイル名やディレクトリ名に使えない。UNIXおよびLinuxは全ファイルシステムについて / NUL という文字をファイル名やディレクトリ名に使えない。
- ^ abcdブロックサイズやクラスタサイズが可変なファイルシステムについては、ブロックサイズの最大と最小のときのボリュームサイズの範囲を示す。例えば、FATではディスク上のクラスタサイズが512B~128KBである。しかし、Installable File Systemの一部のドライバやOSによっては 32KBより大きいクラスタサイズをサポートしていない。
- ^ abcdefghijklmnopこれらのファイルシステムでは、"." と ".." というディレクトリエントリ名は特別な意味を持つ。そのような名前のディレクトリエントリは禁じられておらず、むしろ普通のディレクトリエントリ名として存在している。しかし、これらはある意味で固定のエントリで固定の値を持ち、ディレクトリ生成時に自動的に生成される。これらのエントリがないディレクトリは壊れていると見なされる。
- ^ abcdefghijklmnopqrディスク上の構造としては制限はないが、一部のInstallable File SystemのドライバやOSによっては制限している場合がある。MS-DOSはFAT12やFAT16に関して260バイト以上のパス名をサポートしていない。Windows NTはNTFSに関して32767文字 (UTF-16) 以上のパス名をサポートしていない。POSIXの規定では「NULL終端で1024バイトを保証すること」とされているが、上限についての記述はない。
- ^ abcdefFAT12、FAT16、FAT32の実装が、LFN(長いファイル名)をサポートしているかどうかに依存する。OS/2, MS-DOS, Windows 95, Windows 98 のDOSモードやLinuxの msdosドライバではLFNをサポートしていないので、ファイル名は8.3形式に制限される(制限を越えるとベース名も拡張子も空白で埋められる)。また、NUL(ディレクトリ終端マーカー)を含むこともできず、文字5(削除済みファイルマーカーとして使われる文字229の代用)も含むことができない。短い名前では小文字も含まれない。
^ FAT32のパーティションをこのサイズで作成して使用することは可能だが、ソフトウェアによっては 32GiB以上のFAT32用パーティションを作成できない。有名なのは、Windows XPのインストールプログラムである(これはNTFSの利用を促すための意図的な制限であると思われる)。これを回避するには Windows Meの緊急用ブートディスクのFDISKを使う必要がある。
^ Mac OSはHFS+のボリューム上のファイル名を扱う関数群を2種類用意している。ひとつは完全なUnicodeの名前を返し、もうひとつは従来互換を保つために31バイトまでの名前を返すものである。
^ HFS+は任意のUnicode文字を許すためにエスケープシーケンスをサポートしている。古いソフトウェアからはそのエスケープシーケンスがそのまま見える。
^ HFS+のボリュームサイズはほぼ無制限であるが、Mac OSには以下のような制限がある。Mac OS 8, 9:2TiB。Mac OS X 10、10.1:2TiB。Mac OS X 10.2:8TiB。Mac OS X 10.3、10.4:16TiB。ファイルサイズの最大はこれより若干小さい(Mac OS 8では2GB)。フォルダ内の最大ファイル数(フォルダ数)は以下の通り。 Mac OS 8, 9:2^15 (32767)。macOS:2^31。しかし、通常最大ボリュームサイズをブロックサイズで割った値で制限される。
- ^ abこれはディスク上の構造による制限である。Windows NT用NTFSドライバはボリュームサイズを256TiB、ファイルサイズを16TiB に制限している。
^ ReiserFSの理論上の最大ファイルサイズは1EiBだが、[1]によれば、「ページキャッシュの制限により、32ビット int のアーキテクチャでは 8TiB に制限される」
^ この制限は新しい版では大きくなるかもしれない。
- ^ abLinux 2.4 では XFS の最大ファイルサイズは 64TiB だが、Linux 2.4 自体が最大 2TiB までしかサポートしていない。IRIXにはこの制限はない。
- ^ ab一部のInstallable File SystemドライバやOSによってはFAT12やFAT16で拡張ファイル属性をサポートしていない。OS/2とWindows NTはFAT12/FAT16向けに拡張ファイル属性をサポートしている("EA DATA. SF"擬似ファイルを使ってそのためにアロケートされたクラスタを予約している)。他のOSのファイルシステムドライバではサポートしていない。
^ f-nodeにはユーザー識別子用フィールドがあるが、OS/2 Warp Server 以外では使われていない。
^ NTFSのアクセス制御リストは単純なPOSIX式ファイルパーミッションで表せることは表現できるが、Services for UNIX や Cygwin を使わないとPOSIXのインターフェイスがサポートされない。
- ^ abcdアクセス制御リストとMACラベルは拡張属性として実装される。
^ FreeBSD 4.XなどのOSでは拡張属性をparallel backing fileを使って実装している。
- ^ abcdefgh一部のInstallable File SystemドライバやOSによっては、これらのファイルシステムについて拡張属性、ACL、セキュリティラベルをサポートしていない。2.6.x以前のLinuxはこれらをサポートしていないか、パッチが必要である。
^ NTFS 5.0 以降では、junctions を生成でき、(個々のファイルではなく)ディレクトリ全体をローカルに管理するドライブのいずれかのディレクトリツリーにマップすることができる。これは reparse points と呼ばれる機能で実現されており、ファイル名解析部分を柔軟に拡張可能となっている。
^ NTFS自体は大文字/小文字を区別するが、Windowsサブシステムは互換性を維持するため大文字/小文字の差異しかないファイル名を生成できないようになっている。新しいファイルを書き込みのためにオープンしたとき、大文字/小文字の差異を無視したときに同じ名前となるファイルが既に存在すると、その既存のファイルの内容が消されて書き込みに使われてしまう。Services for UNIXを使うと、完全な大文字/小文字の区別が行われる。
^ メタデータのみのジャーナリングは、Max OS X v10.2.2 の HFS+ドライバから導入された。デフォルト値でジャーナリングが有効となったのはMac OS X v10.3以降である。
^ 一般に大文字/小文字を区別していると思われがちであるが、HFS+は基本的には区別していない。単に大文字/小文字の違いを保護しているだけである。Mac OS X v10.3のコマンド newfs_hfs -s で大文字/小文字を区別するファイルシステムを作成できる。HFSXという別のファイルシステムは、HFS+を改良したもので、こちらは大文字/小文字を区別する。Technical Note TN1150: HFS Plus Volume FormatではHFS+とHFSXについて技術的詳細を論じている。
^ Mac OS X v10.4とMac OS X v10.3はファイル変更ログを提供している(ファイルシステムソフトウェアの機能であり、ボリューム形式自体がサポートしているわけではない)。fsloggerを参照されたい。
^ NetBSDの"Soft dependencies" (softdep)およびFreeBSDの"soft updates"はジャーナリングせずにメタデータの一貫性を常に保つ機能がある。
^ Linux 2.6.12 以降。
^ デフォルトでは無効になっている。
^ デフォルトでは無効になっている。
^ ログ構造化ファイルシステムであり,メタデータだけでなく全てのファイルデータの更新がインクリメンタルに記録される。
^ ReiserFSの完全なブロック・ジャーナリングは Linux 2.6.8 で追加された。
^ 一部のInstall File SystemドライバやOSによってはJFSでの大文字/小文字区別をサポートしていない。OS/2はサポートしておらず、Linux はマウント時のオプションで指定できる。
^ "aliases"と呼ばれている。
- ^ abUDFはログ構造ファイルシステムであり、ファイルシステム全体がジャーナルであるかのように振舞う。
^ VxFSはオプションとして「ストレージ・チェックポイント」と呼ばれる機能を提供している。これは高機能のファイルシステム・スナップショット機能である。
- ^ abZFSはトランザクション・ファイルシステムであり、コピー・オン・ライト方式であるため、ジャーナルを使わなくてもディスク上の状態は常に正常である。しかし、同期書き込みを指定されたときなどの性能向上のため、ログを実装している。
- ^ abここで言う可変ブロックサイズとは、ファイル毎にブロックサイズを変更できるシステムである。エクステントと似ているが実装方針が微妙に異なる。UFS2の現状の実装はリードオンリーのみである。
- ^ abcDOS 6 の DoubleSpace や Windows 95およびWindows 98の DriveSpace は FAT におけるデータ圧縮機能だが、マイクロソフトが既にサポートしていない。
- ^ abc8:1以外の「ブロック:フラグメント」のサイズ比もサポートしているが、8:1が最も一般的で多くの実装で推奨されている。
^ 1997年から利用可能なe2comprというパッチのセットでext2でのブロック単位のデータ圧縮が可能となる。しかし、これがLinuxカーネルのメインラインにマージされたことはない。
- ^ abフラグメントは計画されていたが、ext2とext3に実装されたことはない。
^ Reiser4はデータ圧縮を実装しているが、そのためのVFS APIが提供されていない。
^ "extents"モードで実現。
^ UDFの実装に依存する。
^ ZFSの論理ブロックベースの圧縮を有効にすると、ファイルの最後尾ブロックに対してTail-Packingのように働く。
^ コピーオンライトであるため、ZFSは全ての書き込みについて遅延アロケーションを行う。
関連項目
- ファイルシステム
- ジャーナリングファイルシステム
- バージョニングファイルシステム
- 仮想ファイルシステム
- 分散ファイルシステム
- ファイルシステムAPI
- ファイル編成法
- ファイルフォーマット
- 拡張子
- 記憶装置
- パーティション
|