Linux Tips


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) のみ適宜変更すればよい。

リンク

:filesystem

 
Link: filesystem(934d)
Last-modified: 2012/05/02 (水)