XFS の断片化度を測定 on FC5

ext2ext3 と違って XFS ファイルシステムは xfs_fsr というコマンドでファイルの再編成(Defrag?)ができるらしい。
lopsa-tech: XFS and xfs_fsr and fragmentation
man xfs_fsr (8) - filesystem reorganizer for XFS

大きいファイルに適しているという噂から、私は VMware のイメージファイル置き場に XFS を使ってます。Windows で使うと分かるけど凄く断片化するんだよねこれ。

http://fun.poosan.net/sawa/index.php?UID=1170516076

ほほう。私は VMWare のディスクイメージは伸長式にも sparse にもしてないんで多分大丈夫かとはおもったんですが,

まずは断片化量の表示

# xfs_db -c frag -r /dev/hdb3
actual 1545, ideal 82, fragmentation factor 94.69%

この94%というのはフラグメンテーションしまくりってこと?

http://fun.poosan.net/sawa/index.php?UID=1170516076

xfs_db に -c frag というコマンドを与えることで,フラグメンテーションを調べることができるんですね。勉強になります。では,ということでやってみたところ,

# xfs_db -c frag -r /dev/hda3
Segmentation fault

がぁーーん。

調べてみたら,xfsprogs の xfs_db にバグがあるようです*1(⇒http://www.linux.sgi.com/archives/xfs/2005-10/msg00139.html)。ので,xfsprogs を作り直すことに。

普通に src.rpm をとってきて rpmbuild で依存パッケージを調べてインストールしていったところ,/usr/include/uuid/uuid.h がないよ,と怒られます。じゃあ extras の uuid ないし uuid-dce を入れるといいのかと思ったら違う。ぐぐってみたところ,なぜか e2fsprogs-devel に入っているみたいなのでインストール。

以上依存関係を解決した後,上記のパッチをあててみました。

xfsprogs-2.7.3-frag.patch という名前で SOURCES に置く物が↓

--- db/frag.c.orig	2005-10-08 01:51:33.000000000 +0900
+++ db/frag.c	2007-03-08 11:20:43.285335444 +0900
@@ -294,7 +294,7 @@
 	xfs_bmbt_rec_32_t	*rp;
 
 	rp = (xfs_bmbt_rec_32_t *)XFS_DFORK_PTR(dip, whichfork);
-	process_bmbt_reclist(rp, XFS_DFORK_NEXTENTS(dip, whichfork), extmapp);
+	process_bmbt_reclist(rp, XFS_DFORK_NEXTENTS_HOST(dip, whichfork), extmapp);
 }
 
 static void
@@ -305,7 +305,7 @@
 	extmap_t	*extmap;
 	int		nex;
 
-	nex = XFS_DFORK_NEXTENTS(dip, whichfork);
+	nex = XFS_DFORK_NEXTENTS_HOST(dip, whichfork);
 	if (!nex)
 		return;
 	extmap = extmap_alloc(nex);

spec ファイルへのパッチが↓

--- xfsprogs.spec.orig	2007-03-08 11:13:08.579703639 +0900
+++ xfsprogs.spec	2007-03-08 11:24:59.276282420 +0900
@@ -7,4 +7,5 @@
 URL: http://oss.sgi.com/projects/xfs/
 Source: ftp://oss.sgi.com/projects/xfs/download/cmd_tars/xfsprogs-%{version}.src.tar.gz
+Patch: xfsprogs-%{version}-frag.patch
 BuildRoot: %{_tmppath}/%{name}-root
 BuildRequires: autoconf, libtool, gettext
@@ -44,4 +45,5 @@
 %prep
 %setup -q
+%patch -p0
 
 %build

これで

% rpmbuild -ba SPECS/xfsprogs.spec
...
% sudo rpm -Uvh --replacefiles --replacepkgs RPMS/i386/xfsprogs-2.7.3-1.2.1.i386.rpm

したところ,

# xfs_db -c frag -r /dev/hda3
actual 60865, ideal 60364, fragmentation factor 0.82%

のように無事表示できました。やっぱりあんまり断片化してなかったみたいです。

*1:FC6 のマシンだとうまくいったので,FC6 だとパッチがあたっているのか,運がいいだけかはわかりませんが