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


24

我们有一台具有4 TB文件系统的Linux服务器,该服务器用于存储Subversion存储库。有很多存储库,其中一些已经使用了几年。

该磁盘最初约为1 TB,但大约一年前我们开始用尽空间,并将其增加到4 TB。现在,人们报告无法将文件检入其存储库。错误消息是No space left on device

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

Answers:


44

问题的原因

问题出在XFS如何分配索引节点。与大多数文件系统不同,分配是在创建新文件时动态发生的。但是,除非另行指定,否则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具有从0开始的分配组(也称为AG)。您可以使用来检查每个AG的块大小和块数,以找出哪些组在第一个TB上xfs_info /path/to/mountpoint。或者,您可以只检查前几个AG以查看哪些AG已满,然后清除它们。

  1. 检查前四个AG中的可用空间:
对于`seq 0 1 5`中的ag; 在AG $ ag中回显自由空间;xfs_db -r -c“ freesp -s -a $ ag” / dev / CACHE / CACHE; grep“完全免费”;做完了

如果任何组中的总可用空间少于40,则将无法在其中创建新文件。

  1. 在该AG中查找文件

这要求检查文件系统上每个文件的元数据。这将需要长时间...这是一个建议:

   找到/ 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中就有很多空间,并且可以再次创建新文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.