Linuxのカーネルの開発に関する世界観(ファイルシステム)です。
自分の書いたブログ「わたしの名はフレイ」2020/06/26より。
Linuxカーネルでは、モノリシックカーネルであるため、ファイルシステム処理がカーネルに統合されている。
ブロック型ファイルシステムのext2やext4が標準的に使われるが、B-Tree型のファイルシステムであるReiserFS, XFS, JFSなども使うことができる。
また、次世代の(おそらくZFSを超える)ファイルシステムであるBtrfsも開発されている。
LinuxカーネルではVFSの仕組みにより、ファイルシステムが変わってもシステムコールのAPIは変わらない。
どのファイルシステムにも、同じようにプログラムからアクセスできる。
また、ジャーナリングに対応したファイルシステムでは、一度マシンを強制終了しても、ファイルやデータが消え去ることがない。
また、内部的にはi-nodeと呼ばれるインデックス処理を行っている。
全てのファイルにはi-nodeから参照できる。
基本的にext2, ext3, ext4, JFS, XFS, Btrfs, FAT, FAT32などがある。
Linuxでしかファイルシステムを使わない場合は、一番優れていて安心できるのはext4。Linuxのルートファイルシステム(Linuxのシステムをインストールするファイルシステム)にはext4を使うのが無難。Bツリーファイルシステムはまだまだ未熟である。
LinuxでもWindowsでも読み書きできるようにファイルシステムをフォーマットしたい時はFAT形式がおすすめである。USBハードディスクなどを使う場合でも、WindowsからもLinuxからも読む場合はFAT形式を使おう。
ext3やext4(現在のLinuxの標準)などのファイルシステムはジャーナリングファイルシステムと呼ばれ、ジャーナリングによってシステムの整合性を保つ機能が搭載されている。
ジャーナリングに対応していないと、不意に異常終了した時にファイルシステムが破損する場合がある。
LinuxではVFSという機構を使うことで、各ファイルシステムの差異を吸収することが出来る。
プログラマやプログラムは各ファイルシステムの実装の詳細を知らなくても、VFSのインターフェイスだけを使ってあらゆるファイルシステムに対応することができる。
以下は参考文献。
Linuxカーネル(i-node)を参照のこと。
Linuxカーネル(ディスクの読み書き)を参照のこと。
VFSでは、通常使うファイル処理のシステムコールが用意されている。たとえばmount(), chdir(), mkdir(), open(), close(), creat(), read(), write()など。
VFSに対してread()やwrite()といった命令が与えられると、VFSはLinuxカーネルの中のシステムコールであるsys_read()やsys_write()を実行する。Linuxカーネルの中でこれらのシステムコールが「トランスレーション」というVFSの置き換え機能により、ファイルシステム固有(ext2など)の関数へと置き換えられる。
詳しくは以下の書籍・ページを参照のこと。
Linux API(システムコール)も参照のこと。
ext2は長年使われてきたLinuxのブロック型ファイルシステム。長い間使われ続けてきたため、信頼度は高い。
サーバーやエンタープライズなど、信頼性が必要ならばext2あるいはジャーナリングのあるext3/4を選ぼう。
ext2を参照のこと。
ファイルシステム技術に対して、データベースの分野で培われた「Bツリー」(B木)というインデックス技術を使った、さらに高速で堅固なファイルシステムがある。これをB-Treeファイルシステムと呼ぶ。
その中でもReiserFSやXFSなどが有名だが、将来の標準候補であると注目されているのがBtrFS。
B-Treeファイルシステムを参照のこと。
Btrfs/ZFSを参照のこと。
tmpfsは、メモリ上に作成することのできるファイルシステム。メモリ上であるため非常にアクセスが高速で、かつ、マウントポイントにマウントして利用できる。
名前の通り、一時ファイルを作成するのに適している。
主な特殊ファイルシステムとしては、bdev, binfmt_misc, devfs, devpts, pipefs, proc, rootfs, shm, sockfs, tmpfsなどがある。
(詳解 Linuxカーネル 第2版を参考に執筆しました。)
FUSEは、カーネル空間ではなくユーザー空間で、ユーザー独自のファイルシステムを実現するシステム。たとえばGNOMEの仮想ファイルシステム機能(FTPなどにアクセスする)とか、Google DriveやGmailなどへアクセスするなどの用途がある。
GNOMEアーキテクチャも参照のこと。
AuFS/Overlayfsは、複数のディレクトリツリーを重ね合わせることのできるファイルシステム。Dockerなどで利用されている。
Dockerも参照のこと。
ファイルシステムの基本操作については、UNIX管理(4.ファイルシステム)を参照のこと。
ファイルシステム関係のAPIについては、Linux システムコール・APIを参照のこと。
ハードディスクなどのストレージについては、ハードディスクを参照のこと。
MINIX本では、ファイルシステムについて詳細が記述されています。