将 700k 文件移动到同一 FS 内的单个目录时,设备上没有剩余空间

将 700k 文件移动到同一 FS 内的单个目录时,设备上没有剩余空间

我使用以下命令在我的服务器上查找并移动大量文件:

find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;

移动大约 700,000 个文件后,我收到此错误:

mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device

df -i有以下结果:

/dev/sdb1           322125824 144163358 177962466   45% /files

df -h有以下结果:

/dev/sdb1            4.8T  3.5T  1.1T   78%   /files

/files我在其他目录上执行所有操作

文件系统是ext4.

更新

按照建议我运行dmesg -Hwx,输出是EXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

答案1

您可能max_dir_size_kb在目录挂载时超出设置(或保留默认值):

Linux 文档:

max_dir_size_kb=n
    This limits the size of the directories so that any
    attempt to expand them beyond the specified limit in
    kilobytes will cause an ENOSPC error. This is useful in
    memory-constrained environments, where a very large
    directory can cause severe performance problems or even
    provoke the Out Of Memory killer. (For example, if there
    is only 512 MB memory available, a 176 MB directory may
    seriously cramp the system's style.)

(翻译为ENOSPC错误消息)No space left on deviceperror

因此,请确保在安装时未指定该选项(或指定了一个非常大的数字)。

另外,备注:

  • 一个文件夹中的文件太多听起来不是一个好主意。您可能想要一个关系数据库吗?对象存储?
  • 4.8 TB:这对于现代硬盘来说并不罕见,但老实说,下次在当今时代设置某些东西时,请使用像 LVM 这样的存储池。这样你就可以获得诸如实时系统快照之类的东西。

答案2

根据新获得的信息:

所以,阅读 git tag v3.10 中的 linux/fs/ext4/namei.c line 2007 (即你的内核),我认为你有点运气不好,需要调整你的文件系统;

tune2fs -O large_dir /dev/sdb1

应该允许你每个目录有更多的内容dx_entries,但老实说,我从来没有这样做过。像往常一样,做好备份。

确保您有备份,或将其应用到将这些文件复制到的新文件系统,而不是在同一文件系统中移动它们。这可能会让我觉得我是一个 XFS 粉丝(我不是,它只是有效),但我认为这听起来确实不像一个未调整的 ext4 对于这个用例来说是一个很好的文件系统。

相关内容