linux – 无法在大型XFS文件系统上创建文件

我们有一个带有4 TB文件系统的 Linux服务器,用于存储subversion存储库.有许多存储库,其中一些已经使用了好几年.

该磁盘最初约为1 TB,但我们开始耗尽空间并在一年前将其增加到4 TB.现在,人们报告无法将文件签入他们的回购.错误消息是设备上没有剩余空间.

该磁盘大约有1.5 TB免费,并且还报告有免费的inode – 然而,它无法在其上创建新文件.仍然可以更新旧文件,并且间歇性地更新一些存储库,但是下一次尝试时相同的存储库可能会失败.

解决方法

问题的原因

问题在于XFS如何分配inode.与大多数文件系统不同,分配在创建新文件时动态发生.但是,除非另行指定,否则inode仅限于32位值,这意味着它们必须适合文件系统上第一个TB的存储空间.因此,如果您完全填充了第一个TB,然后放大了磁盘,您仍然无法创建新文件,因为无法在新空间上创建inode.

解决方案1 ​​ – 更改挂载选项

一种解决方案是使用mount选项inode64重新安装文件系统.然而,一些应用程序在这方面会表现得很奇怪(例如MySQL),并且NFS会非常困惑.因此,如果您不确定您的系统是否可以使用此选项,则可以转到下一个选项.

解决方案2 – 移动文件

第二种解决方案是找到当前存储在第一个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!)然后再回来.重复,直到你有足够的空间.

结果

一旦我们将足够多的文件从/ extra移回然后再返回,AG 0中就有很多空间,再次可以创建新文件.

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...