LinuxファイルシステムとVFS

はじめに

第16章はじめに

このビデオでは、この章で説明するトピックの概要を簡単に説明します。


学習目標
この章の終わりまでに、次のことができるようになります。

基本的なファイルシステム構成を説明できます。
VFSの役割を理解できます。
Linuxで使用できるファイルシステムと、実際のシステムで使用できるファイルシステムを把握できます。
ジャーナリング ファイルシステムが大きく進歩している理由を把握できます。
Linuxにおけるスペシャル ファイルシステムの使用について説明できます。


LinuxファイルシステムとVFS

ファイルシステムの基本
アプリケーション プログラムは、ファイルが保存されている実際のハードウェア上の物理的な場所にアクセスすることなく、ファイルを読み書きします。ファイルシステムは、物理パーティションに使用可能なフォーマットを作成します。

ファイルとその名前は、物理I/Oレイヤーを抽象的に見せたものです。（ファイルシステム レイヤーを無視して）lコマンドラインからディスクに直接書き込むことは非常に危険です。これは、ユーザー アプリケーションではなく、低レベルのオペレーティング システム ソフトウェアによってのみ行われます。例外として、このようなcmdアクセスを実行してファイルシステム関連のレイテンシをスキップする、エンタープライズ データベースなどの非常にハイエンドなソフトウェアがあります。 

UNIXのようなファイルシステムは、ツリー階層を使用します。

ディレクトリにはファイルや他のディレクトリが含まれます。
すべてのパスやノードはルート ディレクトリの下にあります。

複数のファイルシステムを1つのツリー構造にマージできます（通常はマージされます）。Linux は、仮想ファイルシステム レイヤー（VFS）を介して、ファイルシステム ソフトウェアと通信しています。

ローカル ファイルシステムは通常、ディスク上の物理パーティションである、または論理ボリューム マネージャ（LVM）によって制御される論理パーティションである、ディスク パーティション内に存在します。ファイルシステムはネットワークの性質を持つこともできます。その物理的な実体はネットワークを介することでローカル システムの中に完全に隠れます。


inode 
inodeは、場所などを含むファイル属性を記述し保存する、ディスク上のデータ構造体です。すべてのファイルは、個別のinodeに関連付けられています。inodeに保存される情報には次のものが含まれます。

パーミッション
ユーザーとグループの所有権
サイズ
タイム スタンプ（ナノ秒）
- 最終アクセス時間
- 最終変更時間
- 変更時間

inodeのデータ ストレージとディレクトリ ファイルのデータ ストレージ

💡
ファイル名は、ファイルのinodeには保存されず、代わりにディレクトリ ファイルに保存されます。ファイル名は、基本的なオブジェクトであるinodeの、1つの属性に過ぎません。

情報を更新する必要があるため、通常、ファイルに関するすべてのI/Oアクティビティにはファイルのinodeも含まれます。


ハード リンクとソフト リンク
ディレクトリ ファイルは、ファイル名とinodeを関連付けるために使用される特殊な種類のファイルです。ファイル名をinodeに関連付ける（またはリンクする）には、次の2つの方法があります。

複数のハード リンクは単一のinodeを指します。ハード リンクされた複数のファイルはすべて同じファイルシステム上になければなりません。ハード リンクされたファイルのコンテンツを1つの場所で変更しても、他の場所では変更されていない場合があります。
ソフト（またはシンボリック）リンクは、inodeが関連付けられているファイル名をポイントします。ソフト リンクされたファイルは、異なるファイルシステム上にある場合があります。対象のファイルがまだ存在していないかまだマウントされていない場合にも、相手先の無いリンクを作成できます。

ディレクトリ ファイルの内容とinodeの関連付けは、リンクと呼ばれます。追加のリンクは、lnを使用して作成できます。

2つ以上のディレクトリ エントリが同じinode（ハードリンク）を指す可能性があり（かなり一般的）、ファイルは複数の名前で認識され、それぞれがディレクトリ構造内に独自の場所を持っています。ただし、どの名前が使用されていても、inodeはただ1つだけです。

