0から作るソフトウェア開発

日々勉強中。。。

Tips
リンク

ファイルシステム >

0から作るLinuxプログラム Ext2ファイルシステムその1 ファイルシステムの概要

Ext2ファイルシステム

Linuxのファイルシステムのうち基本的なファイルシステムであるExt2について
みていきます。

それでは、順番に見ていきます。

目次 Ext2ファイルシステム

  1. (現在のページ) ファイルシステムの概要

  2. ファイルシステムへのアクセス

  3. カーネルサイドから見たシステムコール

  4. ファイルシステム関連のシステムコール

  5. 仮想ファイルシステム(VFS)

  6. ステップ0 Ext2ファイルシステムと簡単なモジュールの実装

  7. ステップ1 Ext2ファイルシステムタイプとマウントメソッド

  8. ステップ2 Ext2スーパーブロックの読み込み

  9. ステップ3 スーパーブロック管理情報

  10. ステップ4 マウントとスーパーブロックオブジェクト

  11. ステップ5 スーパーブロックオブジェクトと管理情報のセットアップ

  12. ステップ6 ブロックグループディスクリプターの読み込み

  13. ステップ7 ルートディレクトリのinode読み込み

  14. ステップ8 簡単なディレクトリの読み込み

  15. ステップ9 ディレクトリ読み込みとページキャッシュとaddress_space

  16. ステップ10 inodeオブジェクトのlookupメソッド

  17. ステップ11 inodeオブジェクトのmkdirメソッドとper-cpuカウンター

  18. ステップ12 簡単なブロックの新規割り当て処理

  19. ステップ13 スーパーブロックオブジェクトのwrite_inodeメソッド

  20. ステップ14 Orlov方式による新規ディレクトリのinodeを割り当てるブロックグループ選択

  21. ステップ15 inodeオブジェクトのrmdirメソッドとunlinkメソッド

  22. ステップ16 inodeオブジェクトのrenameメソッド

  23. ステップ17 inodeオブジェクトのcreateメソッドとファイルオブジェクトの汎用メソッド

  24. ステップ18 inodeオブジェクトのlinkメソッド

  25. ステップ19 シンボリックとinodeオブジェクトのsymlinkメソッド

  26. ステップ20 inodeオブジェクトのmknodメソッドとtmpfileメソッド

  27. ステップ21 スーパーブロックオブジェクトのevict_inodeメソッド

  28. ステップ22 スーパーブロックオブジェクトのsync_fsメソッド

  29. ステップ23 スーパーブロックオブジェクトのstatfsメソッドとメモリーバリアー/フェンス

  30. ステップ24 スーパーブロックオブジェクトのremount_fsメソッドとマウントオプション解析

  31. ステップ25 スーパーブロックオブジェクトのshow_optionsメソッドとprocfs

  32. ステップ26 カーネルオブジェクトとsysfs

  33. ステップ27 スーパーブロックオブジェクトのfreeze_fs/unfreeze_fsメソッド

  34. ステップ28 ファイルオブジェクトのioctlメソッド

  35. ステップ29 ファイルオブジェクトのsetattrメソッド

  36. ステップ30 address_spaceのdirect_IOメソッド

  37. ステップ31 リザベーションウィンドウ

  38. ステップ32 拡張アトリビュートその1 ハンドラーの呼び出し

  39. ステップ33 拡張アトリビュートその2 コア処理

  40. ステップ34 POSIX ACLその1 ハンドラーの呼び出し

  41. ステップ35 POSIX ACLその2 コア処理

  42. ステップ36 ディスククォータ

はじめに

ここでは、LinuxのExt2ファイルシステムについて見ていきます。

ファイルシステムはLinuxカーネルをある程度知っていないと作ることが

なかなか難しいですが、少しずつ作っていけばちょっとずつ理解できていきます。

ここでは、実際にExt2ファイルシステムのカーネルモジュールを段階的に作っていき、

作ったカーネルモジュールを動作させてLinuxのファイルシステムがどのように

作られているのかを体験して楽しく理解していきましょう。

このように、新しい知識を得て、実際に自分でプログラムを作成し、動作させて

感動を得る体験をこのサイトでは゛ディベロッパー・エクスペリエンス”と定義しています。



それでは、Ext2ファイルシステムについてディベロッパー・エクスペリエンスを楽しみましょう!

