ext

extは、初期のLinuxで利用されていたファイルシステムの問題点を解決することを目的に作られたLinux用ファイルシステムである。

初期のLinuxは、開発時に参考にされたオペレーティングシステムであるMinixの持つMinixファイルシステムのみを採用していた。このファイルシステムは、ブロックアドレスが16ビット整数しか扱えなかったり、またファイルの最大サイズが64Mバイトであるといった制約を抱えていた。

extは、これを解決すべく開発されたファイルシステムである。


Linux用ファイルシステム(ext)の共通方針

Unixオペレーティングシステムが採用したiノードというアイデアを採用するLinux用ファイルシステムでは、ディバイスへのI/Oを通じたリクエストによって、複数のファイル・ディレクトリへのエントリとリンクを含むリストへアクセスすることを可能とする。

iノード

iノードは、ファイルシステム上で扱われる各ファイルの構成情報(ファイルの種類、アクセス権、所有者、タイムスタンプ、サイズ)と共に、ファイルの実体が置かれたブロックのアドレスを持つ。新たにファイルを追加したり変更を行った場合、iノードへ新たに確保したディスク上のブロックのアドレスを追加したり、あるいは削除したりといったことを行う。

ディレクトリ

Linuxのファイルシステムは木構造を形成し、一つのディレクトリが複数のファイル・サブディレクトリを含む。
ディレクトリは、ファイルがそれ用に特化されたものである。このファイルは、複数のファイル・サブディレクトリへのエントリを持っており、それらのiノード番号とファイル名を持つ。
Linux上のプロセスによってパス名(例:/usr/bin/perl)が指定されると、iノードのファイルはメモリ上にロードされ、そこに含まれる情報を元に次のディレクトリを特定し、iノードをロードする。この動作を繰り返す事によって、目的とするファイルへアクセスする。

リンク

Unixファイルシステムでは「リンク」というアイデアを持っており、Linux用ファイルシステムでもこれを利用することが可能である。リンクには、ハードリンクとソフトリンクの2種類がある。

▼ハードリンク
ファイルやディレクトリを、別の箇所からもアクセスできるようにするための手段である。
ハードリンクは、ファイルシステムによってその仕様に違いがあるが、Linux用ファイルシステムでは、複数のディレクトリから同一のiノードを参照させることによって実現する。

ファイルシステムから別のファイルシステムのiノードを参照することは不可能なので、基本的にファイルシステムを跨いだリンクを張ることができない。

ハードリンクを用いてファイルへ操作した場合、実体となるファイルにその影響は反映される。オリジナルのファイルの削除を行った場合、リンク側は同一iノードを保持しているため、そこから継続してアクセスすることが可能となる。

▼ソフトリンク
ソフトリンクも、ハードリンクと同様に、ファイルやディレクトリを、別の箇所からもアクセスできるようにするための手段である。Linuxでは、シンボリックリンクといわれている。
ソフトリンクはあくまでディレクトリ上のエントリに対するリンクである。ハードリンクのように、同一のiノードを参照するのではなく、リンクが固有のiノードを持ち、特定のファイルシステムに依存しない、オペレーティングシステムがプロセスに対して仮想的に見せるディレクトリのパスに対して参照を行う。

その実装は、オペレーティングシステムによって異なる。
実際に、Windowsであればショートカット、MacOSであればエイリアスと呼ばれており、仕組みは若干異なる。オペレーティングシステム上での実装なので、複数のファイルシステム間を跨いでリンクさせることができる点がメリットとして高い。

ソフトリンクを用いてファイルへ操作した場合、実体となるファイルにその影響は反映される。しかし、ソフトリンクの削除はリンクのみが削除となるため、実態となるファイルにその影響は現れない。逆に、オリジナルのファイル側が削除された場合、リンク側からは参照が行えなくなる。


構築・インストール

ここでは、運用時に新たにファイルシステムを構築するための方法について説明する。
なお、本頁では主流でないextについては割愛し、その後様々な問題点を解決して拡張されたext2、ext3、ext4について説明する。

ext2

