我使用以下命令在我的服务器上查找并移动大量文件:
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
在目录挂载时超出设置(或保留默认值):
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 device
perror
因此,请确保在安装时未指定该选项(或指定了一个非常大的数字)。
另外,备注:
- 一个文件夹中的文件太多听起来不是一个好主意。您可能想要一个关系数据库吗?对象存储?
- 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 对于这个用例来说是一个很好的文件系统。