用語について

ここでは64ビットという用語がでてきたら主にx86-64を指している

ものと考えてください。(IA-64とx86-64の混同にご注意ください)。

開発環境について

今回はLinuxカーネルのモジュールを開発していきます。カーネルプログラミングでは

モジュールの不具合がシステムに影響を与えますので、なるべくテスト開発環境を

を作って作業を行ってください。

現在では、いろいろな仮想環境が作られています。その仮想環境にLinuxを

インストールして作業を行います。もちろん、その限りではなく実機でLinuxを

動作させてもいいと思います。

仮想環境境

仮想環境とは、パソコンを仮想的にエミュレートするプログラムのことを言います。

仮想環境はいろいろあります。Windows、MacやLinux用にそれぞれ用意されて

いるものもあります。自分の環境にあった使いやすいものを選んで使っていってください。

例えば、次のような仮想環境があります。



Linux

開発用のOSはもちろんLinuxを用意します。Linuxにはたくさんのディストリビューションが

ありますが、このサイトではUbuntuを推奨しています。

このサイトで作成するプログラムはLinuxカーネル3.16を対象としています。このバージョン

より結構古いカーネルや新しいカーネルではコンパイルできない可能性があります。

バージョンが違う場合には、なるべくカーネル3.16をThe Linux Kernel Archives

などからダウンロードしてビルドしてからプログラムを始めてください。



現在お使いのLinuxカーネルはターミナルで次のようにコマンドを実行することで知ることができます。


$ uname -r
3.16.0-28-generic



unameコマンドはシステム情報を表示するコマンドで、オプションrを指定すると

カーネルのリリースバージョンが表示されます。この例ではバージョンが3.16と表示されています。



それでは開発環境の準備ができましたら、ファイルシステムの概要について見ていきましょう。

ファイルシステムの概要

ファイルシステムと聞いてもただ漠然としたイメージしか湧いてきませんが、少しずつ見ていきましょう。



パソコンを使っていらっしゃるみなさんにとって馴染み深いファイルとかディレクトリ(フォルダー)があります。

ファイルは私たちが保存しておきたい情報が格納されていて、ディレクトリにはさまざまな種類の

ファイルを一まとめのグループに格納しておきたいときに使用されているかと思います。通常の

パソコン操作をしているだけでも経験的にファイルやディレクトリの概念を理解して使っています。

例えば、みなさんがパソコンでテキストを編集するときにテキストファイルがどこにあるのかをls

コマンドなどでファイル名を確認されているかと思います。そうすると、ディレクトリに格納されている

ファイルの一覧が表示されます。そしてテキストエディターで目的のファイルを開いて編集を始めます。



このような何でもない一連の操作についてファイルシステムが働いて、ファイルの読み書きを

サポートしてくれています。

ユーザーから見えるファイルシステム

先ほどのテキストファイルのようにユーザー操作からファイルシステムを垣間見ることができます。

ユーザーから見ることができるファイルシステムの一部について見ていきましょう。

ファイル名

lsコマンドを実行したときにファイル名の一覧が出てきます。ファイル名は目的のファイルを

特定するために、ディレクトリ内でその名前はただ1つしか存在できません。ファイル名の

長さはOSやファイルシステムによって異なりますが、通常255バイトとなります。

また、FATなどの一部のファイルシステムを除き、大文字と小文字を区別します。

例えば、゛File1”と゛FILE1”は別のファイルと認識されます。

補足
ファイル名の長さ255バイトは、プログラムが扱うファイル名のデータ長のことを言います。

ファイル名がASCIIだと通常1文字が1バイトになりますが、例えば文字コードとして

UTF-8を使用している場合、ひらがなや漢字などのASCII以外のファイル名は

1文字でも2バイトから4バイトのデータ長となります。



ディレクトリ

ディレクトリには様々なファイルをまとめて格納することができます。また、ディレクトリのなかに

ディレクトリを作ることができ、ファイルシステムのファイルとディレクトリは木構造となります。

この木構造のことをディレクトリツリーとも言います。特に木の根の部分をルートディレクトリと言い、

ファイルシステムで一番最初に参照することになる重要なディレクトリとなります。

ルートディレクトリの名前は゛/”となります。また、特殊なディレクトリの名前が2つあります。

