Ext4

提供: ArchWiki
2020年12月22日 (火) 13:46時点におけるKgx (トーク | 投稿記録)による版 (→‎ヒントとテクニック: ジャーナリングの無効化の項目を翻訳して追加)
ナビゲーションに移動 検索に移動

関連記事

Ext4 は Linux で一番よく使われているファイルシステム、Ext3 の発展版です。多くの点で、Ext3 から Ext4 になって Ext2 から Ext3 に進んだときよりも大きな改善がされています。Ext3 では Ext2 にジャーナリングを追加したのがほとんどでしたが、Ext4 ではファイルデータを保存するファイルシステムの重要なデータ構造にメスが入っています。その結果、改良された設計、優れたパフォーマンス、信頼性、機能性を備えたファイルシステムが誕生しました (ソース: Ext4 - Linux Kernel Newbies)。

新しく ext4 ファイルシステムを作成

パーティションをフォーマットするには次を実行:

# mkfs.ext4 /dev/partition
ヒント: オプションについては mke2fs(8)man ページを見て下さい。/etc/mke2fs.conf を編集すればデフォルトのオプションを見たり設定できます。

Bytes-per-inode レシオ

mke2fs はひとつの inode に対してディスク上に bytes-per-inode バイト分の領域を作成します。bytes-per-inode レシオを大きくすることで、作成される inode は少なくなります。詳しくは mke2fs(8) を参照。

新しいファイルやディレクトリ、シンボリックリンクなどを作成するとき inode が最低でもひとつは必要です。inode の数が少なすぎると、たとえディスクに空き容量があったとしてもファイルシステムにファイルを作成できなくなります。

ファイルシステムを作成した後に bytes-per-inode レシオや inode の数を変更することはできないため、ファイルが作成できなくなってしまわないように mkfs.ext4 はデフォルトではレシオを低くして inode に対して16384バイト (16Kb) を割り当てます。

しかしながら、1GB 以上のファイルが多数存在してファイルの平均容量がメガバイト級になるような使い方をしているパーティションの場合、inode の数が多すぎてファイルの作成では inode の限界に絶対に達しないということになります。

未使用の inode にも256バイト取られるのでディスク領域の無駄使いです (256バイトという数字は /etc/mke2fs.conf で設定されていますが変更してはいけません)。256バイトでも数百万の inode に換算するとギガバイト単位で容量を無駄にしていることになります。

dfdf -i を実行したときの {I}Use% の値を比較することでどれくらい無駄になっているのか確認できます:

$ df -h /home
Filesystem              Size    Used   Avail  Use%   Mounted on
/dev/mapper/lvm-home    115G    56G    59G    49%    /home
$ df -hi /home
Filesystem              Inodes  IUsed  IFree  IUse%  Mounted on
/dev/mapper/lvm-home    1.8M    1.1K   1.8M   1%     /home

bytes-per-inode レシオを変更するには、-T usage-type オプションを使用します。/etc/mke2fs.conf で定義されたタイプを使用してファイルシステムの利用方法を指定できます。largefilelargefile4 タイプは inode に対してそれぞれ 1 MiB と 4 MiB という大きな容量を割り当てます。以下のように使うことができます:

# mkfs.ext4 -T largefile /dev/device

-i オプションを使って bytes-per-inode レシオを直接設定することもできます。例えば -i 2097152 なら 2 MiB、-i 6291456 なら 6 MiB になります。

ヒント: 逆に、メールやニュースグループのアイテムなどで小さなファイルを何百万も保存するような使い方をする場合、news (ひとつの inode に4096バイトを割り当て) や small (inode 自体のサイズやブロックサイズも小さくする) などのタイプを使うこともできます。
警告: シンボリックリンクを大量に使用する場合、bytes-per-inode レシオを低くするときも inode の数は大きくしてください。シンボリックリンクを作成しても容量は取られませんが inode はひとつ消費されるので、ファイルシステムの inode をあっという間に使い切ってしまう可能性があります。

予約ブロック

デフォルトでは、ファイルシステムの 5% はフラグメントが起こらないように root ユーザー用に予約されます。非特権のプロセスがファイルシステムに書き込めなくなってからも root が使用しているデーモンは正しく動作し続けることができます (詳しくは mke2fs(8) を参照)。

最近の大容量ディスクでは、パーティションを長期保存用のアーカイブとして使う場合、5%は必要以上に大きい値となります。ext4 の開発者である Ted Ts'o による予約ブロックについての議論は このメール を見てください。

