该磁盘最初约为1 TB,但我们开始耗尽空间并在一年前将其增加到4 TB.现在,人们报告无法将文件签入他们的回购.错误消息是设备上没有剩余空间.
该磁盘大约有1.5 TB免费,并且还报告有免费的inode – 然而,它无法在其上创建新文件.仍然可以更新旧文件,并且间歇性地更新一些存储库,但是下一次尝试时相同的存储库可能会失败.
解决方法
问题在于XFS如何分配inode.与大多数文件系统不同,分配在创建新文件时动态发生.但是,除非另行指定,否则inode仅限于32位值,这意味着它们必须适合文件系统上第一个TB的存储空间.因此,如果您完全填充了第一个TB,然后放大了磁盘,您仍然无法创建新文件,因为无法在新空间上创建inode.
解决方案1 – 更改挂载选项
一种解决方案是使用mount选项inode64重新安装文件系统.然而,一些应用程序在这方面会表现得很奇怪(例如MySQL),并且NFS会非常困惑.因此,如果您不确定您的系统是否可以使用此选项,则可以转到下一个选项.
第二种解决方案是找到当前存储在第一个TB中的一些文件,并将它们移动到文件系统的另一个区域.
按年龄移动
在我们的例子中,这很容易 – 文件系统已经使用了多年,所以我们可以简单地找到最旧的文件并将它们从文件系统移开,然后将它们移回.使用find很容易做到这一点:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
给了我们一个列表,其中包含所有目录的大小和目录名称,位于安装点以下3个级别,超过2年.然后我们可以对列表进行排序以找到最大的目录,并使用mv将它们移动到另一个文件系统并再次返回.
按分配组移动
如果你不能简单地按年龄去做,例如当同时创建大量文件时,您仍然可以找到要移动的正确文件,但需要花费更多时间.
XFS具有分配组(也称为AG),从0开始.您可以使用xfs_info / path / to / mountpoint检查每个AG的块大小和块数,以确定哪些组在第一个TB上.或者您可以检查前几个AG以查看哪些已满,然后清除它们.
>检查前四个AG中的可用空间:
for ag in `seq 0 1 5`; do echo freespace in AG $ag; xfs_db -r -c "freesp -s -a $ag" /dev/CACHE/CACHE ; grep "total free"; done
如果任何组中的总可用空间小于40,您将无法在其中创建新文件.
>在该AG中查找文件
这需要检查文件系统上每个文件的元数据.这需要很长时间……这是一个建议:
find /extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
然后你可以grep为“0”(这是一个空格,一个零和另一个空格)来查找AG 0上的所有文件,grep为“1”以找到AG 1上的文件等等…从AG 0开始,移动最大的文件(使用mv,而不是cp!)然后再回来.重复,直到你有足够的空间.
结果