如果 xfs_fsr 退出时显示“不会进行任何改进”,如何对 XFS 文件系统进行碎片整理?

如果 xfs_fsr 退出时显示“不会进行任何改进”,如何对 XFS 文件系统进行碎片整理?

我正在尝试对 CentOS 6.6 计算机上碎片严重的 XFS 文件系统进行碎片整理:

[root@server opt]# xfs_db -c frag -r /dev/md3
actual 598, ideal 215, fragmentation factor 64.05%

但是,当我尝试启动该xfs_fsr实用程序时,它退出并显示以下消息No improvement will be made (skipping)

[root@server opt]# xfs_fsr -t 25200 /dev/md3 -v
/opt start inode=0
ino=536871105
No improvement will be made (skipping): ino=536871105

我怎样才能让它进行碎片整理?

答案1

更新

检查后xfs_fsr的源代码我找到了这个部分:

/* Check if the temporary file has fewer extents */
new_nextents = getnextents(tfd);
if (dflag)
    fsrprintf(_("Temporary file has %d extents (%d in original)\n"), new_nextents, cur_nextents);
if (cur_nextents <= new_nextents) {
    if (vflag)
        fsrprintf(_("No improvement will be made (skipping): %s\n"), fname);
    free(fbuf);
    close(tfd);
    return 1; /* no change/no error */
}

我使用(调试标志)重新运行该命令-d,它返回以下内容:

xfs_fsr /dev/md1 -v -d
/mnt/disk1 start inode=0
ino=133
ino=133 extents=4 can_save=3 tmp=/mnt/disk1/.fsr/ag0/tmp23917
DEBUG: fsize=30364684107 blsz_dio=16773120 d_min=512 d_max=2147483136 pgsz=4096
Temporary file has 4 extents (4 in original)
No improvement will be made (skipping): ino=133

这意味着原始文件由 HDD 盘片上的 4 个文件部分组成,创建新的碎片整理文件仍将由 4 个文件部分组成,因此该文件已被跳过。但为什么它不能合并它们呢?我不知道所以我在 kernel.org bugzilla 上询问

更新2

我收到了答复。由于我的 XFS 文件系统(也可能是你的)的块大小为 4KB,因此文件部分的最大大小不能大于 8GB如 XFS 文档中所述:

如果文件的长度为零字节,则它将没有范围,di_nblocks 和 di_nexents 将为零。任何包含数据的文件都至少有一个范围,每个范围可以使用文件系统上 1 到超过 200 万个块 (221)。对于默认的 4KB 块大小文件系统,单个扩展区的长度可达 8GB。

因此,“不会做出任何改进”意味着“不可能进行改进”;)

原答案

我遇到了同样的问题并发现有很多情况下 xfs_fsr 会跳过碎片整理:

 * mandatory locks are present
 * file is marked immutable, append-only, or nodefrag
 * filesystem is shut down
 * change/modify times have been altered since defrag started
 * original file is mmapped

如果使用-vxfs_fsr则返回跳过的文件的索引节点号:

xfs_fsr /dev/md1 -v
/mnt/disk1 start inode=0
ino=133
No improvement will be made (skipping): ino=133
ino=135
No improvement will be made (skipping): ino=135
....

使用此 inode 编号,您可以使用bmap -a以下命令检查文件的属性xfs_db

xfs_db -r /dev/md3
xfs_db> inode 133
xfs_db> bmap -a
xfs_db> bmap -d
data offset 0 startblock 1314074773 (4/240332949) count 2097151 flag 0
data offset 2097151 startblock 1316171924 (4/242430100) count 2097151 flag 0
data offset 4194302 startblock 1318269075 (4/244527251) count 2097151 flag 0
data offset 6291453 startblock 1320366226 (4/246624402) count 1121800 flag 0
xfs_db> quit

正如您所看到的,在我的例子中它返回一个空值,因为不存在属性标志。

所以我接下来尝试检查锁定状态。起初我们获取inode的文件名如下:

find /mnt/disk1 -xdev -inum 133
/mnt/disk1/foo/bar.dat

然后我们尝试获取锁定状态:

lsof /mnt/disk1/foo/bar.dat

由于结果为空,似乎没有任何东西可以锁定该文件。

现在让我们检查自上次碎片整理尝试以来文件是否已更改:

ls -l /mnt/disk1/foo/bar.dat
-rw-rw-rw- 1 nobody users 30364684107 Nov 18  2019 /mnt/disk1/foo/bar.dat

不,看起来还是“老”。

相关内容