パーティションが以下の条件を満たしているならば、ディスク容量を増やすために予約ブロックの割合を減らしても大抵は問題ありません:

  • パーティションがとても大きい (例えば 50GB 以上)。
  • 長期保存用のアーカイブとして使っている、頻繁にファイルを作成したり削除することがない。

ext4 関連のユーティリティを使うときに -m オプションで予約ブロックの割合を指定できます。

ファイルシステムの作成時に予約ブロックを全く作成しないようにするには:

# mkfs.ext4 -m 0 /dev/device

パーティションの予約ブロックの割合を 1.0% に設定するには:

# tune2fs -m 1 /dev/device

findmnt(8) を使うことでデバイスの名前を確認できます:

$ findmnt /the/mount/point

ext2/ext3 から ext4 に移行

ext2/ext3 パーティションを変換せずに ext4 としてマウント

理由

ext4 を完全に変換する案と ext2/ext3 をそのまま使用する案の折衷案として、既存の ext2/ext3 パーティションを ext4 としてマウントする方法があります。

利点:

  • 互換性 (ext2/ext3 としてファイルシステムをマウントできます) – ext4 のサポートがないオペレーティングシステムからもファイルシステムを読み込むことが可能です (例: Windows の ext2/ext3 ドライバー)。
  • パフォーマンスが向上 (ext4 パーティションに完全に変換するのよりは劣ります) – 詳しくは [1][2] を見てください。

欠点:

  • ext4 の機能を全て活用することはできません (マルチブロックアロケーションや遅延アロケーションなどのディスクフォーマットに変更を与える機能は使えません)
ノート: ext4 が比較的新しいファイルシステムということ以外に (このこと自体をリスクと考えることもできます)、この方法を使用することで不利益になることは特にありません。

方法

  1. /etc/fstab を編集して ext4 としてマウントしたいパーティションの 'type' を ext2/ext3 から ext4 に変更してください。
  2. 変更したパーティションを再マウントします。

ext2/ext3 パーティションを ext4 に変換

理由

ext4 の能力を活かすには、非可逆の変換をする必要があります。

利点:

  • パフォーマンスの向上と新機能 – 詳しくは [3][4] を見てください。

欠点:

  • /boot パーティションなど、静的なファイルしか存在しない場合、新機能を使うメリットはありません。さらに、ジャーナリングによって性能がむしろ落ちる可能性もあります。
  • 一方通行 (ext4 パーティションを ext2/ext3 に'ダウングレード'することはできません)。ただしエクステントなどのオプションを有効にしなければ後方互換性を確保できます。

方法

以下の手順は カーネルドキュメントフォーラムスレッド から引用しています。

警告:
  • システムのルートパーティションを変換する場合、再起動時にフォールバックの initramfs が使えるようになっていることを確認してください。また、変換する前に /etc/mkinitcpio.confMODULES 行に ext4 を追加して mkinitcpio -p linux でデフォルトの initramfs を再作成してください。
  • 分割している /boot パーティションを変換する場合、ブートローダーが ext4 からの起動に対応していることを確認してください。
  1. バックアップを行なって下さい。ext4 に変換する ext3 パーティションに存在するデータを全てバックアップします。特に / (root) パーティションをバックアップする場合は、Clonezilla が役に立ちます。
  2. /etc/fstab を編集して ext4 に変換するパーティションの 'type' を ext3 から ext4 に変換してください。
  3. (必要であれば) ライブメディアを起動します。e2fsprogs で変換を行う際はドライブがマウントされていない状態になっている必要があります。ドライブの root (/) パーティションを変換するときは、他のライブメディアから起動して変換するのが一番簡単です。
  4. パーティションがマウントされていないことを確認してください
  5. ext2 パーティションを変換する場合、まずは tune2fs -j /dev/sdxX を root で実行してジャーナルを追加して ext3 パーティションに変換してください。
  6. tune2fs -O extent,uninit_bg,dir_index /dev/sdxX を root で実行 (/dev/sdxX は変換するパーティションのパスに置き換えて下さい、例: /dev/sda1)。ext4 に変換されます (不可逆です)。
  7. root で fsck -f /dev/sdxX を実行。
    • ファイルシステムのチェックを実行しないとファイルシステムを読み込めなくなります。fsck の実行は必須です。グループ記述子のチェックサムエラーが発見されます。これは仕様通りの動作です。-f オプションはファイルシステムに問題がない場合でも強制的にチェックを実行します。-p オプションを使用して自動修復させることもできます (オプションを使用しない場合、エラーに対して入力を求められます)。
  8. 推奨: パーティションをマウントして e4defrag -c -v /dev/sdxX を実行。
    • ファイルシステムが ext4 に変換されても、変換前に書き込まれたファイルは ext4 のエクステントオプションを利用することができません。エクステントオプションは巨大なファイルの操作を高速化しフラグメンテーションを減らしてファイルシステムのチェック時間を短縮します。ext4 を活用するには、全てのファイルをディスクに再書き込みする必要があります。e4defrag を使うことで問題を解決できます。
  9. Arch Linux を再起動してください。

