ext4・ext3・ext2 を解説。
Linux のファイルシステムとは何か、ディスク上にファイルをどう配置するか、ジャーナルが何を守るのか、今日重要な機能と上限、そして Mac や Windows PC で ext4 ディスクを開く方法。
最終確認日
ext2・ext3・ext4 とは
ext2・ext3・ext4 は、2 番目・3 番目・4 番目の拡張ファイルシステム(extended file system)です。Linux が 30 年以上にわたって自分のディスクに使ってきた形式です。ファイルシステムは、ファイル・フォルダ・名前・アクセス権・日時をディスク上にどう配置するかを決め、その形式を知っているコンピュータなら再び見つけられるようにします。
いま出会うのは主に ext4 です。Debian、Ubuntu、Raspberry Pi OS はディスクを ext4 でフォーマットし、Linux サーバのデータディスクでも標準的な選択で、Google は 2010 年に Android スマートフォンを ext4 に移行しました。Linux で用意された USB ドライブや SD カードは、ほぼ間違いなく ext4 です。
この 3 つは別々の形式ではなく、ひとつの家族です。各世代は前の世代のディスク上の構造を受け継いで拡張してきました。そのため現在の Linux カーネルは、3 つすべてをひとつの ext4 ドライバで読み書きします。
簡単な歴史
- 1992
ext(拡張ファイルシステム)
Rémy Card が Linux 0.96c のために作成。Linux が最初に使っていた Minix ファイルシステムは、ディスクサイズやファイル名の上限がすでに小さすぎたため、その置き換えでした。
- 1993
ext2
1993 年 1 月、Linux 0.99 向けの再設計。BSD の Fast File System の考え方を取り入れ、ディスクをブロックグループに分け、アクセス・変更・修正の時刻を分けて記録します。その後 1990 年代を通じて Linux の標準でした。
- 2001
ext3 がジャーナルを追加
Stephen Tweedie の ext3 が 2001 年 11 月の Linux 2.4.15 でメインラインカーネルに入ります。構造は ext2 と同じなので、ext2 のディスクはジャーナルを追加するだけで ext3 になり、クラッシュ後にディスク全体を長時間検査する必要がなくなりました。
- 2006
ext4 の開発開始
Theodore Ts’o が 2006 年 6 月 28 日に計画を発表。クラスタファイルシステム Lustre 向けに開発された拡張を土台にしています。開発版の ext4dev が Linux 2.6.19 に登場します。
- 2008
ext4 が安定版に
2008 年 12 月 25 日にリリースされた Linux 2.6.28 で、エクステント、64 ビットのブロック番号、遅延割り当て、ナノ秒単位のタイムスタンプが加わります。
- 2013–2021
チェックサム、暗号化、大文字小文字
その後のカーネルで、インラインデータ(3.8)、メタデータのチェックサム(3.18)、暗号化(4.1)、大文字小文字を区別しないフォルダ(5.2)、verity(5.4)、fast commit(5.10)、orphan file(5.15)が追加されました。
ext4 のディスク構造
ブロック。ext4 は領域をブロック単位で割り当てます。通常は 4 KiB で、サイズはフォーマット時に 1 KiB から 64 KiB の範囲で決まります。ディスクがインラインデータを使っていない限り、1 バイトのファイルでもブロックを 1 つ丸ごと使います。
ブロックグループ。ディスクはブロックのグループに分けられます。4 KiB ブロックなら 1 グループ 32,768 ブロック、つまり 128 MiB です。各グループには使用中のブロック用と iノード用の 2 つのビットマップと、iノードテーブルの一部があります。ファイルのデータを iノードの近くに置けば、ディスクのヘッドの移動が減ります。flex_bg 機能は複数のグループのビットマップと iノードテーブルをまとめ、大きなファイルがグループの境界をまたいで一続きに置けるようにします。
スーパーブロック。ディスクの先頭 1 KiB の余白の後に置かれ、ファイルシステムの大きさ、ブロックサイズ、使っている機能、正常にアンマウントされたかどうかを記録します。複数のブロックグループにコピーがあるため、スーパーブロックが壊れてもバックアップから復元できます。
iノード。ファイルとフォルダはそれぞれ 1 つの iノードを持ち、標準では 256 バイトです。所有者、アクセス権、タイムスタンプ、サイズ、データの場所など、名前以外のすべてを保持します。iノードの数はフォーマット時に決まるので、小さなファイルでいっぱいのディスクは、空き容量があっても iノードが尽きることがあります。
フォルダ。フォルダは名前を iノード番号に対応づける特別なファイルです。名前は最大 255 バイトです。小さなフォルダは単純な一覧で、大きなフォルダにはハッシュ木(dir_index、「htree」)の索引が付くため、10 万件の中から 1 つの名前を探すのも全件走査ではなく数ブロックの読み込みで済みます。
ブロックマップではなくエクステント。ext2 と ext3 はファイルのブロックを 1 つずつ記録します。iノード内の 12 個の直接ポインタ、次にポインタで埋まったブロック、そのブロックへのポインタ、さらにそのポインタへのポインタです。ext4 は範囲を記録します。エクステントは「ここから何ブロック」を表し、1 項目で最大 32,768 ブロック(4 KiB ブロックで 128 MiB)を扱えます。4 つのエクステントは iノード自体に収まり、より長く断片化したファイルには最大 5 段のエクステント木が作られます。大きな連続したファイルは、数千ではなく数個の項目で表されます。
小さなファイルは iノードの中に置けます。inline_data 機能を使うと、ファイルの最初の 60 バイトまでが iノード自体に、少し多めなら拡張属性の領域に保存され、ブロックをまったく使いません。
ジャーナルが守るもの
ファイルシステムの変更は 1 回の書き込みでは終わりません。ファイルを作るだけでも、ビットマップ、iノード、フォルダ、グループ記述子のカウンタに触れます。その書き込みの途中で電源が落ちると、ディスクは中途半端な状態で残ります。ext2 ではそれを知るにはディスク全体を e2fsck で検査するしかなく、大きなディスクでは長い時間がかかりました。
ext3 と ext4 はジャーナルを持ちます。ディスク上の予約領域(通常は iノード 8)で、変更は実行される前にここへ書かれます。変更は 3 段階で進みます。まず新しいブロックがジャーナルに入ります。次にコミットレコードがトランザクションの完了を示します。その後で初めてブロックが本来の場所に書かれます。これがチェックポイントです。どの時点で電源が落ちても、次のマウント時にジャーナルが再生され、コミットまで届いたトランザクションは再適用され、コミットのないものは破棄されます。ファイルシステムは数秒で整合した状態に戻ります。
| モード | ジャーナルを通るもの | クラッシュ後 |
|---|---|---|
data=ordered(既定) | メタデータのみ。ただしファイルのデータは、それを指すメタデータがコミットされる前に書かれます。 | 構造は整合しています。その瞬間に書き込み中だったファイルには古いデータが残ることがあります。 |
data=journal | メタデータとファイルのデータ。 | 最も安全で最も遅いモード。コミットまで届いたデータは残ります。 |
data=writeback | メタデータのみで、データの順序付けなし。 | 構造は整合していますが、最近変更したファイルに古い内容が見えることがあります。 |
ジャーナルはバックアップではありません。ファイルシステムの構造を守り、コミットされたものを保証しますが、途中だった変更を取り戻したり、故障しかけのディスクから守ったりはしません。ext4 はfast commit(Linux 5.10)も書けます。完全なコミットの合間に、変更されたメタデータだけの小さなレコードを書くことで、頻繁な fsync 呼び出しを軽くします。
動作中の Raspberry Pi から抜いたカードは、まさにこのケースです。ジャーナルには本来の場所に書かれていないコミット済みトランザクションが残り、スーパーブロックは「needs recovery」を示します。Linux は次のマウント時に再生しますが、別の場所でカードを読むソフトウェアも再生しなければ、それらのトランザクション以前の状態のファイルが見えてしまいます。
ext2・ext3・ext4 の比較
| ext2 | ext3 | ext4 | |
|---|---|---|---|
| Linux への搭載 | 1993 年(0.99) | 2001 年(2.4.15) | 2008 年(2.6.28) |
| ジャーナル | なし | あり | あり(Linux 5.10 以降 fast commit も) |
| ファイルのブロックの記録方法 | ブロックマップ | ブロックマップ | エクステント |
| 最大ファイルサイズ | 2 TiB | 2 TiB | 16 TiB |
| 最大ファイルシステムサイズ | 16 TiB | 16 TiB | 実用上 1 EiB(64 ビット) |
| タイムスタンプ | 秒単位、2038 年まで(128 バイト iノード) | 秒単位、2038 年まで(128 バイト iノード) | ナノ秒単位、2446 年まで |
| 大きなフォルダの索引 | なし | あり(dir_index) | あり(large_dir で 3 段) |
| メタデータのチェックサム | なし | なし | あり(metadata_csum) |
実際には、新しく作るものはすべて ext4 で問題ありません。新しいディスクで ext3 を選ぶ理由はもうなく、ext2 はジャーナルが要らない場面、たとえば小さな起動用パーティションや、書き込みをできるだけ減らしたいフラッシュメディアで生き残っています。ext3 のディスクはそのまま ext4 に変換できますが、すでにあるファイルは書き直されるまでブロックマップのままです。
実際のディスクで出会う機能
ext のディスクにはバージョン番号の代わりに、スーパーブロックに機能フラグがあり、それぞれ 3 種類のどれかに属します。互換機能は、知らないソフトウェアが無視してかまいません。読み取り専用互換は、そのソフトウェアがディスクを読んでもよいが書いてはいけないことを意味します。非互換は、まったく触れてはいけないことを意味します。この規則のおかげで、古いツールは新しいディスクを壊すのではなく拒否します。
| 機能 | 内容 | Linux での対応 |
|---|---|---|
extent | ブロックマップではなくエクステントでファイルを記録。 | 2.6.28 |
64bit | 32 ビットを超えるブロック番号。16 TiB を超えるファイルシステム用。 | 2.6.28 |
flex_bg | 複数のブロックグループのメタデータをまとめて配置。 | 2.6.28 |
metadata_csum | すべてのメタデータに CRC32C チェックサムを付け、損傷を検出。 | 3.18 |
metadata_csum_seed | チェックサムのシードをスーパーブロックに保存し、UUID を変更可能に。 | 4.4 |
inline_data | ごく小さなファイルを iノード内に保存。 | 3.8 |
encrypt | フォルダ単位でファイルの内容と名前を暗号化。 | 4.1 |
casefold | 名前の大文字と小文字を区別しないフォルダ。 | 5.2 |
verity | 内容をハッシュ木で検証する読み取り専用ファイル。 | 5.4 |
fast_commit | 完全なコミットの合間の小さなジャーナルレコード。 | 5.10 |
orphan_file | 開いたまま削除されたファイルの管理を高速化。 | 5.15 |
どこで出会うか:現在の mke2fs は metadata_csum と 64bit を既定で有効にし、e2fsprogs 1.47 で orphan_file と metadata_csum_seed が加わりました。古いブートローダでも読めるように、これらを無効に戻すディストリビューションもあります。Raspberry Pi OS のイメージは 64bit なしで作られています。Steam Deck は microSD カードを casefold 付きでフォーマットし、Android は encrypt を使っています。
ディスクがどの機能を使っているかは、Linux で sudo dumpe2fs -h /dev/sdX1 を実行し、スーパーブロックの「Filesystem features」の行を見ればわかります。
上限
| ブロックサイズ | ブロックグループ | 最大ファイル | 最大ファイルシステム(32 ビット) | 最大ファイルシステム(64 ビット) |
|---|---|---|---|---|
| 1 KiB | 8 MiB | 4 TiB | 4 TiB | 16 ZiB |
| 2 KiB | 32 MiB | 8 TiB | 8 TiB | 32 ZiB |
| 4 KiB(一般的) | 128 MiB | 16 TiB | 16 TiB | 64 ZiB |
| 64 KiB | 32 GiB | 256 TiB | 256 TiB | 1 YiB |
64 ビットの値は形式として扱える上限で、実際のファイルシステムはエクステントの形式やツールによって約 1 EiB に制限されます。よく問題になる上限は次のとおりです。
- ファイル名・フォルダ名:255 バイト。1 文字に複数バイトを使う文字では、文字数はそれより少なくなります。
- 1 つのファイルへのハードリンク:65,000。つまり 1 つのフォルダに入るサブフォルダは最大 64,998 です。
- タイムスタンプ:ナノ秒精度で、256 バイトの iノードなら 2446 年 5 月まで有効。128 バイトの iノードは 2038 年 1 月で終わります。
- iノード:フォーマット時に固定され、ファイルまたはフォルダ 1 つにつき 1 つ、最大でおよそ 40 億です。
ext4 ディスクの検査と修復
ext ファイルシステムの検査と修復は、Linux の e2fsprogs に含まれる e2fsck の役目です。マウントしていないディスクに対して実行します。マウント中のファイルシステムに実行すると壊れることがあります。
sudo dumpe2fs -h /dev/sdX1 # スーパーブロック:機能、状態、最終検査 sudo e2fsck -fn /dev/sdX1 # 読み取り専用の完全検査:報告のみで何も変更しない sudo e2fsck -f /dev/sdX1 # 修復付きの完全検査:修復ごとに確認 sudo tune2fs -l /dev/sdX1 # 同じスーパーブロックの概要 sudo mkfs.ext4 -L DATA /dev/sdX1 # 新しい ext4 ファイルシステム(パーティションを消去)
/dev/sdX1 は対象のパーティションに置き換えてください。lsblk で一覧できます。正常にシャットダウンしなかった後でも、通常は何もする必要はありません。次のマウントでジャーナルが再生されます。完全な検査が役立つのは、Linux がスーパーブロックにエラーを記録したとき、チェックサムが合わないとき、ディスクが何度もクラッシュした機器に入っていたときです。
ext4 とほかのファイルシステム
| ファイルシステム | クラッシュへの備え | 主な用途 | macOS | Windows |
|---|---|---|---|---|
| ext4 | ジャーナル | Linux、Android | 不可 | 不可 |
| Btrfs | コピーオンライト、データにもチェックサム | Linux(Fedora の既定) | 不可 | 不可 |
| XFS | ジャーナル | Linux サーバ | 不可 | 不可 |
| APFS | コピーオンライト | Mac、iPhone | 可 | 不可 |
| NTFS | ジャーナル | Windows | 読み取りのみ | 可 |
| exFAT | なし | USB ドライブ、SD カード、カメラ | 可 | 可 |
何もインストールせずに Linux、Mac、Windows の間でやり取りするドライブなら、共通して使えるのは exFAT です。ただし Linux のアクセス権、所有者、シンボリックリンク、そして書き込み中にケーブルが抜けたときの保護は失われます。ext4 はそのすべてを保ちますが、Mac と Windows では追加のソフトウェアが必要です。
Mac や Windows で ext4 を読む
macOS は ext ファイルシステムをどれも読めません。Linux のディスクを接続すると、macOS はディスクを読み取れないと表示し、「初期化」「無視」「取り出す」を示します。初期化するとディスクは消去されます。「無視」か「取り出す」を選んでください。
macOS 15.4 以降、Apple の FSKit により、ファイルシステムをカーネルの外で通常のアプリ拡張として動かせるようになりました。Apple 自身の新しいファイルシステムと同じ仕組みで、カーネル拡張もセキュリティ設定の緩和も要りません。そのほかの方法としては、カーネル拡張、FUSE のようなユーザ空間の層、ディスクを渡した Linux 仮想マシンがあります。
Windows 11 では WSL 2 で Linux のディスクをマウントできます。管理者のターミナルで wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 を実行すると、ファイルがエクスプローラーの \\wsl$\ とディストリビューションの /mnt/wsl フォルダに現れます。これは PC に直接つないだディスクでのみ使え、USB ドライブや SD カードリーダーでは使えません。それらは先に USB/IP で WSL に渡す必要があります。
Extent は、macOS 27 で ext2・ext3・ext4 を扱う私たち自身の FSKit ファイルシステムです。Linux のディスクがほかのディスクと同じように Finder に現れます。読み込みは無料で、ext4 への書き込みは Linux と同じくディスクのジャーナルを通ります。シャットダウンせずに Pi から抜いたカードも、ジャーナルをメモリ上で再生して読みます。
よくある質問
ext4 は ext3 より優れていますか?
新しいディスクなら優れています。ブロックマップではなくエクステントでファイルを記録し、最大 16 TiB のファイルとはるかに大きなファイルシステムを扱え、2038 年以降もナノ秒精度のタイムスタンプを保ち、メタデータをチェックサムで守り、より長く断片化の少ない範囲で領域を割り当てます。Linux は ext3 のディスクもいずれにせよ ext4 ドライバで読みます。
Mac で ext4 は読めますか?
標準では読めません。macOS は ext ファイルシステムをどれも読めず、Linux のディスクを初期化、つまり消去するよう提案します。ファイルシステム拡張が必要です。macOS 27 では Extent が Apple の FSKit を使って ext2・ext3・ext4 を Finder にマウントします。
Windows で ext4 は読めますか?
エクスプローラー単体では読めません。Windows 11 では WSL 2 が wsl --mount で直接接続された Linux のディスクをマウントし、そのファイルをエクスプローラーの \\wsl$\ から開けます。USB ドライブや SD カードリーダーは、先に USB/IP で WSL に渡す必要があります。
USB ドライブは ext4 と exFAT のどちらにすべきですか?
追加のソフトなしでどのコンピュータでも使いたいなら exFAT。主に Linux や Raspberry Pi で使う場合や、アクセス権、シンボリックリンク、ジャーナルが大事な場合は ext4 です。ジャーナルは、書き込み中にドライブを抜いてもファイルシステムの整合性を保ちます。
ext4 のディスクを取り出さずに抜くとどうなりますか?
ジャーナルがファイルシステムの整合性を保ちます。コミットまで届いた変更は次のマウント時に再生され、途中だった変更は失われます。それまでの間、スーパーブロックは復旧が必要であることを示します。
自分の ext4 ディスクが使っている機能を調べるには?
Linux で sudo dumpe2fs -h /dev/sdX1 または sudo tune2fs -l /dev/sdX1 を実行し、「Filesystem features」の行を見ます。Mac では、Extent がディスクの詳細に主な機能(ジャーナル、エクステント、64 ビット、チェックサム)を表示します。
ext3 を ext4 に変換できますか?
はい。tune2fs と e2fsck による検査で、フォーマットし直さずにその場で変換できます。すでにディスク上にあるファイルはブロックマップのままで、変換後に書いたファイルだけがエクステントを使います。先にバックアップを取ってください。
ext4 で扱える最大のファイルサイズは?
一般的な 4 KiB ブロックで 16 TiB、64 KiB ブロックなら最大 256 TiB です。最大のファイルシステムは 64bit 機能を使って約 1 EiB です。
Mac で Linux のディスクを、読み込みも書き込みも。
Extent は macOS 27 で ext2・ext3・ext4 を Finder にマウントします。読み込みは無料、ext4 への書き込みは買い切りの購入です。
出典
このページの内容は、以下の資料(英語)で確認しています。