1つは゛.”で、これは自分自身のディレクトリを表します。もう1つは゛..”で、これは

親ディレクトリを表します。

ディレクトリツリー

パス

木構造で表されたディレクトリ名やファイル名はパスで表します。通常パスはルート

ディレクトリから始まり、ディレクトリを゛/”で区切ります。例えば、ルートディレクトリの下に

゛home”というディレクトリがあり、その下に゛File1”というファイルがある場合、File1を表す

パスは次のようになります。


/home/File1



また、パスには絶対パスと相対パスがあります。絶対パスはルートディレクトリから始まるパスで

相対パスは現在作業中のディレクトリ(カレントディレクトリ)を起点としたパスで

表現します。例えば、上の例で現在homeディレクトリで作業していたとすると、File1の

相対パスは次のようになります。


./File1



マウント

ファイルシステムのファイルとディレクトリで木構造となっていますが、特にディレクトリには

他のファイルシステムの木構造をつなげることができます。これをマウントと言います。

通常マウントするときにはファイルシステムのルートディレクトリをマウントポイントに接合します。

また、マウントされるディレクトリのことをマウントポイントとも言います。

マウント

補足
Linuxでは同一ファイルシステムでも、複数個所にマウントすることができます。

また、Linuxでは木構造の一部を別のマウントポイントにマウントすることが

できます。


ファイルデータ

ファイルにデータを書き込みしたり、ファイルからデータを読み込むことができます。

書き込みするデータはファイルシステムが記録媒体上の場所を指定して格納します。

また、読み込みするデータはファイルシステムが記録媒体上の場所を特定して

メディアからデータを読み込みます。

ファイル属性(アトリビュート)

ファイルにはファイルのサイズ、更新日時、実行/読み込み/書き込み権限などの

ファイル属性(アトリビュートやメタデータとも言います。ここではアトリビュートを使います)が

あります。アトリビュートはファイルと紐づけて記録媒体に記録されています。

lsコマンドにオプションlを指定すると表示される情報となります。

例えば、lsコマンドを実行したとき次のように表示されます。


$ ls -l ./File1
-rw-rw-r-- 1 yabusame2001 yabusame2001 1023 Sep 23 15:16 File1



最初の列は実行(x)、読み込み(r)、書き込み(w)の権限が表示されています。

最初のxrwはユーザー権限、次のxrwはグループ権限で最後のxrwはその他の

ユーザーの権限となります。権限が無い場合゛-”が表示されます。ここでは、

実行権限(x)が無いため最初が゛-”となっています。次の列はリンクカウントと

なります。例えばlnコマンドでこのファイルのハードリンクが作成されると1増えます。

次の列は所有者でその次が所有グループとなります。その次の1023はファイルサイズ

となります。その次の日付は最終更新日が表示されます。



これらの情報はファイルシステムが記録媒体にファイルと紐づけて、ファイルの

アトリビュートとして記録しています。

拡張ファイル属性(拡張ファイルアトリビュート)

ファイル属性では表現できない属性を拡張してファイルに紐づけします。

これを拡張ファイルアトリビュートと言います。

拡張ファイルアトリビュートは属性の゛名前”に対して゛値”が記録できます。

また゛名前”に対して゛名前空間”があります。名前空間は例えば、セキュリティ

名前空間の属性名と同じ名前が、システム名前空間にあった場合、

それぞれの操作で操作権限を変えることができるように設けられています。

現在のところLinuxでは名前空間はあらかじめ定義されています。

もう少し詳しい内容については後ほど見ていきます。

この名前空間と名前の組み合わせはLinuxではドットでつなげて

次のように表記します。


namespace.name



ファイルに対してnamespace.nameに値を設定したり、値を

取得したりするときにもファイルシステムが働いています。

リンクとシンボリックリンク

lnコマンドで別名のファイルにリンクを行うことで、同一のファイルデータを

参照できるようになります。例えば、次のようにlnコマンドを実行すると

aというファイルの実態をbといファイル名にリンクすることができます。


$ ln a b



また、lnコマンドにsオプションを指定して実行するとシンボリックリンクを

作成することができます。例えば、次のようにlnコマンドを実行すると

aというファイルを参照するcというシンボリックリンクファイルができます。

シンボリックリンクcを参照することでファイルaにアクセスすることができます。


