设备上没有剩余空间,但分区只占一半,并且 inode 可用

设备上没有剩余空间,但分区只占一半,并且 inode 可用

我正在运行一个 Python 进程,它会在一个目录下创建大量文件(我应该更聪明一点,将它们分成多个目录,但那是另一回事)。

过了一会儿,我发现我无法继续操作,并且脚本开始给出错误:

IOError: [Errno 28] No space left on device: /scr1/data/somefile_00023532.txt

经过研究,我发现最常见的原因是 (1) 分区确实没有剩余空间,以及 (2) 所有 inode 都已用完。但是,df显示

$ df -h
...
/dev/sdb1       2.7T  1.2T  1.4T  46% /scr1
...

/dev/sdb1是所讨论的分区)并且

$ df -i 
...
/dev/sdb1      183148544 17725595 165422949   10% /scr1
...

因此空间和 inode 确实仍然可用。

可能是文件太多:

$ ls /scr1/data | wc
6468500 6468500 349747747

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

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

更新 1

问题似乎与特定文件名有关。例如,

$ touch /scr1/data/somefilewithproblem.txt
touch: cannot touch ‘/scr1/data/somefilewithproblem.txt‘: No space left on device

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

更新2

哎呀!!看起来文件系统不知怎么地损坏了,fsck.ext4在有问题的分区上运行后,问题就消失了。

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

答案1

“设备上没有剩余空间”可能是一个非常容易引起误解的错误。除了没有可用磁盘空间外,它还可能在各种写入情况下弹出。

该文件是否已存在且归其他人所有?

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

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

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

答案2

sync 命令用于将所有内容从缓存复制到内存。缓存确实会使某些进程更快,但交换内存空间会减少,从而导致出现“没有剩余空间”的错误。

以 root 用户身份运行同步命令。

$ sync; echo 1 > /proc/sys/vm/drop_caches
$ sync; echo 2 > /proc/sys/vm/drop_caches
$ sync; echo 3 > /proc/sys/vm/drop_caches

运行这些命令后,运行$ free -g命令检查空闲、已用和总可用内存、缓存和交换空间。

相关内容