我正在尝试对 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
如果使用-v
,xfs_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
不,看起来还是“老”。