xfs:在前 1 TB 上查找文件

Ole*_*nge 5 xfs inode

我被 xfs' No space left on device击中。根据常见问题解答:

http://xfs.org/index.php/XFS_FAQ#Q:_Why_do_I_receive_No_space_left_on_device_after_xfs_growfs.3F

解决此问题的唯一方法是移动数据以释放 1TB 以下的空间。找到最旧的数据(即在第一次增长之前就已经存在)并将其移出文件系统(移动,而不是复制)。然后,如果您将其重新复制,数据块最终将超过 1TB,这应该为低于 1TB 的 inode 留出足够的空间。

但是我如何识别要移动的数据呢?我不能按年龄计算,因为前 10 TB 是在同一天使用rsync.

我试过了:

xfs_db -r -c "blockget -i 1 -n -v" /dev/md3
Run Code Online (Sandbox Code Playgroud)

但我似乎只得到文件的基本名称,而不是文件的完整路径。而且由于我的很多文件都被称为相同的(但在不同的目录中),所以这不是很有用。它似乎也给了我更多信息,只是 inode 1。

我有一种感觉,我可以使用xfs_db它来告诉我前 1 TB 中哪些文件正在使用块,但我一直无法看到如何使用。

(通过使用挂载选项inode64,文件系统不会在设备上留下 No space left,但是如果您稍后忘记使用 mount 选项,inode64那么您将再次在设备上获得No space left on device。我想避免使用挂载选项,inode64因为文件系统可能会被其他人安装在其他系统上,他们忘记这一点,从而得到令人惊讶的No space left on device)。

kup*_*son 3

快速和肮脏的示例(删除内联注释,调整数字):

# select filesystem
find / -xdev -type f -print0 | \
  xargs -0r -I{} \
    # execute xfs_bmap on every file (and prefix output with path for later processing)
    sh -c "xfs_bmap -v {} | awk '{gsub(/\.\./,\" \"); print \"{}: \" \$0}'" | \
    # remove some cruft
    awk -F: '$4 != ""{print $1 " " $4}' | \
    # print line if last block < 1TB/512B/block and size (in 512B blocks) > 100.
    awk '$3 < 1024*1024*1024*1024/512 && $7 > 100{print}'
Run Code Online (Sandbox Code Playgroud)