ext2は、ext1の持っていた幾つかの問題を解決し、かつよりパワフルであることを目的に開発されたファイルシステムである。
Unixファイルシステムの持つ優れた仕組みを取り入れ、またそれ以外にも様々な工夫を行っている。

ext2の特徴としては、以下が挙げられる。

  • 最大4TBのサイズでファイルシステムの構築が行えるようにした。(extでは2GBであった。)
  →ディスク容量の制約から解放された。
  • ファイル名が最大1012文字まで扱えるよう拡張された。(extでは255文字までであった。)
  →長いファイル名が扱えるようになった。
  • 管理者(root)用にデフォルトで5%の領域を予約した。
  →ディスク容量が限界に達した場合も、管理者は継続して作業が行える
  • ファイルシステム作成時に、論理ブロックサイズを指定できるようにした。(1024,2048,4096 Byte)
  →データ特性に合わせてディスクI/Oの設計が行えるようになった。
  • シンボリックリンクの参照先をiノードに持たせ。(extではデータブロック上であった。)
  →アクセス速度を向上させると共に、ディスク容量の節約を可能とした。
  • リードオンリーでマウントした際にスーパーブロックへ設定するステータス値を工夫した。
  →ファイルチェックを必要最低限に抑えることを可能とした。

ファイルシステムの作成には、コマンド「mke2fs」を用いるのが一般的である。

# mke2fs -b 4096 -c /dev/sdb1

オプション 内容
-b SIZE ブロックサイズをSIZEバイトとする。
-c ファイルシステム作成前に不良ブロックを検査する。
-i SIZE iノードに割り当てる容量をSIZEバイトとする。
-m SEG% 管理者(root)用領域をSEG%とする。
-n 何もしない。

「mke2fs」は内部でコマンド「mkfs.ext2」を利用しており、これを用いても作成は行える。

ext3

ext3は、ext2に幾つかの機能拡張を行ったものである。
ext2からext3へそのままマウントすることも可能であり、またext2と後方互換性も持つためext3の機能を無効にしてアクセスすることも可能となっている。

ext3からの追加機能として、以下が挙げられる。

▼ジャーナリングファイルシステム
ジャーナリングファイルシステムとは、実データとメタデータの間に不整合が起こらないよう工夫されたファイルシステムのことである。

ext2のようなジャーナリングファイルシステム機能を持たないファイルシステムでは、メタデータに対して書き込みを行っている最中に電源切断などの書き込み中断が発生した場合、メタデータの情報が不整合を起こし実データへのアクセス手段を失う事になる。
ジャーリングシステムでは、ファイルへの書き込み要求が発生した場合、メタデータの書き込み前にログをジャーナル領域に書き込むため、メタデータの故障時にも復旧を行うことが可能となる。

ext2に比べて勿論パフォーマンスは低下する。
しかし、クラッシュ時にファイルチェックを行う際に、ジャーナル領域内の確認さえ行えば良いため、効率的な復旧が行える。

▼インディックス
ファイルアクセスにインディックスを用いる事が可能となった。
アルゴリズムにはハッシュドBツリーで、同一ディレクトリ内のファイルアクセスを高速化できる。

ファイルシステムの作成には、コマンド「mke2fs -j」を用いるのが一般的である。

# mke2fs -b 4096 -c -j /dev/sdb1

オプション 内容
-b SIZE ブロックサイズをSIZEバイトとする。
-c ファイルシステム作成前に不良ブロックを検査する。
-i SIZE iノードに割り当てる容量をSIZEバイトとする。
-m SEG% 管理者(root)用領域をSEG%とする。
-n 何もしない。

「mke2fs -j」は内部でコマンド「mkfs.ext3」を利用しており、これを用いても作成は行える。

ext4

ext4は、ext3の問題点を解決する様々なアイデアが取り込まれたファイルシステムである。
しかし、ext3とは互換性がなく、ext4の拡張機能を用いた場合はext3への後方互換性が失われる。

