设备上没有剩余空间,但分区仅半满且 inode 可用

Tar*_*ato 5 linux python filesystems

我正在运行一个 Python 进程,它在一个目录下创建大量文件(我应该更聪明,将它们放入多个目录中,但那是另一个故事了)。

\n\n

一段时间后,我注意到我无法继续下去,脚本开始给我一个错误:

\n\n
IOError: [Errno 28] No space left on device: /scr1/data/somefile_00023532.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过研究,我发现最常见的原因是(1)分区确实没有剩余空间和(2)所有索引节点都已用完。然而,df显示

\n\n
$ df -h\n...\n/dev/sdb1       2.7T  1.2T  1.4T  46% /scr1\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

/dev/sdb1是有问题的分区)并且

\n\n
$ df -i \n...\n/dev/sdb1      183148544 17725595 165422949   10% /scr1\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以空间和索引节点确实仍然可用。

\n\n

可能文件太多:

\n\n
$ ls /scr1/data | wc\n6468500 6468500 349747747\n
Run Code Online (Sandbox Code Playgroud)\n\n

但 ext4 应该能够处理这个问题。

\n\n

是什么导致 Linux 认为空间已用完?

\n\n

更新1

\n\n

似乎特定文件名出现问题。例如,

\n\n
$ touch /scr1/data/somefilewithproblem.txt\ntouch: cannot touch \xe2\x80\x98/scr1/data/somefilewithproblem.txt\xe2\x80\x98: No space left on device\n
Run Code Online (Sandbox Code Playgroud)\n\n

但具有相同文件名模式的其他文件(我使用的是良性的东西,例如十六进制哈希值、数字 ID 号等)没有相同的问题。

\n\n

更新2

\n\n

呃!!看起来文件系统以某种方式损坏了,在fsck.ext4有问题的分区上运行后,问题就消失了。

\n\n

非常感谢那些给我提供帮助的人!

\n

Omn*_*nce 4

“设备上没有剩余空间”可能是一个非常具有误导性的错误。除了没有可用磁盘空间之外,它还可能在各种写入条件下弹出。

该文件是否已经存在并且由其他人拥有?

您是否在此文件系统上启用了配额?

如果您尝试在该文件系统中手动创建另一个文件(即touch /src1/data/testfile),您会得到相同的错误,还是会创建该文件?

您可以尝试以 root 身份创建文件吗?