$ ln -s a c



リンクとシンボリックリンクは同じような働きを行いますが、ファイルシステムでは

違った動作を行います。リンクではファイルaとファイルbは同じ記録媒体上の

データを参照しています。しかし、シンボリックリンクではファイルaはデータを

参照していますが、シンボリックリンクcはファイルaへのパスが記録されています。

シンボリックリンクではそのパスを解析し、ファイルaにアクセスしています。

シンボリックリンクに対してリンクをハードリンクとも呼びます。

ファイルシステムがリンクとシンボリックリンクで違う動作をしていることも、

後ほど見ていきます。

リンクとシンボリックリンク

デバイスファイル

Linuxではデバイスをファイルとして作成することができます。作成した

デバイスファイルに通常のファイル操作と同じように読み込みや書き込みを

行って、デバイスを制御することができます。デバイスファイルはデバイスと

そのドライバーを紐づけるために作成します。

ユーザーから見えないファイルシステム

ファイルシステムは現在の普及OSではOSの機能の一部となります。ファイルシステムは

ファイルを作ったり削除したり、ファイルのデータを読み込んだり・書き込んだりするときに、

記録媒体のどこの領域を読み込めばいいのかまたは書き換えればよいのかを特定することが

主な機能となります。

言い換えると、ユーザープログラムからファイル名を指定されたときに、ファイルシステムが

管理する記憶媒体のどのブロックにファイルのデータが格納されているのかを教えてくれる

機能ということになります。

ファイルシステムの機能

通常ハードディスクやDVDメディアにはメモリーのように1バイトずつアクセスすることは

できません。ハードディスクなどの記録メディアにはある程度のバイトをまとめてアクセス

することになります。ある程度まとめたデータのことをセクターといい、ハードディスクでは

セクター単位でデータを格納したり読み込んだりします。慣習的に1セクターは

512バイトであることが多いです。

補足
もちろんハードディスクのなかには512バイトではなく、もっと大きなバイト数を

最低単位として扱うことはできますが、既存ソフトの変更をしなくてもよいなど

からの理由から慣習的に512バイトとなっています。1セクターが何バイト

であるかはATAコマンドでディスクドライブから取得できます。


このように、ファイルシステムが管理する記録媒体は512バイトでまとめられたセクター

単位でアクセスします。そして、ある程度のブロックごとにアクセスするデバイスを

ブロックデバイスと呼びます。ブロックデバイスを制御するプログラムを

ブロックデバイスドライバーと言います。



ブロックデバイスドライバーはブロック単位でアクセスすることになりますので、ブロック

デバイスに記録されたファイルそのものはセクターサイズ(通常512バイト)の倍乗となります。

言い換えると、ファイルは次の図のように512バイト単位のブロックで分割されている

ことになります。(次の図は正確なものではなく、実際にはもっと複雑な層になっています。)

ブロックデバイスとファイル

ブロックデバイスドライバーがアクセスするブロックのことをここでは物理ブロックとします。

このため、ファイルシステムもブロック単位でファイルを扱うことになります。しかし、

ファイルシステムでは、もう少し大きなくくりでブロックを扱うことができます。これをここでは

論理ブロックとします。ファイルシステムが扱う論理ブロックの最小単位は、

物理ブロック単位となります。つまり論理ブロックの最小サイズはここでは512バイトとなります。

また、今回パソコンにLinuxをインストールしていますので、最大はページサイズの4096バイト

となります。このように、ファイルシステムでは論理ブロックのサイズを512バイトから4096バイト

までの大きさで扱うことができます。(もちろん512バイトの倍数となりますが、通常ブロックの

管理のしやすさから512の倍数かつ2の乗数サイズを扱います。)

ファイルシステムから見たブロックサイズ

このように、ファイルシステムはユーザーが指定したファイルのデータが記録媒体のどこに

格納されているのかを論理ブロックで答えを出すことが主な役割となります。

そして、ファイルの書き込み時・ディレクトリ作成時やシンボリックリンクなどの作成時に

記録媒体上の空いているブロックをファイルに割り当てます。

補足 カーネルが管理しているブロックサイズ

ファイルシステムが管理する論理ブロックサイズとは別に、カーネル自体が

別に管理しているブロックサイズがあります。このブロックサイズはファイル