ext4からの追加機能として、以下が挙げられる。

  • 最大1EBのサイズでファイルシステムの構築が行えるようにした。
  →ディスク容量の制約から解放された。
  • 最大16TBのサイズのファイルを扱えるようにした。
  →データサイズの制約から解放された。
  • 物理ブロックの連続した領域(エクステント)を扱える新たな概念を導入した。
  →巨大ファイルのパフォーマンス向上とフラグメンテーションの発生を低減した。
  • 特定のファイルに対してディスク空き容量を連続して予約できるようにした。
  →メディアストリーミングやデータベースのパフォーマンス向上。
  • データブロックをサイズに応じて決定するようにした。
  →フラグメンテーションの発生を低減した。
  • 同一ディレクトリ上へ配置できるサブディレクトリを無制限に追加できるようにした。
  →サブディレクトリ数の制限から開放された。
  • ジャーナルデータに対してチェックサムを追加した。
  →ジャーナリングファイルシステムの信頼性を高めた。
  • オンライン中にデフラグが行えるようにした。
  →I/Oのパフォーマンスが向上した。
  • 削除に対するフールプルーフを強化。
  →誤って削除したデータを容易に復旧できるようになった。
  • ファイルチェック(fsck)を高速化した。
  →ファイルチェックの煩わしさから開放された。
  • タイムスタンプをナノ単位化し、扱える日付をさらに拡張した。
  →タイムスタンプ管理をより柔軟化。

ファイルシステムの作成には、コマンド「mkfs.ext4」を用いる。

# mkfs.ext4 /dev/sdb1

オプション 内容
-b SIZE ブロックサイズをSIZEバイトとする。
-c ファイルシステム作成前に不良ブロックを検査する。
-i SIZE iノードに割り当てる容量をSIZEバイトとする。
-m SEG% 管理者(root)用領域をSEG%とする。
-n 何もしない。


設定・調整

ext系ファイルシステムは、以下のような構造をとる。

linux_04.gif

スーパーブロックの情報は非常に重要であるため、複数のセクタに配置されるようブロックグループを形成する。

設定の確認

作成したextフォーマットの状態は、コマンド「mke2fs -n」にて確認が行える。
(※アンマウントしておく必要がある。)

# mke2fs -n /dev/sdb1

また、コマンド「dumpe2fs」を実行すれば、各スーパーブロックの状態の確認が行える。

# dumpe2fs /dev/sda1
dumpe2fs 1.41.9 (22-Aug-2009)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          5c57dab6-fb41-41c3-9e4d-038ea25c9f30
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
・・・(略)

チェックと修復

ファイルシステムの整合性は、定期的にチェックする必要がある。
読み取り専用でのマウント、もしくはアンマウントして、コマンド「fsck」を実行する。

# e2fsck -f /dev/sdb1

Linuxの起動時のマウントが行われていないタイミングに「fsck」を実施することもできる。

# shutdown -F -r now

調整

ファイルシステムのパラメータ等の調整は、コマンド「tune2fs」を用いる。
5%割り当てられている管理者用の予約領域を無くす。

# dumpe2fs /dev/sdd1
dumpe2fs 1.41.9 (22-Aug-2009)
・・・(略)
Reserved block count:     24575
・・・(略)
# tune2fs -m 0 /dev/sdd1
tune2fs 1.41.9 (22-Aug-2009)
Setting reserved blocks percentage to 0% (0 blocks)
# dumpe2fs /dev/sdd1
・・・(略)
Reserved block count:     0
・・・(略)

オプション 内容
-c COUNT チェックが行われるまでの最大マウント回数
-C COUNT 現在のマウント回数を上書き
-i INTER チェックの間隔
-j ext2をext3へ変換
-m PERT 管理者用の予約領域を無くす
-l スーパーブロックの内容を表示

不良ブロックの検索には、コマンド「badblocks」を用いる。

# badblocks /dev/sdd1


マウント

構築されたファイルシステムのマウント方法については、別ページ「Linuxのファイルシステム」を参照して頂きたい。



参考:

  • 最終更新:2009-12-13 15:57:38

このWIKIを編集するにはパスワード入力が必要です

認証パスワード