プロセスがパス名を参照すると、カーネルはディレクトリを検索して、対応するinode番号を見つけます。名前がinode番号に変換された後、inodeはメモリにロードされ、後続のリクエストで使用されます。

ハード リンクとソフト リンク


ファイルシステム ツリーの構成
すべてのLinuxシステムは、ルート（/）ディレクトリから分岐する逆向きのツリー階層で表されます。ツリー全体が1つのパーティションの中の1つのローカル ファイルシステムを示す場合もありますが、通常は、複数のパーティション（またはネットワーク ファイルシステム）がマウント ポイントで結合されています。これらには、USBドライブ、光学ドライブなどのリムーバブル メディアも含まれます。

さらに、特定の仮想擬似ファイルシステム（メモリ内にのみ存在する有用な抽象概念）がツリー内にマウントされます。これらには、/proc、/sys、/dev、/tmp、/runも含まれます。

ツリー内にマウントされるものには、実際にはさまざまなファイルシステムがあります。しかし、アプリケーションとオペレーティング システムにとっては、すべてが1つの統一されたツリー構造に見えます。


仮想ファイルシステム（VFS）
Linuxは、最新のすべてのオペレーティング システムと同じ様に、仮想ファイルシステム（VFS）を実装しています。アプリケーションがファイルにアクセスする必要がある場合、VFS抽象化レイヤーとやり取りし、すべてのI/Oシステムコール（読み取り、書き込みなど）を特定の実際のファイルシステムに関連した固有のコードに変換します。

したがって、アプリケーションは、特定の実ファイルシステムやそれが存在する物理媒体およびハードウェアを考慮する必要はありません。さらに、ネットワーク ファイルシステム（NFSなど）は透過的に処理できます。

これにより、Linuxは他のどのオペレーティング システムよりも多くのファイルシステムが動作します。この全てのファイルが同等の扱いを受ける属性は、成功の大きな要因でした。

ほとんどのファイルシステムには完全な読み書きのアクセス権がありますが、一部のファイルシステムには読み取りのアクセス権と実験的な書き込みアクセス権しかありません。一部の種類のファイルシステム、特に非UNIXベースのものは、VFSを適用するためにより多くの操作が必要になる場合があります。

vfatなどには、owner/group/world（もしくはother）フィールドに対して個別の読み取り／書き込み／実行のパーミッションがありません。VFSは、この3種類のユーザーに対して、個別にパーミッションを想定する必要があります。この想定は、マウント操作の影響を受ける可能性があります。また、ntfs-3gのような読み取り／書き込みをサポートするカーネル以外のファイルシステムの実装もあります。これは信頼性はありますが、カーネル内のファイルシステムよりもパフォーマンスが低くなります。



利用可能なファイルシステム
Linuxは多くのファイルシステムの種類をサポートし、そのほとんどに完全な読み書きのアクセス権があります。

ext4：Linux ネイティブ ファイルシステム（以前のext2とext3も同様）
XFS：元々SGIが作成した高性能ファイルシステム
JFS：元々IBMが作成した高性能ファイルシステム
Windowsネイティブ：FAT12、FAT16、FAT32、VFAT、NTFS
proc、sysfs、devfs、debugfsを含むメモリのみに常駐する擬似ファイルシステム
NFS、coda、afsなどのネットワーク ファイルシステム
などがあります。

この多くのファイルシステムに対応するという柔軟性は、Linuxが成功する大きな要因でした。ほとんどのファイルシステムには完全な読み書きアクセス権があり、一部のファイルシステムには読み取り専用アクセス権があります。

一般的に使用されるファイルシステムには、ext4、xfs、btrfs、squashfs、nfs、vfatがあります。現在サポートされているファイルシステムのリストは/proc/filesystemsにあります。


ファイルシステムの種類
実行中のLinuxカーネルが現在登録および認識しているファイルシステムの種類のリストを表示する方法は、次のとおりです。