システムのブロックサイズとは関係なくvmstatなどのセクター(ブロック)

の計算に使用されています。旧来カーネルが扱うブロックサイズは512

バイトでしたが、現在では1024バイトになっています。



色々なファイルシステム

このように、ファイルシステムはファイルの作成・書き込み/読み込みやディレクトリの

作成、拡張ファイルアトリビュートの書き込み/読み込みなどが行われたときに、

記録媒体上のブロックを指定して割り当てたり、ユーザーが要求しているデータが

格納されているブロックを探していることがわかりました。



ブロックを効率的にどうやって割り当てるのか、また目的のブロックをどうやって探す

のかという方式の違いで、今までいろいろなファイルシステムが考え出されてきました。

また、ネットワーク越しにファイルを操作したり、データベース向けに特化したファイル

システムも考案されてきました。



Linuxで採用されているファイルシステムについてどのようなものがあるのか見ていき

ましょう。



いっぱいありますので、適当に読み流して頂ければと思います。

このサイトを読み終わった後に、興味がありそうなファイルシステムの実装について

見ていく参考になればと思います。

通常のファイルシステム

次の表は通常のブロックデバイスを対象にしたファイルシステムについての分類したものと

なります。

通常のファイルシステム
ファイルシステム 説明
9P Plan 9ファイルシステムです。ベル研究所で開発されたネットワークファイルシステムとなります。
ADFS Advanced Disc Filing Systemの略となります。Acornコンピューター株式会社が開発したファイルシステムです。元々のバージョンはファイル名が7文字までで、ディレクトリ名が1文字、ディレクトリには31個のファイルしか扱うことができませんでした。後に10文字のファイル名と47個のファイルを扱えるようになっています。
AFFS Amiga Fast File Systemの略となります。Amiga社がAmigパーソナルコンピューター用に開発したファイルシステムです。Amiga Old File System (OFS)の頃は信頼性の無い不安定なメディアがあったため、1セクターごとに24バイトの領域をとってデータの安全性を確保していました。しかし、ハードディスクのような高速なメディアでは不要な24バイトの領域がボトルネックとなっていたため、これを削除して高速化しました。
BFS(befs) Be File Systemです。BFSはもともBeOS用に開発された、64ビットに対応したジャーナリングファイルシステムです。
BFS Boot File Systemです。UnixWareで使われていたブート時にファイルを格納するためのファイルシステムで、UNIX System Vで導入されましたファイルシステムとなります。
BTRFS B-tree File Systemです。BTRFSはコピーオンライト(複製要求があったときに即時にコピーはせず、書き込みが発生したときに初めてコピーを生成する)に対応したファイルシステムです。
CRAMFS Compressed ROM File Systemです。リードオンリーで、主に組み込み向けに使用されます。圧縮されたROMファイルイメージをページ(RAM)に展開せず圧縮したまま置いて読み込むことができます。initrdイメージやインストールイメージにcramfsを使っているディストリビューションもあります。
eCrypt Enterprise Cryptographic File Systemです。POSIX準拠の暗号化ファイルシステムです。
EFIVARFS sysファイルシステムではやりとりできない1024バイト以上のEFI変数を扱うためのファイルシステムです。
EXOFS Extended Object File Systemです。格納するデータをオブジェクトとして扱う、オブジェクトストレージとなります。
Ext2 Second Extended File Systemです。Ext3が開発される前のLinuxのデフォルトファイルシステムでした。現在ではフラッシュストレージ(SDカードやUSBフラッシュドライブ)などに使用されています。このサイトで見ていくのがこのファイルシステムです。
Ext3 Third Extended File Systemです。多くのディストリビューションでデフォルトのファイルシステムとなっていました。Ext2にジャーナリング機能を追加し、より信頼性のあるファイルシステムとなっています。
Ext4 Forth Extended File Systemです。さまざまなディストリビューションでデフォルトのファイルシステムとして採用されています。Ext3の安定性を高め、更に機能を追加したファイルシステムとなります。大きなファイル(1 EiB)への対応や、エクステント、ブロックの遅延割り当て、ジャーナリングのチェックサムなどの機能が追加されています。
F2FS Flash-Friendly File Systemです。SSD、eMMCやSDカードなどのNANDフラッシュメモリー向けのファイルシステムです。ログ構造化ファイルシステムをベースに、スノーボール効果などを改善したファイルシステムとなります。
FAT File Allocation Tableの略です。マイクロソフトコーポレーションが開発したファイルシステムです。当初フロッピーディスク用にFATが開発され後にハードディスク用に拡張されています。一般的にFAT12がフロッピーディスク用でFAT16やFAT32がハードディスクなどの比較的容量の大きいストレージに使用されています。
FreeVxFS VERITAS File Systemと互換性があるファイルシステムです。VERITASファイルシステムはUnixWareの標準ファイルシステムで、エクステントに対応しています。
HFS アップル株式会社が開発したHierarchical File Systemです。フロッピーやハードディスクなどのディスクドライブ用のファイルシステムです。かつてMac OS標準ファイルシステムでした。
HFS Plus HFSを拡張したファイルシステムです。OS XやiPodに採用されているファイルシステムです。大きなファイルへの対応やユニコードに対応しています。
HostFS Host File Systemです。ホストのファイルシステムにアクセス可能な仮想UML(User Mode Linux)ファイルシステムです。
HPFS High Performance File Systemです。OS/2用に開発され、255文字のファイル名や断片化が発生しにくいブロック割り当て、エクステント対応、ディレクトリ割り当てにB+木を採用したなどの改良を行ったファイルシステムです。
HPPFS Honeypot procfsです。UML(User Mode Linux)ホストのprocを読み出すためのファイルシステムとなります。
ISOFS ISO 9660で定められた主にCDなどの光ディスクメディアに使用されているファイルシステムです。
JFFS Journaling Flash File Systemです。主にNORフラッシュメモリーデバイスに使用するログ構造化ファイルシステムです。
JFFS2 Journaling Flash File System version2です。JFFSの組み込みシステム向けのバージョンとなります。
LogFS 大きなフラッシュメモリーに使用するログ構造化ファイルシステムです。
MINIX FS 教育用OS MINIXで使用されているファイルシステムです。
NILFS2 New Implementation of Log-structured File System version 2です。NTTサイバースペース研究所が開発した、ログ構造化ファイルシステムです。
NTFS New Technology File Systemです。マイクロソフトコーポレーションが開発したファイルシステムで、Windows NT 3.1からデフォルトのファイルシステムとして使用されています。
OMFS Optimized MPEG File Systemです。SonicBlue株式会社が開発したもので、エクステントに対応したファイルシステムでReplayTV DVRとRio Karma MP3プレイヤー用に使うファイルシステムです。
QNX4FS/QNX6FS QNX4とQNX6 OSで使われているエクステントに対応したファイルシステムです。
RAMFS メモリー上のファイルシステムです。通常のファイルシステムとは違い、書き出すデバイスがありません。通常のブロックデバイス上のファイルシステムでは、書き込みを行うとそのデータのページは必要なければ解放されますが、RAMFSでは書き出すデバイスが無いため書き込みを行っても書き込みデータのページは解放されずキャッシュされたままとなります。
ReiserFS 初めてLinuxカーネルに採用されたジャーナリングファイルシステムです。いくつかのディストリビューションでデフォルトファイルシステムとなっています。
ROMFS リードオンリーのファイルシステムで、主にインストールディスクの初期RAMディスクとして使用されています。
SquashFS リードオンリーでファイルなどを圧縮して格納するファイルシステムです。
SYSVFS System V File Systemです。System V互換のファイルシステムとなります。
UBIFS Unsorted Block Image File Systemです。NANDフラッシュメモリーデバイス向けのファイルシステムとなります。
UDF Universal Disk Formatです。ISO/IEC 13346で定義されていて、主にDVDなどの光学メディアのフォーマットに使用されています。
XFS SGI株式会社が開発した高性能な64ビットジャーナリングファイルシステムです。


