「Ext4」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→参照: add TranslationStatus) |
|||
(7人の利用者による、間の42版が非表示) | |||
8行目: | 8行目: | ||
[[ru:Ext4]] |
[[ru:Ext4]] |
||
[[tr:Ext4]] |
[[tr:Ext4]] |
||
− | [[zh- |
+ | [[zh-hans:Ext4]] |
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ファイルシステム}} |
{{Related|ファイルシステム}} |
||
14行目: | 14行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | Ext4 は Linux で一番よく使われているファイルシステム、Ext3 の発展版です。多くの点で、Ext3 から Ext4 になって Ext2 から |
+ | Ext4 は Linux で一番よく使われているファイルシステム、Ext3 の発展版です。多くの点で、Ext3 から Ext4 になって Ext2 から Ext3 に進んだときよりも大きな改善がされています。Ext3 では Ext2 にジャーナリングを追加したのがほとんどでしたが、Ext4 ではファイルデータを保存するファイルシステムの重要なデータ構造にメスが入っています。その結果、改良された設計、優れたパフォーマンス、信頼性、機能性を備えたファイルシステムが誕生しました (ソース: [http://kernelnewbies.org/Ext4 Ext4 - Linux Kernel Newbies]) |
− | |||
− | ソース: [http://kernelnewbies.org/Ext4 Ext4 - Linux Kernel Newbies] |
||
== 新しく ext4 ファイルシステムを作成 == |
== 新しく ext4 ファイルシステムを作成 == |
||
+ | |||
+ | {{Pkg|e2fsprogs}} を [[インストール]] します。 |
||
パーティションをフォーマットするには次を実行: |
パーティションをフォーマットするには次を実行: |
||
24行目: | 24行目: | ||
# mkfs.ext4 /dev/''partition'' |
# mkfs.ext4 /dev/''partition'' |
||
+ | {{Tip| |
||
− | {{Tip|オプションについては mkfs.ext4 の man ページを見て下さい。{{ic|/etc/mke2fs.conf}} を編集すればデフォルトのオプションを見たり設定できます。}} |
||
+ | *オプションについては {{man|8|mke2fs}} の [[man ページ]]を見て下さい。{{ic|/etc/mke2fs.conf}} を編集すればデフォルトのオプションを見たり設定できます。 |
||
+ | *サポートされている場合は、[[Ext4#メタデータチェックサムを有効化する|メタデータチェックサム]] を有効にすることをお勧めします。 |
||
+ | }} |
||
+ | === Bytes-per-inode 比率 === |
||
− | デフォルトでは、{{Ic|mkfs.ext4}} はやや低めの比率の bytes-per-inode を使って、作成される inode の定量を計算します。容量が 750GB 以上のパーティションではこれだと inode 番号が大きくなりすぎて、ディスク容量の無駄になります。比率は {{Ic|-i}} オプションで直接設定することができます。1/6291456 なら 2TB のパーティションで 476928 の inode になります。 |
||
+ | '''mke2fs''' はひとつの inode に対してディスク上に ''bytes-per-inode'' バイト分の領域を作成します。''bytes-per-inode'' 比率を大きくすることで、作成される inode は少なくなります。詳しくは {{man|8|mke2fs}} を参照。 |
||
− | ==ext3 から ext4 に移行== |
||
+ | 新しいファイルやディレクトリ、シンボリックリンクなどを作成するとき [[Wikipedia:Inode|inode]] が最低でもひとつは必要です。inode の数が少なすぎると、たとえディスクに空き容量があったとしてもファイルシステムにファイルを作成できなくなります。 |
||
− | ===ext3 パーティションを変換せずに ext4 としてマウント=== |
||
+ | |||
+ | ファイルシステムを作成した後に bytes-per-inode 比率や inode の数を変更することはできないため、ファイルが作成できなくなってしまわないように {{ic|mkfs.ext4}} はデフォルトでは比率を低くして inode に対して16384バイト (16Kb) を割り当てます。 |
||
+ | |||
+ | しかしながら、1GB 以上のファイルが多数存在してファイルの平均容量がメガバイト級になるような使い方をしているパーティションの場合、inode の数が多すぎてファイルの作成では inode の限界に絶対に達しないということになります。 |
||
+ | |||
+ | 未使用の inode にも256バイト取られるのでディスク領域の無駄使いです (256バイトという数字は {{ic|/etc/mke2fs.conf}} で設定されていますが変更してはいけません) 256バイトでも数百万の inode に換算するとギガバイト単位で容量を無駄にしていることになります。 |
||
+ | |||
+ | {{ic|df}} と {{ic|df -i}} を実行したときの {{ic|{I}Use%}} の値を比較することでどれくらい無駄になっているのか確認できます: |
||
+ | |||
+ | {{hc|$ df -h /home| |
||
+ | Filesystem Size Used Avail '''Use%''' Mounted on |
||
+ | /dev/mapper/lvm-home 115G 56G 59G '''49%''' /home}} |
||
+ | {{hc|$ 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 比率を変更するには、{{ic|-T ''usage-type''}} オプションを使用します。{{ic|/etc/mke2fs.conf}} で定義されたタイプを使用してファイルシステムの利用方法を指定できます。{{ic|largefile}} や {{ic|largefile4}} タイプは inode に対してそれぞれ 1 MiB と 4 MiB という大きな容量を割り当てます。以下のように使うことができます: |
||
+ | |||
+ | # mkfs.ext4 -T largefile /dev/''device'' |
||
+ | |||
+ | {{ic|-i}} オプションを使って bytes-per-inode 比率を直接設定することもできます。例えば {{ic|-i 2097152}} なら 2 MiB、{{ic|-i 6291456}} なら 6 MiB になります。 |
||
+ | |||
+ | {{Tip|逆に、メールやニュースグループのアイテムなどで小さなファイルを何百万も保存するような使い方をする場合、{{ic|news}} (ひとつの inode に4096バイトを割り当て) や {{ic|small}} (inode 自体のサイズやブロックサイズも小さくする) などのタイプを使うこともできます。}} |
||
+ | |||
+ | {{Warning|シンボリックリンクを大量に使用する場合は、bytes-per-inode 比率を低くして inode の数量は大きくしてください。シンボリックリンクを作成しても容量は取られませんが inode はひとつ消費されるので、ファイルシステムの inode をあっという間に使い切ってしまう可能性があります。}} |
||
+ | |||
+ | === 予約ブロック === |
||
+ | |||
+ | デフォルトでは、ファイルシステムの 5% はフラグメントが起こらないように root ユーザー用に予約されます。非特権のプロセスがファイルシステムに書き込めなくなってからも root が使用しているデーモンは正しく動作し続けることができます (詳しくは {{man|8|mke2fs}} を参照)。 |
||
+ | |||
+ | 最近の大容量ディスクでは、パーティションを長期アーカイブとして使用したり、システム運用に重要でない場合({{ic|/home}}など)必要以上に大きな値を設定します。予約ブロックに関する ext4 開発者の Ted Ts'o の意見は [https://www.redhat.com/archives/ext3-users/2009-January/msg00026.html このメール] を、このトピックに関する一般的な背景は [https://superuser.com/questions/1256074/how-much-space-to-leave-free-on-hdd-or-ssd/1257550#1257550 このスーパーユーザの回答] を参照してください。 |
||
+ | |||
+ | パーティションが以下の条件を満たしているならば、ディスク容量を増やすために予約ブロックの割合を減らしても大抵は問題ありません: |
||
+ | |||
+ | *パーティションがとても大きい (例えば 50GB 以上) |
||
+ | *長期保存用のアーカイブとして使っている、頻繁にファイルを作成したり削除することがない。 |
||
+ | |||
+ | ext4 関連のユーティリティを使うときに {{ic|-m}} オプションで予約ブロックの割合を指定できます。 |
||
+ | |||
+ | ファイルシステムの作成時に予約ブロックを全く作成しないようにするには: |
||
+ | |||
+ | # mkfs.ext4 -m 0 /dev/''device'' |
||
+ | |||
+ | パーティションの予約ブロックの割合を 1% に設定するには: |
||
+ | |||
+ | # tune2fs -m 1 /dev/''device'' |
||
+ | |||
+ | 予約ブロック数をギガバイト単位の絶対サイズに設定する場合は、{{ic|-r}} を使用します。 |
||
+ | |||
+ | # tune2fs -r $((''ngigs'' * 1024**3 / ''blocksize'')) /dev/''device'' |
||
+ | |||
+ | {{ic|''blocksize''}} はファイルシステムのブロックサイズをバイト単位で指定します。これはほとんどの場合 4096 ですが、念のため確認することができます。 |
||
+ | |||
+ | {{hc|# tune2fs -l /dev/''device'' {{!}} egrep '^Block size:'| |
||
+ | Block size: 4096 |
||
+ | }} |
||
+ | |||
+ | {{ic|$(())}} 構文は、数式展開のための構文です。この構文は {{Pkg|bash}} と {{Pkg|zsh}} では動作しますが、{{Pkg|fish}} では動作しません。''fish'' では、このような構文になります。 |
||
+ | |||
+ | # tune2fs -r (math 'ngigs * 1024^3 / blocksize') /dev/''device'' |
||
+ | |||
+ | これらのコマンドは、現在マウントされているファイルシステムに適用することができ、変更は即座に反映されます。デバイス名は {{man|8|findmnt}} で調べることができます。 |
||
+ | |||
+ | # tune2fs -m 1 "$(findmnt -no SOURCE ''/the/mount/point'')" |
||
+ | |||
+ | 現在の予約ブロック数を問い合わせる場合。 |
||
+ | |||
+ | {{hc|# tune2fs -l /dev/mapper/proxima-root {{!}} egrep '^Reserved block count:'| |
||
+ | Reserved block count: 2975334 |
||
+ | }} |
||
+ | |||
+ | これはブロック数なので、これにファイルシステムのブロックサイズを掛けて、バイト数やギガバイト数を得る必要があります。{{ic|1=2975334 * 4096 / 1024**3 = 11.34 GiB}} です。 |
||
+ | |||
+ | ==ext2/ext3 から ext4 に移行== |
||
+ | |||
+ | ===ext2/ext3 パーティションを変換せずに ext4 としてマウント=== |
||
====理由==== |
====理由==== |
||
− | ext4 を完全に変換する案と ext3 をそのまま使用する案の折衷案として、既存の ext3 パーティションを ext4 としてマウントする方法があります。 |
+ | ext4 を完全に変換する案と ext2/ext3 をそのまま使用する案の折衷案として、既存の ext2/ext3 パーティションを ext4 としてマウントする方法があります。 |
'''利点:''' |
'''利点:''' |
||
− | * 互換性 (ext3 としてファイルシステムをマウントできます) – ext4 のサポートがないオペレーティングシステムからもファイルシステムを読み込むことが可能です (例: Windows の ext3 ドライバー) |
+ | * 互換性 (ext2/ext3 としてファイルシステムをマウントできます) – ext4 のサポートがないオペレーティングシステムからもファイルシステムを読み込むことが可能です (例: Windows の ext2/ext3 ドライバー) |
− | * パフォーマンスが向上 (ext4 パーティションに完全に変換するのよりは劣ります) – 詳しくは [http://kernelnewbies.org/Ext4 |
+ | * パフォーマンスが向上 (ext4 パーティションに完全に変換するのよりは劣ります) – 詳しくは [http://kernelnewbies.org/Ext4] や [http://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_fujita.pdf] を見てください。 |
'''欠点:''' |
'''欠点:''' |
||
* ext4 の機能を全て活用することはできません (マルチブロックアロケーションや遅延アロケーションなどのディスクフォーマットに変更を与える機能は使えません) |
* ext4 の機能を全て活用することはできません (マルチブロックアロケーションや遅延アロケーションなどのディスクフォーマットに変更を与える機能は使えません) |
||
+ | {{Note|ext4 が比較的新しいファイルシステムということ以外に (このこと自体をリスクと考えることもできます)、この方法を使用することで不利益になることは特にありません。}} |
||
− | {{Note|Except for the relative novelty of ext4 (which can be seen as a risk), '''there is no major drawback to this technique'''.}} |
||
====方法==== |
====方法==== |
||
− | # {{ic|/etc/fstab}} を編集して ext4 としてマウントしたいパーティションの 'type' を ext3 から ext4 に変更してください。 |
+ | # {{ic|/etc/fstab}} を編集して ext4 としてマウントしたいパーティションの 'type' を ext2/ext3 から ext4 に変更してください。 |
# 変更したパーティションを再マウントします。 |
# 変更したパーティションを再マウントします。 |
||
− | ===ext3 パーティションを ext4 に変換=== |
+ | ===ext2/ext3 パーティションを ext4 に変換=== |
====理由==== |
====理由==== |
||
57行目: | 136行目: | ||
'''利点:''' |
'''利点:''' |
||
− | * パフォーマンスの向上と新機能 – 詳しくは [http://kernelnewbies.org/Ext4 |
+ | * パフォーマンスの向上と新機能 – 詳しくは [http://kernelnewbies.org/Ext4] や [http://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_fujita.pdf] を見てください。 |
'''欠点:''' |
'''欠点:''' |
||
+ | * {{ic|/boot}} パーティションなど、静的なファイルしか存在しない場合、新機能を使うメリットはありません。さらに、ジャーナリングによって性能がむしろ落ちる可能性もあります。 |
||
− | * Ext2Explore による読み取り専用アクセスは Windows から出来ますが、今のところデータを書き込むためのドライバーは存在しません。 |
||
− | * 一方通行 (ext4 パーティションを ext3 に'ダウングレード'することはできません) |
+ | * 一方通行 (ext4 パーティションを ext2/ext3 に'ダウングレード'することはできません) ただしエクステントなどのオプションを有効にしなければ後方互換性を確保できます。 |
====方法==== |
====方法==== |
||
− | 以下の手順は http://ext4.wiki.kernel.org/index.php/Ext4_Howto と https://bbs.archlinux.org/viewtopic.php?id=61602 から引用しています。 |
+ | 以下の手順は [http://ext4.wiki.kernel.org/index.php/Ext4_Howto カーネルドキュメント] と [https://bbs.archlinux.org/viewtopic.php?id=61602 フォーラムスレッド] から引用しています。 |
− | {{Warning|ext4 is backwards-compatible with ext3 until extent and other unique options are enabled. Note, however, that there are fewer benefits to using ext4 if the partition is not fully converted.}} |
||
+ | {{Warning| |
||
− | # '''[[Backup programs|BACK-UP!]]''' Back-up all data on any ext3 partitions that are to be converted to ext4. A useful package for this, especially for / (root) partitions, is [http://clonezilla.org Clonezilla]. |
||
+ | * システムのルートパーティションを変換する場合、再起動時にフォールバックの initramfs が使えるようになっていることを確認してください。また、変換する前に {{ic|/etc/mkinitcpio.conf}} の [[Mkinitcpio#MODULES|MODULES]] 行に {{ic|ext4}} を追加して {{Ic|mkinitcpio -p linux}} でデフォルトの initramfs を再作成してください。 |
||
− | # Edit {{ic|/etc/fstab}} and change the 'type' from ext3 to ext4 for any partitions that are to be converted to ext4. |
||
+ | * 分割している {{ic|/boot}} パーティションを変換する場合、[[ブートローダー]]が ext4 からの起動に対応していることを確認してください。}} |
||
− | # Boot the live medium (if necessary). The conversion process with {{Ic|e2fsprogs}} must be done when the drive is not mounted. If converting one's root (/) partition, the simplest way to achieve this is to boot from some other live medium. |
||
− | # Ensure the partition is '''NOT''' mounted |
||
− | # {{Ic|tune2fs -O extent,uninit_bg,dir_index /dev/sdxX}} を実行 ({{Ic|/dev/sdxX}} は変換するパーティションのパスに置き換えて下さい、例: {{Ic|/dev/sda1}}) |
||
− | # {{Ic|fsck -f /dev/sdxX}} を実行 |
||
− | # 推奨: パーティションをマウントして {{Ic|e4defrag -c -v /dev/sdxX}} を実行 |
||
− | # Arch Linux を再起動してください |
||
+ | # '''[[バックアッププログラム|バックアップ]]'''を行なって下さい。ext4 に変換する ext3 パーティションに存在するデータを全てバックアップします。特に / (root) パーティションをバックアップする場合は、[http://clonezilla.org Clonezilla] が役に立ちます。 |
||
− | {{Note|The user '''MUST''' fsck the filesystem, or it will be unreadable! This fsck run is needed to return the filesystem to a consistent state. '''It WILL find checksum errors in the group descriptors''' -- this is expected. The '-f' parameter asks fsck to force checking even if the file system seems clean. The '-p' parameter asks fsck to 'automatically repair' (otherwise, the user will be asked for input for each error). |
||
+ | # {{ic|/etc/fstab}} を編集して ext4 に変換するパーティションの 'type' を ext3 から ext4 に変換してください。 |
||
− | You may need to run fsck -f rather than fsck -fp.}} |
||
+ | # (必要であれば) ライブメディアを起動します。{{Pkg|e2fsprogs}} で変換を行う際はドライブがマウントされていない状態になっている必要があります。ドライブの root (/) パーティションを変換するときは、他のライブメディアから起動して変換するのが一番簡単です。 |
||
+ | # パーティションがマウントされていないことを確認してください |
||
+ | # ext2 パーティションを変換する場合、まずは {{ic|tune2fs -j /dev/sdxX}} を root で実行して[[ファイルシステム#ジャーナリング|ジャーナル]]を追加して ext3 パーティションに変換してください。 |
||
+ | # {{Ic|tune2fs -O extent,uninit_bg,dir_index /dev/sdxX}} を root で実行 ({{Ic|/dev/sdxX}} は変換するパーティションのパスに置き換えて下さい、例: {{Ic|/dev/sda1}})。ext4 に変換されます (不可逆です) |
||
+ | # root で {{Ic|fsck -f /dev/sdxX}} を実行。 |
||
+ | #* ファイルシステムのチェックを実行しないとファイルシステムを読み込めなくなります。''fsck'' の実行は必須です。グループ記述子のチェックサムエラーが発見されます。これは仕様通りの動作です。{{ic|-f}} オプションはファイルシステムに問題がない場合でも強制的にチェックを実行します。{{ic|-p}} オプションを使用して自動修復させることもできます (オプションを使用しない場合、エラーに対して入力を求められます) |
||
+ | # 推奨: パーティションをマウントして {{Ic|e4defrag -c -v /dev/sdxX}} を実行。 |
||
+ | #* ファイルシステムが ext4 に変換されても、変換前に書き込まれたファイルは ext4 のエクステントオプションを利用することができません。エクステントオプションは巨大なファイルの操作を高速化しフラグメンテーションを減らしてファイルシステムのチェック時間を短縮します。ext4 を活用するには、全てのファイルをディスクに再書き込みする必要があります。''e4defrag'' を使うことで問題を解決できます。 |
||
+ | # Arch Linux を再起動してください。 |
||
+ | == パフォーマンスの向上 == |
||
− | {{Note|Even though the filesystem is now converted to ext4, all files that have been written before the conversion do not yet take advantage of the extent option of ext4, which will improve large file performance and reduce fragmentation and filesystem check time. In order to fully take advantage of ext4, all files would have to be rewritten on disk. Use e4defrag to take care of this problem.}} |
||
− | {{Warning|1=If the user converted their root (/) partition, a kernel panic may be encountered when attempting to boot. If this happens, simply reboot using the 'fallback' initial ramdisk and re-create the 'default' initial ramdisk: {{Ic|mkinitcpio -p linux}}}} |
||
− | == |
+ | === E4rat === |
− | ===予約ブロックの削除=== |
||
+ | [[E4rat]] は ext4 ファイルシステム用に作られたプリロードアプリケーションです。[[E4rat]] は起動時に開かれるファイルを記録して、アクセス時間が短縮されるようにパーティションにおけるファイルの配置を最適化します。そして起動時の初期段階でファイルを先読みします。[[E4rat]] は [[SSD]] を使っている場合は効果がありません。SSD のアクセス時間はハードディスクと比べると無視できるほどしかないためです。 |
||
− | デフォルトでは、ファイルシステムの 5% はフラグメントが起こらないように root ユーザーに予約されます。最近の大容量ディスクでは、パーティションを長期保存アーカイブとして使う場合、5%は必要以上に大きい値となります (詳しくは [http://www.redhat.com/archives/ext3-users/2009-January/msg00026.html このメール] を見て下さい)。パーティションが以下の条件を満たしているならば、ディスク容量を増やすために予約ブロックの割合を減らしても大抵は問題ありません: |
||
+ | === アクセス時間の更新を無効にする === |
||
− | *パーティションがとても大きい (例えば 50GB 以上) |
||
− | *長期保存用のアーカイブとして使っている、頻繁にファイルを作成したり削除することがない |
||
+ | '' ext4 ''ファイルシステムは、ファイルが最後にアクセスされた日時に関する情報を記録し、その記録にはコストがかかります。 {{ic|noatime}} オプションを使用すると、ファイルシステムのアクセスタイムスタンプは更新されません。 |
||
− | 予約ブロックを削減するには tune2fs ユーティリティを使います。次のコマンドは {{ic|/dev/sdXY}} パーティションの予約ブロックの割合を 1.0% に設定します: |
||
+ | {{hc|/etc/fstab| |
||
− | tune2fs -m 1.0 /dev/sdXY |
||
+ | /dev/sda5 / ext4 defaults,'''noatime''' 0 1 |
||
+ | }} |
||
+ | これを行うと、アクセス時間に依存するアプリケーションが破損します。考えられる解決策については、[https://wiki.archlinux.jp/index.php/Fstab#atime_.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3 atimeoptions] を参照してください。 |
||
− | findmnt(8) を使うことでデバイスの名前を確認できます: |
||
+ | === コミット間隔の増加 === |
||
− | findmnt /the/mount/point |
||
+ | {{ic|commit}} オプションで長い時間遅延を提供することにより、データとメタデータの同期間隔を増やすことができます。 |
||
− | === E4rat === |
||
+ | デフォルトの5秒は、電源が失われた場合、最新の5秒の作業が失われることを意味します。 |
||
− | [[E4rat]] は ext4 ファイルシステム用に作られたプリロードアプリケーションです。[[E4rat]] は起動時に開かれるファイルを記録して、アクセス時間が短縮されるようにパーティションにおけるファイルの配置を最適化します。そして起動時の初期段階でファイルを先読みします。[[E4rat]] は [[SSD]] を使っている場合は効果がありません。SSD のアクセス時間はハードディスクと比べると無視できるほどしかないためです。 |
||
+ | 5秒ごとにすべてのデータ/ジャーナルを物理メディアに完全に同期します。 ただし、ジャーナリングのおかげで、ファイルシステムが損傷することはありません。 |
||
+ | 次の [[fstab]] は、 {{ic|commit}} の使用法を示しています。 |
||
+ | |||
+ | {{hc|/etc/fstab|2= |
||
+ | /dev/sda5 / ext4 defaults,noatime,'''commit=60''' 0 1 |
||
+ | }} |
||
− | ==トラブルシューティング== |
||
=== バリアとパフォーマンス === |
=== バリアとパフォーマンス === |
||
+ | {{Warning|バリアを無効化すると、電源が失われたときにキャッシュが正しく書き込まれるか保証がされなくなります。これによってファイルシステムの破壊やデータ損失が発生する場合があります。}} |
||
− | カーネル 2.6.30 から、データの整合性を確保するのに役立つ変更によって ext4 のパフォーマンスは落ちています [http://www.phoronix.com/scan.php?page=article&item=ext4_then_now&num=1]。 |
||
+ | ''Ext4'' はデフォルトで書き込みバリアを有効にします。これにより、書き込みキャッシュの電源が失われた場合でも、ファイルシステムのメタデータがディスク上に正しく書き込まれ、順序付けされることが保証されます。これには、特に ''fsync'' を頻繁に使用するアプリケーションや、小さなファイルを多数作成および削除するアプリケーションの場合、パフォーマンスにコストが伴います。何らかの方法でバッテリーバックアップが行われている書き込みキャッシュを持つディスクの場合、バリアを無効にするとパフォーマンスが安全に向上する可能性があります。 |
||
− | ''Most file systems (XFS, ext3, ext4, reiserfs) send write barriers to disk after fsync or during transaction commits. Write barriers enforce proper ordering of writes, making volatile disk write caches safe to use (at some performance penalty). If your disks are battery-backed in one way or another, disabling barriers may safely improve performance.'' |
||
+ | バリアをオフにしたいときは {{ic|/etc/fstab}} の変更したいファイルシステムに {{Ic|1=barrier=0}} オプションを追加してください。例: |
||
− | ''Sending write barriers can be disabled using the barrier=0 mount option (for ext3, ext4, and reiserfs), or using the nobarrier mount option (for XFS)'' [http://doc.opensuse.org/products/draft/SLES/SLES-tuning_sd_draft/cha.tuning.io.html]. |
||
+ | {{hc|/etc/fstab|2= |
||
− | {{Warning|Disabling barriers when disks cannot guarantee caches are properly written in case of power failure can lead to severe file system corruption and data loss.}} |
||
+ | /dev/sda5 / ext4 defaults,'''barrier=0''' 0 1 |
||
+ | }} |
||
+ | === ジャーナリングの無効化 === |
||
− | バリアをオフにしたいときは {{ic|/etc/fstab}} の変更したいファイルシステムに {{Ic|1=barrier=0}} オプションを追加してください。例: |
||
+ | |||
+ | {{Warning|ジャーナリングなしでファイルシステムを使用すると、停電やカーネルのロックアップなどの突然のマウント解除の場合にデータが失われる可能性があります。}} |
||
+ | |||
+ | ''ext4'' を使用してジャーナルを無効にするには、マウントされていないディスクで次のコマンドを使用します。 |
||
+ | |||
+ | # tune2fs -O "^has_journal" /dev/sdXN |
||
+ | |||
+ | === 外部ジャーナルを使用してパフォーマンスを最適化する === |
||
+ | |||
+ | {{ic|journal_async_commit}} マウントオプションを使用すると、ジャーナリングを大幅に高速化できます。 |
||
+ | |||
+ | {{Note|{{ic|journal_async_commit}} マウントオプションは、デフォルトのマウントオプションである {{ic|1=data=ordered}} と一緒に使うと[https://patchwork.ozlabs.org/patch/414750/ 動作しません]。なので、明示的に {{ic|''ext4_device''}} を別のモードでマウントしてください。{{man|5|ext4|3=data=}} を見てください。}} |
||
+ | |||
+ | 次のコマンドを使用して、ジャーナルで使用する専用デバイスをフォーマットできます: |
||
+ | |||
+ | # mke2fs -O journal_dev /dev/''journal_device'' |
||
+ | |||
+ | {{ic|''journal_device''}} を {{ic|''ext4_device''}} のジャーナルとして割り当てるには、次を使用します。 |
||
+ | |||
+ | # tune2fs -J device=/dev/''journal_device'' /dev/''ext4_device'' |
||
+ | |||
+ | 同時に {{ic|''ext4_device''}} に新しいファイルシステムを作成したい場合は、{{ic|tune2fs}} を {{ic|mkfs.ext4}} に置き換えることができます。 |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === ファイルベースの暗号化を使用する === |
||
+ | |||
+ | Linux 4.1 以降、ext4 はファイル暗号化をネイティブにサポートしています。 [[fscrypt]] の記事を参照してください。 暗号化はディレクトリレベルで適用され、ディレクトリごとに異なる暗号化キーを使用できます。 これは、ブロックデバイスレベルの暗号化である [[dm-crypt]] と、スタック暗号化ファイルシステムである [[eCryptfs]] の両方とは異なります。 |
||
+ | |||
+ | === メタデータチェックサムを有効化する === |
||
+ | |||
+ | ファイルシステムが {{Pkg|e2fsprogs}} で作成されている場合。1.43 (2016) 以降では、メタデータチェックサムがデフォルトで有効になっています。既存のファイルシステムを変換して、メタデータチェックサムのサポートを有効にすることができます。 |
||
+ | |||
+ | CPU が SSE 4.2 をサポートしている場合、{{ic|crc32c_intel}} が有効であることを確認してください。ハードウェアアクセラレーションによる CRC32C アルゴリズム [https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums#Benchmarking] を有効にするために [[カーネルモジュール]] がロードされています。もしそうでなければ、代わりに {{ic|crc32c_generic}} モジュールをロードしてください。 |
||
+ | |||
+ | メタデータチェックサムの詳細については、[https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums ext4 wiki] を参照してください。 |
||
+ | |||
+ | {{Tip|{{ic|dumpe2fs}} を使用して、ファイルシステムで有効になっている機能を確認します。 |
||
+ | # dumpe2fs -h ''/dev/path/to/disk'' |
||
+ | }} |
||
+ | |||
+ | {{Note|ファイルシステムをマウントしないでください。}} |
||
+ | |||
+ | まず、{{ic|e2fsck}} を使用してパーティションをチェックし、最適化する必要があります。 |
||
+ | |||
+ | # e2fsck -Df ''/dev/path/to/disk'' |
||
+ | |||
+ | ファイルシステムを64ビットに変換します。 |
||
+ | |||
+ | # resize2fs -b ''/dev/path/to/disk'' |
||
+ | |||
+ | 最後に、チェックサムサポートを有効にします。 |
||
+ | |||
+ | # tune2fs -O metadata_csum ''/dev/path/to/disk'' |
||
+ | |||
+ | 検証します: |
||
+ | |||
+ | {{hc|# dumpe2fs -h ''/dev/path/to/disk'' {{!}} grep features:|2= |
||
+ | Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent '''64bit''' flex_bg sparse_super large_file huge_file dir_nlink extra_isize '''metadata_csum''' |
||
+ | }} |
||
+ | |||
+ | === 既存のファイルシステムで fast_commit を有効にする === |
||
+ | |||
+ | 5.10 カーネル以降、ext4 では {{ic|fast_commit}} オプションを有効にすることで、パフォーマンスが向上する可能性があります。 |
||
+ | |||
+ | # tune2fs -O fast_commit /dev/''drivepartition'' |
||
+ | |||
+ | 現在の構成または変更を確認するには: |
||
+ | |||
+ | # tune2fs -l /dev/''drivepartition'' | grep features |
||
+ | |||
+ | === 大文字と小文字を区別しないモードを有効にする === |
||
+ | |||
+ | {{Warning|1=GRUB は現在、Ext4 の {{ic|casefold}} 機能をサポートしていません。[https://savannah.gnu.org/bugs/?56897 GRUB bug #56897] を参照してください。 GRUB が読み取る必要があるファイルシステムに対してこの機能を有効にすると、実際にその機能を使用しているディレクトリがない場合でも、{{ic|unknown filesystem}} エラーが発生してシステムが起動できなくなります。}} |
||
+ | |||
+ | Ext4 は大文字と小文字を区別しないモードで使用でき、[[Wine]] で実行されるアプリケーションやゲームのパフォーマンスを向上させることができます。この機能はファイルシステム全体には影響しません。大文字と小文字を区別しない属性が有効になっているディレクトリにのみ影響します。 |
||
+ | |||
+ | まず、ファイルシステムでこの機能を有効にします: |
||
+ | |||
+ | # tune2fs -O casefold ''/dev/path/to/disk'' |
||
+ | |||
+ | これで、任意のディレクトリで大文字と小文字を区別しない[[ファイルのパーミッションと属性#ファイルの属性|属性]]を有効にできるようになります: |
||
+ | |||
+ | $ chattr +F ''/mnt/partition/case-insensitive-directory'' |
||
+ | |||
+ | ディレクトリは空である必要があり、他の場所からサブディレクトリを移動させても、その属性は継承されないことに注意してください。 |
||
+ | |||
+ | == 参照 == |
||
+ | |||
+ | * [https://ext4.wiki.kernel.org/ 公式 Ext4 wiki] |
||
+ | * Ext4 wiki の [https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout Ext4 ディスクレイアウト] |
||
+ | * LWN の [https://lwn.net/Articles/639427/ Ext4 暗号化] 記事 |
||
+ | * ext4 暗号化のカーネルコミット [https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6162e4b0bedeb3dac2ba0a5e1b1f56db107d97ec] [https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8663da2c0919896788321cd8a0016af08588c656] |
||
+ | * [http://e2fsprogs.sourceforge.net/e2fsprogs-release.html e2fsprogs 変更履歴] |
||
+ | * [https://ext4.wiki.kernel.org/index.php/Ext4_Metadata_Checksums Ext4 メタデータチェックサム] |
||
+ | {{TranslationStatus|Ext4|2024-08-28|805843}} |
||
− | # /dev/sda5 / ext4 noatime,barrier=0 0 1 |
2024年8月28日 (水) 18:38時点における最新版
Ext4 は Linux で一番よく使われているファイルシステム、Ext3 の発展版です。多くの点で、Ext3 から Ext4 になって Ext2 から Ext3 に進んだときよりも大きな改善がされています。Ext3 では Ext2 にジャーナリングを追加したのがほとんどでしたが、Ext4 ではファイルデータを保存するファイルシステムの重要なデータ構造にメスが入っています。その結果、改良された設計、優れたパフォーマンス、信頼性、機能性を備えたファイルシステムが誕生しました (ソース: Ext4 - Linux Kernel Newbies)
新しく ext4 ファイルシステムを作成
パーティションをフォーマットするには次を実行:
# mkfs.ext4 /dev/partition
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 に換算するとギガバイト単位で容量を無駄にしていることになります。
df
と df -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
で定義されたタイプを使用してファイルシステムの利用方法を指定できます。largefile
や largefile4
タイプは inode に対してそれぞれ 1 MiB と 4 MiB という大きな容量を割り当てます。以下のように使うことができます:
# mkfs.ext4 -T largefile /dev/device
-i
オプションを使って bytes-per-inode 比率を直接設定することもできます。例えば -i 2097152
なら 2 MiB、-i 6291456
なら 6 MiB になります。
予約ブロック
デフォルトでは、ファイルシステムの 5% はフラグメントが起こらないように root ユーザー用に予約されます。非特権のプロセスがファイルシステムに書き込めなくなってからも root が使用しているデーモンは正しく動作し続けることができます (詳しくは mke2fs(8) を参照)。
最近の大容量ディスクでは、パーティションを長期アーカイブとして使用したり、システム運用に重要でない場合(/home
など)必要以上に大きな値を設定します。予約ブロックに関する ext4 開発者の Ted Ts'o の意見は このメール を、このトピックに関する一般的な背景は このスーパーユーザの回答 を参照してください。
パーティションが以下の条件を満たしているならば、ディスク容量を増やすために予約ブロックの割合を減らしても大抵は問題ありません:
- パーティションがとても大きい (例えば 50GB 以上)
- 長期保存用のアーカイブとして使っている、頻繁にファイルを作成したり削除することがない。
ext4 関連のユーティリティを使うときに -m
オプションで予約ブロックの割合を指定できます。
ファイルシステムの作成時に予約ブロックを全く作成しないようにするには:
# mkfs.ext4 -m 0 /dev/device
パーティションの予約ブロックの割合を 1% に設定するには:
# tune2fs -m 1 /dev/device
予約ブロック数をギガバイト単位の絶対サイズに設定する場合は、-r
を使用します。
# tune2fs -r $((ngigs * 1024**3 / blocksize)) /dev/device
blocksize
はファイルシステムのブロックサイズをバイト単位で指定します。これはほとんどの場合 4096 ですが、念のため確認することができます。
# tune2fs -l /dev/device | egrep '^Block size:'
Block size: 4096
$(())
構文は、数式展開のための構文です。この構文は bash と zsh では動作しますが、fish では動作しません。fish では、このような構文になります。
# tune2fs -r (math 'ngigs * 1024^3 / blocksize') /dev/device
これらのコマンドは、現在マウントされているファイルシステムに適用することができ、変更は即座に反映されます。デバイス名は findmnt(8) で調べることができます。
# tune2fs -m 1 "$(findmnt -no SOURCE /the/mount/point)"
現在の予約ブロック数を問い合わせる場合。
# tune2fs -l /dev/mapper/proxima-root | egrep '^Reserved block count:'
Reserved block count: 2975334
これはブロック数なので、これにファイルシステムのブロックサイズを掛けて、バイト数やギガバイト数を得る必要があります。2975334 * 4096 / 1024**3 = 11.34 GiB
です。
ext2/ext3 から ext4 に移行
ext2/ext3 パーティションを変換せずに ext4 としてマウント
理由
ext4 を完全に変換する案と ext2/ext3 をそのまま使用する案の折衷案として、既存の ext2/ext3 パーティションを ext4 としてマウントする方法があります。
利点:
- 互換性 (ext2/ext3 としてファイルシステムをマウントできます) – ext4 のサポートがないオペレーティングシステムからもファイルシステムを読み込むことが可能です (例: Windows の ext2/ext3 ドライバー)
- パフォーマンスが向上 (ext4 パーティションに完全に変換するのよりは劣ります) – 詳しくは [1] や [2] を見てください。
欠点:
- ext4 の機能を全て活用することはできません (マルチブロックアロケーションや遅延アロケーションなどのディスクフォーマットに変更を与える機能は使えません)
方法
/etc/fstab
を編集して ext4 としてマウントしたいパーティションの 'type' を ext2/ext3 から ext4 に変更してください。- 変更したパーティションを再マウントします。
ext2/ext3 パーティションを ext4 に変換
理由
ext4 の能力を活かすには、非可逆の変換をする必要があります。
利点:
欠点:
/boot
パーティションなど、静的なファイルしか存在しない場合、新機能を使うメリットはありません。さらに、ジャーナリングによって性能がむしろ落ちる可能性もあります。- 一方通行 (ext4 パーティションを ext2/ext3 に'ダウングレード'することはできません) ただしエクステントなどのオプションを有効にしなければ後方互換性を確保できます。
方法
以下の手順は カーネルドキュメント と フォーラムスレッド から引用しています。
- バックアップを行なって下さい。ext4 に変換する ext3 パーティションに存在するデータを全てバックアップします。特に / (root) パーティションをバックアップする場合は、Clonezilla が役に立ちます。
/etc/fstab
を編集して ext4 に変換するパーティションの 'type' を ext3 から ext4 に変換してください。- (必要であれば) ライブメディアを起動します。e2fsprogs で変換を行う際はドライブがマウントされていない状態になっている必要があります。ドライブの root (/) パーティションを変換するときは、他のライブメディアから起動して変換するのが一番簡単です。
- パーティションがマウントされていないことを確認してください
- ext2 パーティションを変換する場合、まずは
tune2fs -j /dev/sdxX
を root で実行してジャーナルを追加して ext3 パーティションに変換してください。 tune2fs -O extent,uninit_bg,dir_index /dev/sdxX
を root で実行 (/dev/sdxX
は変換するパーティションのパスに置き換えて下さい、例:/dev/sda1
)。ext4 に変換されます (不可逆です)- root で
fsck -f /dev/sdxX
を実行。- ファイルシステムのチェックを実行しないとファイルシステムを読み込めなくなります。fsck の実行は必須です。グループ記述子のチェックサムエラーが発見されます。これは仕様通りの動作です。
-f
オプションはファイルシステムに問題がない場合でも強制的にチェックを実行します。-p
オプションを使用して自動修復させることもできます (オプションを使用しない場合、エラーに対して入力を求められます)
- ファイルシステムのチェックを実行しないとファイルシステムを読み込めなくなります。fsck の実行は必須です。グループ記述子のチェックサムエラーが発見されます。これは仕様通りの動作です。
- 推奨: パーティションをマウントして
e4defrag -c -v /dev/sdxX
を実行。- ファイルシステムが ext4 に変換されても、変換前に書き込まれたファイルは ext4 のエクステントオプションを利用することができません。エクステントオプションは巨大なファイルの操作を高速化しフラグメンテーションを減らしてファイルシステムのチェック時間を短縮します。ext4 を活用するには、全てのファイルをディスクに再書き込みする必要があります。e4defrag を使うことで問題を解決できます。
- Arch Linux を再起動してください。
パフォーマンスの向上
E4rat
E4rat は ext4 ファイルシステム用に作られたプリロードアプリケーションです。E4rat は起動時に開かれるファイルを記録して、アクセス時間が短縮されるようにパーティションにおけるファイルの配置を最適化します。そして起動時の初期段階でファイルを先読みします。E4rat は SSD を使っている場合は効果がありません。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
バリアとパフォーマンス
Ext4 はデフォルトで書き込みバリアを有効にします。これにより、書き込みキャッシュの電源が失われた場合でも、ファイルシステムのメタデータがディスク上に正しく書き込まれ、順序付けされることが保証されます。これには、特に fsync を頻繁に使用するアプリケーションや、小さなファイルを多数作成および削除するアプリケーションの場合、パフォーマンスにコストが伴います。何らかの方法でバッテリーバックアップが行われている書き込みキャッシュを持つディスクの場合、バリアを無効にするとパフォーマンスが安全に向上する可能性があります。
バリアをオフにしたいときは /etc/fstab
の変更したいファイルシステムに barrier=0
オプションを追加してください。例:
/etc/fstab
/dev/sda5 / ext4 defaults,barrier=0 0 1
ジャーナリングの無効化
ext4 を使用してジャーナルを無効にするには、マウントされていないディスクで次のコマンドを使用します。
# tune2fs -O "^has_journal" /dev/sdXN
外部ジャーナルを使用してパフォーマンスを最適化する
journal_async_commit
マウントオプションを使用すると、ジャーナリングを大幅に高速化できます。
次のコマンドを使用して、ジャーナルで使用する専用デバイスをフォーマットできます:
# mke2fs -O journal_dev /dev/journal_device
journal_device
を ext4_device
のジャーナルとして割り当てるには、次を使用します。
# tune2fs -J device=/dev/journal_device /dev/ext4_device
同時に ext4_device
に新しいファイルシステムを作成したい場合は、tune2fs
を mkfs.ext4
に置き換えることができます。
ヒントとテクニック
ファイルベースの暗号化を使用する
Linux 4.1 以降、ext4 はファイル暗号化をネイティブにサポートしています。 fscrypt の記事を参照してください。 暗号化はディレクトリレベルで適用され、ディレクトリごとに異なる暗号化キーを使用できます。 これは、ブロックデバイスレベルの暗号化である dm-crypt と、スタック暗号化ファイルシステムである eCryptfs の両方とは異なります。
メタデータチェックサムを有効化する
ファイルシステムが e2fsprogs で作成されている場合。1.43 (2016) 以降では、メタデータチェックサムがデフォルトで有効になっています。既存のファイルシステムを変換して、メタデータチェックサムのサポートを有効にすることができます。
CPU が SSE 4.2 をサポートしている場合、crc32c_intel
が有効であることを確認してください。ハードウェアアクセラレーションによる CRC32C アルゴリズム [5] を有効にするために カーネルモジュール がロードされています。もしそうでなければ、代わりに crc32c_generic
モジュールをロードしてください。
メタデータチェックサムの詳細については、ext4 wiki を参照してください。
まず、e2fsck
を使用してパーティションをチェックし、最適化する必要があります。
# 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 | grep features:
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
既存のファイルシステムで fast_commit を有効にする
5.10 カーネル以降、ext4 では fast_commit
オプションを有効にすることで、パフォーマンスが向上する可能性があります。
# tune2fs -O fast_commit /dev/drivepartition
現在の構成または変更を確認するには:
# tune2fs -l /dev/drivepartition | grep features
大文字と小文字を区別しないモードを有効にする
Ext4 は大文字と小文字を区別しないモードで使用でき、Wine で実行されるアプリケーションやゲームのパフォーマンスを向上させることができます。この機能はファイルシステム全体には影響しません。大文字と小文字を区別しない属性が有効になっているディレクトリにのみ影響します。
まず、ファイルシステムでこの機能を有効にします:
# tune2fs -O casefold /dev/path/to/disk
これで、任意のディレクトリで大文字と小文字を区別しない属性を有効にできるようになります:
$ chattr +F /mnt/partition/case-insensitive-directory
ディレクトリは空である必要があり、他の場所からサブディレクトリを移動させても、その属性は継承されないことに注意してください。
参照
- 公式 Ext4 wiki
- Ext4 wiki の Ext4 ディスクレイアウト
- LWN の Ext4 暗号化 記事
- ext4 暗号化のカーネルコミット [6] [7]
- e2fsprogs 変更履歴
- Ext4 メタデータチェックサム