我正在运行一个 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
命令检查空闲、已用和总可用内存、缓存和交换空间。