ファイルベースの暗号化を利用する

ノート: カーネル 4.13 以上では Ext4 でルートディレクトリ (/) を暗号化することは禁止されており、エラーが発生します [5] [6]

Linux 4.1 以降、ext4 はファイルベースの暗号化をサポートしています。暗号化したディレクトリツリーでは、ファイルの内容、ファイル名、およびシンボリックリンクのターゲットがすべて暗号化されます。暗号鍵はカーネルキーリングに格納されます。機能の詳細、実装状態の概要、カーネル 4.1 での実践的なテスト結果などが Quarkslab のブログ記事 に書かれています。

使用しているカーネルで CONFIG_EXT4_ENCRYPTION オプションが有効になっていること、e2fsprogs パッケージがバージョン 1.43 以上であることを確認してください。

次に、ファイルシステムが使用しているブロックサイズが暗号化できるブロックサイズであることを確認します:

# tune2fs -l /dev/device | grep 'Block size'
Block size:               4096
# getconf PAGE_SIZE
4096

上記の値が同じでない場合、あなたのファイルシステムは暗号化できません。その場合、絶対に以下の操作を行わないでください

ファイルシステムの暗号化機能フラグを有効化:

# tune2fs -O encrypt /dev/device
警告: 暗号化機能フラグを有効にすると、4.1 未満のカーネルはファイルシステムをマウントできなくなります。

暗号化するディレクトリを作成します:

# mkdir /encrypted

暗号化は空のディレクトリにしか適用できないことに注意してください。暗号化設定 (または「暗号化ポリシー」) は、新しいファイルとサブディレクトリに継承されます。既存のファイルの暗号化はまだサポートされていません。

そして新しい鍵を生成してキーリングに追加します。キーリングをフラッシュする (再起動する) たびに、この手順を繰り返す必要があります:

# e4crypt add_key
Enter passphrase (echo disabled): 
Added key with descriptor [f88747555a6115f5]
警告: パスフレーズを忘れた場合、ファイルを復号化することができなくなります。パスフレーズを設定した後にパスフレーズを変更することもできません。
ノート: パスフレーズに対する辞書攻撃を防ぐために、ランダムなソルトが自動生成され、ext4 ファイルシステムのスーパーブロックに保存されます。パスフレーズとソルトの両方を使用して、暗号鍵が生成されます。暗号化を有効にした ext4 ファイルシステムを複数マウントしている場合、e4crypt add_key はファイルシステムごとにひとつずつ複数の鍵を追加します。鍵とファイルシステムは交換可能ですが、特定のファイルシステムに対しては、そのファイルシステムのソルトを使用する鍵だけを使うのが賢明でしょう。別の鍵を使用した場合、ファイルシステム B がアンマウントされている状態でファイルシステム A のファイルを復号化することができなくなる危険があります。また、e4crypt add_key-S オプションを使用してソルトを指定することもできます。

あなたの鍵の記述子が分かったら鍵がセッションキーリングに含まれていることを確認してください:

# keyctl show
Session Keyring
1021618178 --alswrv   1000  1000  keyring: _ses
 176349519 --alsw-v   1000  1000   \_ logon: ext4:f88747555a6115f5

最後にディレクトリに暗号化ポリシーを設定します (上記の鍵の記述子を使ってください):

# e4crypt set_policy f88747555a6115f5 /encrypted

以上です。キーリングに鍵を追加せずにディレクトリにアクセスしても、ファイル名とその内容は暗号化された状態で表示されます。

ヒントとテクニック

E4rat

E4rat は ext4 ファイルシステム用に作られたプリロードアプリケーションです。E4rat は起動時に開かれるファイルを記録して、アクセス時間が短縮されるようにパーティションにおけるファイルの配置を最適化します。そして起動時の初期段階でファイルを先読みします。E4ratSSD を使っている場合は効果がありません。SSD のアクセス時間はハードディスクと比べると無視できるほどしかないためです。

アクセス時間の更新を無効にする

ext4 ファイルシステムは、ファイルが最後にアクセスされた日時に関する情報を記録し、その記録にはコストがかかります。 noatime オプションを使用すると、ファイルシステムのアクセスタイムスタンプは更新されません。

/etc/fstab
/dev/sda5    /    ext4    defaults,noatime    0    1

