Answers:
问题出在XFS如何分配索引节点。与大多数文件系统不同,分配是在创建新文件时动态发生的。但是,除非另行指定,否则inode限于32位值,这意味着它们必须适合文件系统上第一个TB的存储空间。因此,如果您完全填满了第一个TB,然后扩大了磁盘,由于无法在新空间上创建inode,您仍然将无法创建新文件。
一种解决方案是使用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具有从0开始的分配组(也称为AG)。您可以使用来检查每个AG的块大小和块数,以找出哪些组在第一个TB上xfs_info /path/to/mountpoint
。或者,您可以只检查前几个AG以查看哪些AG已满,然后清除它们。
对于`seq 0 1 5`中的ag; 在AG $ ag中回显自由空间;xfs_db -r -c“ freesp -s -a $ ag” / dev / CACHE / CACHE; grep“完全免费”;做完了
如果任何组中的总可用空间少于40,则将无法在其中创建新文件。
这要求检查文件系统上每个文件的元数据。这将需要很长时间...这是一个建议:
找到/ 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中就有很多空间,并且可以再次创建新文件。