$ cat /proc/filesystems
​iso9660
squashfs
ext3
ext2
ext4
fuseblk
nodev sysfs
nodev proc
nodev tmpfs
nodev debugfs
nodev sockfs
nodev hugetlbfs
nodev fuse
nodev nfsd
....

nodevになっているものは、ストレージ上に存在しないスペシャル ファイルシステムです。追加のファイルシステムは、システムがそれらを使用するパーティションにアクセスしようとした場合にのみ、コードをモジュールとしてロードします。


デモ：ファイルシステム

このビデオでは、システムで利用可能なファイルシステムを確認する方法を示します。


ジャーナリング ファイルシステム
ジャーナリング ファイルシステムは、システム クラッシュまたは異常なシャットダウンから、ほとんどまたはまったく破損することなく、非常に迅速に回復します。これにはさらに多くの操作を行うという代償が伴いますが、追加の機能強化は価値があります。

ジャーナリング ファイルシステムでは、操作はトランザクションにグループ化されます。トランザクションは、アトミックに実行され、エラーなしで終了する必要があります。さもなければ、ファイルシステムは変更されません。トランザクションのログ ファイルは保持されます。エラーが発生した場合、通常は最後のトランザクションのみを調べます。

各ボックスをクリックして展開し、Linuxで自由に利用できるジャーナリング ファイルシステムの詳細をご覧ください。

ジャーナリング ファイルシステム

ext3
ext3 は、以前の非ジャーナリングext2ファイルシステムの拡張です。

ext4
ext4 は、ext3を大幅に強化したものです。機能には、エクステントや48ビットのブロック番号を含み、対応できる最大サイズは16TBです。ほとんどのLinuxディストリビューションでは、かなり長い間、ext4をデフォルトのファイルシステムとして使用しています。

reiserfs
reiserfsは Linuxで使用された最初のジャーナリング実装でしたが、リーダーシップを失い、開発は中止されました。

JFS
JFSはもともとIBMの製品であり、IBMのAIXオペレーティング システムから移植されました。

XFS
XFSはもともとSGIの製品であり、SGIのIRIXオペレーティング システムから移植されました。RHEL 7は、デフォルトのファイルシステムとしてXFSを採用しました。

btrfs
btrfsは最新のジャーナリング ファイルシステムであり、今も急速に開発が進んでいます。SUSEとopenSUSEシステムのデフォルトのファイルシステムです。


スペシャル ファイルシステム
Linuxは、特定のタスクのためにスペシャル ファイルシステムを幅広く採用しています。これらは、さまざまなカーネル データ構造へのアクセス、カーネルの動作調整、特定の機能の実装に非常に役に立ちます。これらのスペシャル ファイルシステムには、sockfsやpipefsなど、マウント ポイントがないものがあることに注意してください。つまり、ユーザー アプリケーションはそれらのファイルシステムとはやり取りしません。しかし、カーネルはVFSレイヤーとコードを利用してそれらを使用します。これらのスペシャル ファイルシステムは、実際には本当のファイルシステムではありません。それらは、ファイルシステムの構造的な抽象化がデータと機能を認識するための有効な手段であると考える、カーネル機能またはサブシステムです。

表：スペシャル ファイルシステム

ファイルシステム　マウント ポイント　目的
rootfs　　なし　　カーネルのロード中に、空のルート ディレクトリを提供
hugetlbfs 　　任意　　拡張ページのアクセスを提供（X86では2または4MB）
bdev　なし　ブロック デバイスに使用
proc　　 /proc　　多くのカーネル構造とサブシステムへの疑似ファイルシステム アクセス
sockfs　　なし　　BSDソケットで使用
tmpfs 　任意 　　スワッピングとサイズ変更を伴うRAMディスク
shm　　なし　　System V IPCの共有メモリとして使用
pipefs　　なし　　パイプに使用
binfmt_misc 　　任意　　さまざまな実行可能形式で使用
devpts 　　/dev/pts 　Unix98擬似端末で使用
usbfs 　/proc/bus/usb　　動的デバイス用のUSBサブシステムで使用
sysfs　 /sys　　デバイス ツリーとして使用
debugfs　　 /sys/kernel/debug　　簡単なデバッグ ファイル アクセスに使用


