XFS
関連記事
XFS は Silicon Graphics, Inc によって開発された高性能ジャーナリングファイルシステムです。XFS はアロケーショングループを使って設計されているため並列化された IO で特に性能を発揮します。このため複数のストレージデバイスを使用するときは IO スレッド, ファイルシステムの帯域, ファイルとファイルシステムのサイズ全てをスケーリングすることが可能です。
準備
XFS ユーザースペースユーティリティ xfsprogs パッケージを インストール して下さい。 XFS ファイルシステムを管理するために必要なツールが含まれています。
設定
デバイス に新しいファイルシステムを作成するには、次を使用します。
# mkfs.xfs device
一般に、デフォルトのオプションは一般的な使用に最適です。[1] [2]
サンプル出力:
meta-data=/dev/device isize=256 agcount=4, agsize=3277258 blks = sectsz=512 attr=2 data = bsize=4096 blocks=13109032, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=6400, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
チェックサム
xfsprogs 3.2.0 では、新しいディスクフォーマット (v5) が導入され、Self-Describing Metadata というメタデータのチェックサムスキームが含まれています。
CRC32 に基づいており、例えば予期せぬ停電の際にメタデータが破損しないようにするための追加保護を提供します。チェックサムは xfsprogs を使用している場合、デフォルトで有効になっています。3.2.3以降 古いカーネルで読み書き可能な xfs が必要な場合は、 mkfs.xfs(8) を呼ぶときに -m crc=0
スイッチを使えば、簡単に無効にできます。
# mkfs.xfs -m crc=0 /dev/target_partition
XFS v5 オンディスクフォーマットは Linux Kernel 3.15 以降の実稼働ワークロードでは安定と見なされています。
Free inode btree
Linux 3.16 から、XFS には free inode を追跡する btree が追加されました。これは既存の inode 割り当て btree と同等ですが、free inode btree は少なくとも1つの free inode を持つ inode チャンクを追跡することは例外です。目的は、inode 割り当てのための free inode クラスタのルックアップを改善することです。古くなったファイルシステム、つまり、何百万ものファイルをファイルシステムに追加したり、ファイルシステムから削除したりして、何年も経過したファイルシステムでのパフォーマンスを向上させることができます。この機能を使用しても、ファイルシステム全体の信頼性レベルやリカバリ機能には影響がありません。
この機能は、Linux Kernel 3.15 以降の実運用ワークロードで安定したと考えられる新しい v5 オンディスク・フォーマットに依存しています。既存のディスク上の構造は変更されませんが、inode 割り当て btree との一貫性を維持する必要がある新しい構造が追加されます。このため、古いカーネルでは free inode btree 機能を持つ読み取り専用ファイルシステムのみをマウントすることができます。
この機能は xfsprogs 3.2.3 以降を使用している場合、デフォルトで有効になっています。古いカーネルで書き込み可能なファイルシステムが必要な場合、XFS パーティションをフォーマットする際に finobt=0
スイッチで無効にすることができます。このとき、crc=0
が一緒に必要になります。
# mkfs.xfs -m crc=0,finobt=0 /dev/target_partition
または(finobt
は crc
に依存するため)
# mkfs.xfs -m crc=0 /dev/target_partition
Reverse mapping btree
Reverse mapping btree は、そのコアで、ストレージスペース使用量のセカンダリインデックスであり、プライマリスペース使用量メタデータの冗長コピーを効果的に提供します。これにより、ファイルシステム操作にいくらかのオーバーヘッドが追加されますが、ファイルシステムに含まれるため、相互参照が非常に高速になります。破損したプライマリメタデータをセカンダリコピーから再構築できるため、オンラインでファイルシステムを修復するために不可欠な機能です [5]
この機能は、Linux 4.16 の実験的ステータスを卒業し、本番環境に対応しています。ただし、オンラインファイルシステムのチェックと修復は(これまでのところ)この機能の唯一のユースケースであるため、少なくともオンラインチェックが本番環境に移行するまではオプトインのままです。
Reverse mapping btree は、ファイルシステムブロックをファイルシステムブロックの所有者にマップします。ほとんどのマッピングは i ノード番号とオフセットになりますが、ファイルシステムメタデータへのマッピングもあります。このセカンダリメタデータを使用して、プライマリメタデータを検証したり、ディスクエラーが発生したときに失われたデータを正確に特定したりできます。
この機能または将来を見据えた新しいファイルシステムを試すには、ファイルシステムの作成中に -m rmapbt=1
パラメータを渡します。
# mkfs.xfs -m rmapbt=1 device
タイムスタンプ
Linux 5.10 以降、XFS は、リファクタリングされたタイムスタンプおよび i ノードエンコーディング関数を使用して、タイムスタンプを 64ビットナノ秒カウンターとして処理し、ビットシフトして有効サイズを増やすことをサポートしています。これにより、XFS は 2038年問題 を回避して 2486 年まで実行できるようになります。bigtime が有効になると、タイムスタンプの範囲を 1901年12月 から 2038年1月 ではなく、1901年12月 から 2486年7月 にすることができます。 この機能は、クォータタイマーの有効期限を 1970年1月から 2106年2月 ではなく、1970年1月 から 2486年 にすることもできます。
xfsprogs 5.15 以降、新しいファイルシステムではデフォルトでタイムスタンプが有効になっています。
アップグレード
xfs_info(8) を使用して、既存のファイルシステムで bigtime が有効になっているかどうかを確認します。
# xfs_info / | grep bigtime ... bigtime=0 ...
xfsprogs で、5.11 以降では、既存の (マウントされていない) ファイルシステムを xfs_admin(8) でアップグレードすることができます:
# xfs_admin -O bigtime=1 device
または xfs_repair(8):
# xfs_repair -c bigtime=1 device
ついでに inobtcount
も有効にしておくとよいでしょう (これも新しいデフォルトです)
パフォーマンス
XFS FAQ より:
既に使用されているデフォルト値は、そもそも最高のパフォーマンスを 得られるように最適化されています。mkfs.xfs は、シングルディスクと MD/DM RAID セットアップの違いを検出し、 ファイルシステムを適切に構成するために使用するデフォルト値を変更することができ ます。
ほとんどの場合、mkfs.xfs
で考慮する必要があるのは、ハードウェア RAID デバイスのストライプユニットと幅を指定することだけです。(参照 XFS#ストライプサイズと幅)
マウントオプションについては、メタデータのパフォーマンスを大きく変えるのは、logbsize
マウントオプションだけです。logbsize
を増やすと、与えられたワークロードのジャーナル IO 数が減ります。このメタデータ性能の向上と引き換えに、アクティブに修正を行っている間にシステムがクラッシュした場合、リカバリ後に 見つからない 操作が増える可能性があります。
カーネル3.2.12 の時点で、デフォルトの I/O スケジューラーである CFQ は、XFS の並列化の多くを無効にします。
したがって、最適なパフォーマンスを得るには、ほとんどの場合、設定 に従うだけです。
ストライプサイズと幅
ファイルシステムをストライプする RAID 上に作成する場合は mkfs.xfs
コマンドでストライプサイズを指定することで著しい速度の向上が望めます。
How to calculate the correct sunit,swidth values for optimal performance を見て下さい。
バリアの無効化
/etc/fstab
ファイルに nobarrier マウントオプションを追加してファイルシステムのバリアの使用を無効化することでパフォーマンスを上げることができます。
アクセス日時
/etc/fstab
ファイルに noatime
マウントオプションを追加することでファイルシステムのパフォーマンスが向上することがあります。XFS ファイルシステムではデフォルトの atime の扱い方は relatime
になっており、noatime
と比べてオーバーヘッドをかなり減らしつつも atime の値を正常に保ちます。現在 Linux の全てのファイルシステムが (2.6.30 あたりから) デフォルトで relatime
を使うようになっていますが、XFS が relatime
を使うようになったのは2006年からです。そのため、パフォーマンスを理由に XFS で noatime
を使う必要はほとんどありません。
また、noatime
には nodiratime
が含まれているため、noatime
を指定したら nodiratime
を指定する必要はなくなります。
デフラグ
XFS はエクステントベースであり遅延アロケーションを利用しているため断片化の問題はなかなか発生しないようになっていますが、マウントされたアクティブな XFS ファイルシステム上のファイルをデフラグできる、ファイルシステムデフラグユーティリティ (xfs_fsr, XFS filesystem reorganizer の略) が用意されています。定期的に XFS の断片化を監視するのにも使えます。
xfs_fsr(8) はマウントされたファイルシステムの編成を改善します。再編成アルゴリズムによって一度に一つのファイルが操作され、コンパクトになる、つまりファイルのエクステント (ファイルデータの連続ブロック) のレイアウトが改善されます。
フラグメンテーションレベルの確認
ファイルシステムにどれくらい断片化が発生しているのか確認するには:
# xfs_db -c frag -r /dev/sda3
デフラグの実行
デフラグを開始するには、xfsprogs パッケージに含まれている xfs_fsr
コマンドを使います:
# xfs_fsr /dev/sda3
重複を排除
reflink 機能はカーネルバージョン 4.9 から利用可能で、バージョン 5.1.0 からはデフォルトで有効になっており、btrfs と同じようにファイルの高速 reflink コピーと事後重複排除が可能です。
既存のファイルシステムは、duperemove などのツールを使用して重複排除できます。
Reflink コピー
Reflink コピーは、最初は追加のスペースを使用しません。
$ cp --reflink bigfile1 bigfile2
いずれかのファイルが編集され、コピーオンライトが実行されるまで。これは、(大きな)ファイルのスナップショットを作成するのに非常に役立ちます。
外部XFSジャーナル
たとえば、SSD で外部ログ(メタデータジャーナル)を使用すると、パフォーマンスを向上させるのに役立つ場合があります main.html#extjnl-xfs logdev
パラメータの詳細については、mkfs.xfs(8) を参照してください。
XFS ファイルシステムを作成する際に、指定したサイズの外部ジャーナルを予約するには、 -l logdev=device,size=size
オプションを mkfs.xfs
コマンドに指定します。size
パラメータを省略した場合、ファイルシステムのサイズに基づいたジャーナルサイズが使用されます。外部ジャーナルを使用するように XFS ファイルシステムをマウントするには、 マウント コマンドに -o logdev=device
オプションを指定します。
同期間隔
XFS には専用の sysctl 変数があり、書き込み間隔とバッファサイズ をデフォルト値 3000 で設定することができます。
/etc/sysctl.d/20-xfs-sync-interval.conf
fs.xfs.xfssyncd_centisecs = 10000
管理
リサイズ
XFS はパーティションが変更された後、オンラインでサイズを変更することができます。マウントポイントを最初のパラメータとして xfs_growfs
を実行すれば、XFS ファイルシステムを最大サイズに拡大できます。
# xfs_growfs /path/to/mnt/point
オンラインメタデータチェック (スクラブ)
xfs_scrub
はカーネルに XFS ファイルシステム内の全てのメタデータオブジェクトをスクラブするように要求します。メタデータレコードは明らかに悪い値をスキャンされ、他のメタデータと相互参照されます。その目的は、ファイルシステム内の他のメタデータに対する個々のメタデータレコードの一貫性を調べることで、ファイルシステム全体の一貫性に対する妥当な信頼性を確立することです。破損したメタデータは、無傷の冗長なデータ構造が存在すれば、他のメタデータから再構築することができる。
xfs_scrub_all.timer
を 有効化/起動 します、すべての XFS ファイルシステムのオンライン メタデータを定期的にチェックします。
リペア
Checking and Repairing an XFS File System から:
XFS ファイルシステムをマウントできない場合、xfs_repair -n コマンドを使用してその整合性をチェックすることができます。通常、このコマンドは問題があると思われるアンマウントされたファイルシステムのデバイスファイルに対してのみ実行します。xfs_repair -n コマンドは repair 操作を完了する必要がある場合にファイルシステムに加えられるであろう変更を示す出力を表示しますが、ファイルシステムを直接変更することはありません。
ファイルシステムをマウントすることができ、適切なバックアップがない場合、xfsdump を使って既存のファイルシステムのデータのバックアップを試みることができます。
xfs_repair コマンドを使用すると、デバイスファイルで指定された XFS ファイルシステムの修復を試みることができます。このコマンドはジャーナル・ログを再生し、ファイル・システムがきれいにアンマウントされなかったために生じたかもしれないあらゆる不整合を修正します。ファイルシステムに不整合がない限り、XFS ファイルシステムをマウントするたびにジャーナルが再生されるため、通常このコマンドを使用する必要はありません。
まず、ファイルシステムを アンマウント してから、xfs_repair(8) ツールを実行します。
# xfs_repair device
ジャーナルログが破損している場合、xfs_repair に -L オプションを指定することでログをリセットすることができます。
ファイルシステムをマウントできない場合、または適切なバックアップがない場合は、xfs_db の使用経験がない限り、xfs_repair を実行することが唯一の実行可能なオプションです。
xfs_db は、XFS ファイルシステムを手動でデバッグおよび修復できるようにする内部コマンドセットを提供します。これらのコマンドを使用すると、ファイルシステムでスキャンを実行したり、そのデータ構造をナビゲートして表示したりできます。 -x オプションを指定してエキスパートモードを有効にすると、データ構造を変更できます。
# xfs_db [-x] device
詳しくは、xfs_db(8)とxfs_repair(8)、および xfs_db 内の help コマンドを参照してください。
参照 Which factors influence the memory usage of xfs_repair? と XFS Repair
データレスキュー
mount -o ro
で読み取り専用にマウントしても、XFS ファイルシステムがきれいにアンマウントされていなければ、ログは再生されます。
破損したストレージデバイス上の破損した XFS ファイルシステムは、 うまくいけばこれ以上破損させずにファイルをコピーできるように、 読み込み専用でマウントされるべきですが、きれいにアンマウントされず、 ログが再生できないほど破損しているのでマウントできない、という状況がありえます。 また、ログを再生することは、破損したファイルシステムに書き込むことを意味し、それ自体が悪い考えかもしれないことを考慮に入れてください。
XFS ファイルシステムに書き込まず、ログを再生せずにマウントするには、 mount -o ro,norecovery
を使ってください。
Undelete
xfs_undeleteAUR は、アンマウントされた、または読み込み専用にマウントされた XFS ファイルシステム上の削除されたファイルを(特定の条件下で)復元することができます。 詳しくは https://github.com/ianka/xfs_undelete を見て下さい。
トラブルシューティング
ルートファイルシステムクォータ
XFS クォータマウントオプション (uquota
, gquota
, prjquota
, etc) はファイルシステムの再マウントの際に失敗します。ルートファイルシステムでクォータを有効にするには、マウントオプションは initramfs に カーネルパラメータ として渡されなければなりません。rootflags=
です。その後、ルート (/etc/fstab
) ファイルシステムのマウントオプションの中にリストされてはいけません。
ユーザー nobody がマウントポイントにアクセスできない場合、xfs_scrub_all が失敗する
xfs_scrub_all
を実行すると、マウントされた各 XFS ファイルシステムに対して xfs_scrub@.service
が起動します。このサービスはユーザ nobody
として実行されるので、nobody
がディレクトリに移動できない場合、エラーで失敗します。
xfs_scrub@mountpoint.service: Changing to the requested working directory failed: Permission denied xfs_scrub@mountpoint.service: Failed at step CHDIR spawning /usr/bin/xfs_scrub: Permission denied xfs_scrub@mountpoint.service: Main process exited, code=exited, status=200/CHDIR
サービスの実行を許可するには、ユーザー nobody
に実行権限があるようにマウントポイントの パーミッション を変更します。
参照
- XFS FAQ
- Improving Metadata Performance By Reducing Journal Overhead
- wikipedia:ja:XFS
- XFS User Guide XFS ユーザーガイドはもう存在しませんが、git リポジトリへのリンクがあります