ネットワーク/分散ネットワークファイルシステム

ネットワークでつながれたコンピューター上のディスクを扱うときに使用するファイルシステムです。

ネットワーク/分散ネットワークファイルシステム
ファイルシステム 説明
AFS Andrew File Systemです。AFSは分散ネットワークファイルシステムで、認証されたいくつかのサーバーをあたかも1つのファイルシステムとして運用することができます。
Ceph Ceph File Systemです。POSIX準拠の分散ネットワークファイルシステムです。データをファイルとしてではなくオブジェクトとして扱う、分散オブジェクトストレージとなります。
CIFS Common Internet File Sysmteです。さまざまなコンピューターがネットワーク越しに、ファイルを共有できるようにしたネットワークファイルシステムとなります。マイクロソフトのSMB(Server Message Block)プロトコルをベースに作られています。
Coda カーネギーメロン大学で開発された分散ネットワークファイルシステムです。サーバーと接続が切れた場合でも、ファイル操作を継続できるように設計されています。
DLM Distributed Lock Manager File Systemです。共有ファイルをアクセスするときにロックして同期をとる分散ネットワークファイルシステムです。DLMはOCFS2の機能が必要となります。
GFS2 Global File System 2です。コンピュータークラスター用のファイルシステムとなります。クラスターコンピューターが共有ファイルを同時に使用することができます。
NCPFS Network Control Protocol File Systemです。Novell株式会社がNetWare向けに開発したNCPプロトコルを利用するネットワークファイルシステムです。
NFS Network File Systemです。元々はSun Microsystems株式会社で開発されたネットワークファイルシステムプロトコルで通信を行うネットワークファイルシステムです。ネットワークファイルシステムプロトコルはRFCで定義されています。
OCFS2 Oracle Cluster File System 2です。オラクルコーポレーションが開発したエクステントに対応したクラスターファイルシステムです。