演習

課題 16.1: tmpfs特殊ファイルシステム

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 16.1: The tmpfs Special Filesystem
tmpfs is one of many special filesystems used underLinux.  Some of these are not really used as filesystems, but just take advantage of the filesystem abstraction. However,tmpfs is a real filesystem that applications can do I/O on.

Essentially,tmpfs functions as a ramdisk; it resides purely in memory.  But it has some nice properties that old-fashionedconventional ramdisk implementations did not have:

1.  The filesystem adjusts its size (and thus the memory that is used) dynamically; it starts at zero and expands as necessary up to the maximum size it was mounted with.
2.  If your RAM gets exhausted,tmpfs can utilize swap space.  (You still can’t try to put more in the filesystem than its maximum capacity allows, however.)
3.tmpfs does not require having a normal filesystem placed in it, such as ext3 or vfat; it has its own methods for dealingwith files and I/O that are aware that it is really just space in memory (it is not actually a block device), and as such areoptimized for speed.
Thus there is no need to pre-format the filesystem with amkfscommand; you merely just have to mount it and use it.

Mount a new instance oftmpfsanywhere on your directory structure with a command like:
$ sudo mkdir /mnt/tmpfs
$ sudo mount -t tmpfs none /mnt/tmpfs

See how much space the filesystem has been given and how much it is using:

$ df -h /mnt/tmpfs

You should see it has been allotted a default value of half of your RAM; however, the usage is zero, and will only start to growas you place files on/mnt/tmpfs.
You could change the allotted size as a mount option as in:

$ sudo mount -t tmpfs -o size=1G none /mnt/tmpfs

You might try filling it up until you reach full capacity and see what happens.  Do not forget to unmount when you are donewith:

$ sudo umount /mnt/tmpfs

Virtually all modern Linux distributions mount an instance of tmpfs at /dev/shm:

$ df -h /dev/shm
Filesystem     Type   Size  Used Avail Use% Mounted on
tmpfs          tmpfs  3.9G   24M  3.9G   1% /dev/shm

Many applications use this such as when they are using POSIX shared memory as an inter-process communication mecha-nism. Any user can create, read and write files in/dev/shm, so it is a good place to create temporary files in memory.

Create some files in/dev/shmand note how the filesystem is filling up with df.

In addition, many distributions mount multiple instances oftmpfs; for example, on a RHEL system:

$ df -h | grep'tmpfs'

tmpfs          tmpfs     7.8G   38M  7.8G   1% /dev/shm
tmpfs          tmpfs     7.8G   18M  7.8G   1% /run
tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup
tmpfs          tmpfs     1.6G  1.2M  1.6G   1% /run/user/42
tmpfs          tmpfs     1.6G   56K  1.6G   1% /run/user/1000

Notice this was run on a system with 16 GB of ram, so clearly you cannot have all these tmpfs filesystems actually using thedefault ̃8GB they have each been allotted!

Please Note
Some distributions (such as Fedora) may (by default) mount/tmp as a tmpfs system; in such cases one has to avoid putting large files in/tmpto avoid running out of memory.  Or one can disable this behavior as we discussed earlier when describing /tmp.


知識チェック

「第16章 - LinuxファイルシステムとVFS」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 16.1
システムで現在サポートされているすべてのファイルシステムのリストを含む、スペシャル ファイルはどれですか？

A. /proc
B. /proc/filesystems
C. /proc/sys

問題 16.2
従来のRAMディスクと比較した場合のtmpfsの利点は何ですか？ 当てはまるものをすべて選択してください。

A. 使用する前にフォーマットする必要はありません
B. 効率的な方法でメモリを消費します
C. ファイルシステムの最大サイズは4GBです
D. RAMとスワップの両方を使用できます

問題 16.3
次のうち、ジャーナリング ファイルシステムではないものはどれですか？

A. xfs
B. jfs
C. ext4
D. vfat

