filesystem/xfs
概要 †
SGI IRIX用に開発されたファイルシステムを、Linux用に移植したもの。RHES、CentOSなどで使用するには、カーネルのコンパイル、xfsprogsのインストールが必要。CentOSでは、CentOS Plusの方に含まれているようだ。
_ 長所
- 大きなファイルを扱うのが得意
- システムの負荷が小さい
_ 短所
- ファイルの削除が(ext3,reiserfsに比べ)遅い
- rmにて削除したファイルを復活させる事が出来ない(本家のFAQにもそうある)。
Tuning/チューニング †
_ logバージョン
log version 2を使用すると、より大きなログサイズを指定することが可能となる
# mkfs.xfs -l version=2 /dev/sdxx
_ journal logサイズの変更
journal logサイズを大きくすると、削除時のパフォーマンスが向上する
# mkfs.xfs -l size=64m /dev/sdxx
ただし、パーティションサイズが小さいと、それ相応のサイズまでしか大きくできないようだ。
_ log buffer数の変更
log buffer数を大きくすると、削除時のパフォーマンスが向上する
# mount -o logbufs=8 /dev/sdxx /somewhere
_ log bufferサイズの変更
log bufferサイズを大きくすると、ジャーナルにアクセスする割合を減らすことができる。
# mount -o logbsize=256k /dev/sdxx /somewhere
_ delayed logging
ジャーナルログに書き込むのを遅延させる?ことにより、ジャーナルにアクセスする割合を減らすことができる。
# mount -o delaylog /dev/sdxx /somewhere
_ nobarrier
write barrierというのは、ジャーナルデータをHDDに書き込む際に、diskキャッシュを有効に使うにする仕組みらしいのだが、その分アクセスが遅くなる。実際に、NFS用のマウントオプションで barrier を有効にしていたら、スタックするようになったので、外しているのだが、サーバ用途とかでやると、いざというときに不味いことになるかもしれない…。
_ journal log を別デバイスに置く
xfsを/dev/sdxx、journal logを置くデバイスを/dev/sdxx、journal log size(block数)をssssとすると、パーティションを新たに作成する場合は、
# mkfs.xfs -l logdev=/dev/sdxx,size=ssssb /dev/sdxx
とする。
既存のパーティションのログを外部ログにする場合は、まず、外部ログ用のパーティションを初期化し、
# dd if=/dev/zero of=/dev/sdxx bs=ssss count=4096
xfs_dbにてxfsパーティションのパラメタを書き換える。
# xfs_db -x /dev/sdxx -x は、write option
xfs_db> sb 0 super blockの先頭へ(多分)
xfs_db> print 全パラメタ表示
magicnum = 0x58465342
blocksize = 4096
:
logstart = 2097156 元のlogの開始場所(控えておいた方がいいかも)
:
logblocks = 2560 元のlogのサイズ(控えておいた方がいいかも)
:
xfs_db> write logstart 0 logの開始場所を書き換える。おそらく0とすると外部ログとなる
xfs_db> write logblocks sssss logサイズを書き換える
xfs_db> q
ログデバイスを指定し、マウントする
# mount -t xfs -o logdev=/dev/sdxx /dev/sdxx /somewhere
もし元に戻したい場合は、xfs_dbを使って、控えておいた元の値に戻すか、或いは、
# xfs_repair /dev/sda3
にて、修復すると直る。
root filesystemを外部logにする †
結果からいうと、出来なかった。kernel-2.6.13, kernel-2.4.21 にて試した。以下はその内容で、xfsのML archiveにて同様のものを見つけ、その情報を元に行った。
kernelは logdev の場所が分からないので、それをbootパラメタとして渡してやる必要があるようだ。grubなら、/boot/grub/menu.lstへ、
root (sd0,2) kernel (sd0,2)/boot/vmlinuz root=/dev/sda3 rootfstype=xfs rootflags=logdev=/dev/sdc2
のように、rootflags というのを追加する。rootfstype については、なくても大丈夫かもしれない。あと、/etc/fstab にも、logdevを追加する。
これで、問題ないはず…なのだが、実際にbootしてみると、
XFS: Invalid device[/dev/sdc2],error=-2
などと、冷たい扱いを受け、Kernel panicで止まってしまう。
_ Mount option まとめ
# mount -o noatime,logbufs=8,logbsize=256k,delaylog,logdev=/dev/sdxx /dev/sdxx /somewhere
リサイズ †
領域を増やす場合は、マウントしたまま行うことが可能。 LVMやfdiskなどでパーティションサイズを変更した後、
# xfs_growfs /var
とするだけだ。増やした分のサイズの計算は自動で行ってくれる。
tips †
_ root filesystem が xfs の時に grub-install に失敗する場合
インストーラからgrubをインストールするとき、root filesystem がxfsだと失敗することがあるよ、というwarning が出る(Debian、RedHat系 など)。実際、実行すると失敗する。この場合は、ひとまず諦めて lilo をインストールするか、FDなどへインストールする。インストール終了後、起動し、改めて手動でgrubをインストールすればよい。
通常は、
# grub-install /dev/sda
などとするが、これを以下のように行う。
# grub : grub> install (sd0,0)/boot/grub/stage1 d (sd0) (sd0,0)/boot/grub/stage2 0x8000 p (sd0,0)/boot/grub/menu.lst grub> quit
以上でOK。デバイス番号 (sdx.x) のみ適宜変更すればよい。