疑似ファイルシステム

ライトバックするブロックデバイスを持たず、メモリー上に疑似的なファイルシステムを展開します。

疑似ファイルシステム
ファイルシステム 説明
Configfs カーネルオブジェクトの作成や設定や削除をファイル操作で行うことができる疑似ファイルシステムです。ユーザー空間からカーネルオブジェクトを操作できます。通常/configにマウントします。
Debugfs カーネルのデバッグ用に開発された疑似ファイルシステムです。procのようなファイルシステムとは違って、たくさんのデバッグデータをユーザー空間から参照することができます。受け渡すデータのフォーマットも自由です。
HUGETLBFS HUGE TLB File Systemです。データベースアプリケーションなどが大きなサイズのファイルを扱うときに、大きなサイズのTLB(Translation Lookaside Buffer)を使ってキャッシュ効率を上げる(つまり大きなサイズのページを使ってTLBのキャッシュミスを減らします)ときに使用する疑似ファイルシステムです。
OpenPROMFS PROM(Programmable ROM)のデータにアクセスするための疑似ファイルシステムです。
procfs いわゆるprocファイルシステムです。カーネルの内部データにアクセスすることができます。
pstore Persistent Storageです。通常sysファイルシステムの/sys/fs/pstoreにマウントします。システムをリブートさせたときなどに記憶させたい情報をデバイスに記録するための汎用インターフェースです。
sysfs カーネルのサブシステム、デバイス、カーネルモジュールの情報が/sys以下の階層に体系立てて配置される疑似ファイルシステムです。ユーザー空間からカーネルオブジェクトにファイルシステム操作でアクセスすることができるファイルシステムです。


その他ファイルシステム

ここではFUSEについてとなります。

その他ファイルシステム
ファイルシステム 説明
FUSE File system in USEr spaceの略です。FUSEを利用することで、ユーザー空間で動作するファイルシステムを実装することができます。ツイッターファイルシステムはFUSEを利用して作成しています。


次のステップ

ここまでで、大雑把にファイルシステムについてなんとなく知ることができました。

普段パソコンを使っているなかで、ファイルシステムという言葉に出会いますが、

特に気にすることなく使われているかと思います。



私たちは一体どのようにファイルシステムに働きかけているのでしょうか?次に、

ファイルシステムにどうやってアクセスしているのかを見ていきます。

PR 説明

ディベロッパー・エクスペリエンス Linux Ext2ファイルシステム
0から作るLinuxプログラム Linux Ext2ファイルシステムの完全説明版(Kindleのみ)となります。実装するステップ数は36ステップあります。少しずつステップを実装して、実際に動かして学習していきます。ファイルシステムの機能を呼び出すシステムコールの実装から、仮想ファイルシステムが呼び出すExt2ファイルシステムの実装を行っていきます。ファイルシステムの開発体験を通すことで、実際にカーネルが行っているファイルシステムの基礎的な動作を理解することができます。ぜひお試しください!

inserted by FC2 system