これを行うと、アクセス時間に依存するアプリケーションが破損します。考えられる解決策については、atimeoptions を参照してください。

コミット間隔の増加

commit オプションで長い時間遅延を提供することにより、データとメタデータの同期間隔を増やすことができます。

デフォルトの5秒は、電源が失われた場合、最新の5秒の作業が失われることを意味します。 5秒ごとにすべてのデータ/ジャーナルを物理メディアに完全に同期します。 ただし、ジャーナリングのおかげで、ファイルシステムが損傷することはありません。 次の fstab は、 commit の使用法を示しています。

/etc/fstab
/dev/sda5    /    ext4    defaults,noatime,commit=60    0    1

バリアとパフォーマンス

カーネル 2.6.30 から、データの整合性を確保するのに役立つ変更によって ext4 のパフォーマンスは落ちています [7]

多くのファイルシステム (XFS, ext3, ext4, reiserfs) では、fsync やトランザクションコミットの際に書き込みバリアと呼ばれるものをディスクに送信します。書き込みバリアは書き込みの順序を守らせるための仕組みで (いくらか性能面への影響があります)、ディスクの書き込みキャッシュを安全に利用できるようにするためのものです。お使いのディスクにバッテリーが搭載されているような場合は、バリアを無効化することで性能を改善できる場合があります。

書き込みバリアの送信は、マウントオプションに barrier=0 (ext3, ext4, reiserfs の場合) や nobarrier (XFS) を設定することで無効化できます [8]

警告: バリアを無効化すると、電源が失われたときにキャッシュが正しく書き込まれるか保証がされなくなります。これによってファイルシステムの破壊やデータ損失が発生する場合があります。

バリアをオフにしたいときは /etc/fstab の変更したいファイルシステムに barrier=0 オプションを追加してください。例:

/etc/fstab
/dev/sda5    /    ext4    noatime,barrier=0    0    1

ジャーナリングの無効化

警告: ジャーナリングなしでファイルシステムを使用すると、停電やカーネルのロックアップなどの突然のマウント解除の場合にデータが失われる可能性があります。

ext4 を使用してジャーナルを無効にするには、マウントされていないディスクで次のコマンドを使用します。

# tune2fs -O "^has_journal" /dev/sdXN

メタデータチェックサムを有効化する

ファイルシステムが新しい場合でも既存の場合でも、メタデータチェックサムを有効にするにはカーネルモジュールをロードする必要があります。

あなたの使用している CPU が SSE 4.2 をサポートしている場合は、crc32c_intel カーネルモジュールをロードしてください。ハードウェアアクセラレーションによる CRC32C アルゴリズムが有効になります。サポートしていない場合は crc32c_generic モジュールをロードしてください。

対象がルートファイルシステムの場合は /etc/mkinitcpio.confcrypto-crc32c モジュールを追加しなくてはなりません:

MODULES="... crypto-crc32c"

追加したら initramfs を再生成してください。詳しくは Mkinitcpio#イメージ作成とアクティベーションを参照。

メタデータチェックサムを有効にする方法は以下の2つのセクションで説明しています。いずれの場合もファイルシステムはマウントされていない状態でなければなりません。

メタデータチェックサムに関する詳細は ext4 wiki を読んでください。

新しいファイルシステム

新しいファイルシステムで ext4 のメタデータチェックサムを有効化する場合 e2fsprogs が 1.43 以上であることを確認してください。

そして以下のようにファイルシステムを作成します:

# mkfs.ext4 -O metadata_csum /dev/path/to/disk

64bit オプションはデフォルトで有効になります。

その後ファイルシステムは通常通りにマウントできます。

既存のファイルシステム

既存の ext4 ファイルシステムでメタデータチェックサムを有効化するには以下を実行してください。

有効化するにはパーティションがアンマウントされている状態でなければならないため、ルートパーティションで有効化したい場合、USB ライブディストリを起動する必要があります。

まずは以下のコマンドを実行してパーティションのファイルシステムチェックと最適化を行ってください:

# e2fsck -Df /dev/path/to/disk  

そしてファイルシステムを64ビットに変換します:

# resize2fs -b /dev/path/to/disk 

最後にチェックサムを追加してください:

# tune2fs -O metadata_csum /dev/path/to/disk

その後ファイルシステムは通常通りにマウントできます。

機能が有効になっているかどうかは以下のコマンドで確認できます:

# dumpe2fs -h /dev/path/to/disk

パフォーマンスへの影響

こちらのベンチマーク によれば intel モジュールは generic モジュールよりも平均で10倍、最大で20倍高速です。

参照