我被 xfs 击中了设备上没有剩余空间。根据常见问题解答:
http://xfs.org/index.php/XFS_FAQ#Q:为什么xfs_growfs之后设备上没有剩余空间.3F
解决此问题的唯一方法是移动数据以释放 1TB 以下的空间。找到最旧的数据(即在第一次增长之前就存在的数据)并将其从文件系统中移出(移动,而不是复制)。然后,如果您将其复制回去,数据块最终将超过 1TB,这样您就有足够的空间用于 1TB 以下的 inode。
但是我如何识别要移动的数据?我无法按年龄进行判断,因为前 10 TB 是在同一天使用时填充的rsync
。
我努力了:
xfs_db -r -c "blockget -i 1 -n -v" /dev/md3
但我似乎只获取了文件的基本名称,而没有获取文件的完整路径。而且由于我的许多文件都具有相同的名称(但在不同的目录中),因此这没什么用。此外,它似乎为我提供了比 inode 1 更多的信息。
我有一种感觉,我可以使用它xfs_db
并让它告诉我哪些文件正在使用前 1 TB 中的块,但我无法看到如何操作。
(通过使用 mount 选项,inode64
文件系统将不会给出设备上没有剩余空间,但如果你后来忘记使用 mount 选项,inode64
那么你将得到设备上没有剩余空间再次。我想避免使用 mount 选项,inode64
因为文件系统可能被其他系统上的其他人挂载,并且他们将要忘记这一点,从而得到一个令人惊讶的设备上没有剩余空间)。
答案1
快速&粗略示例(删除内联注释,调整数字):
# 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}'
答案2
尝试使用该-o inode64
选项(重新)挂载您的文件系统,看看是否能解决您的问题,但请注意man mount
:
inode64
Indicates that XFS is allowed to create inodes at any location in the filesystem, including those
which will result in inode numbers occupying more than 32 bits of significance. This is provided
for backwards compatibility, but causes problems for backup applications that cannot handle large
inode numbers.