我有一个程序在写入某个文件时磁盘空间不足时可能会死机,我不确定是否是这种情况。
我想运行它看看,但我的测试服务器不会很快耗尽空间。有什么办法可以模拟这种行为吗?看起来没有任何方法可以在 Ubuntu 中设置文件夹/文件大小限制,并且设置用户配额将是一个过程(由于获得权限)
有没有一种通用的方法来测试这种情况?
我正在运行 Ubuntu 12.04
创建所需大小的文件(此处为 10MB)
dd if=/dev/zero of=/home/qdii/test bs=1024 count=10000
用这个文件制作一个环回设备
losetup -f /home/qdii/test
在您想要的文件系统中格式化该设备
mkfs.ext4 /dev/loopXXX
将它安装在您想要的任何位置(/mnt/test
应该存在)
sudo mount /dev/loopXXX /mnt/test
将您的程序复制到该分区并进行测试
cp /path/my/program /mnt/test && cd /mnt/test && ./program
/dev/loopXXX
用创建的循环设备代替losetup
,用losetup -a
.
完成后,不要忘记:
sudo umount /mnt/test
。losetup -D /dev/loopXXX
只需使用 /dev/full,当您尝试写入它时,它会引发 ENOSPC 错误:
$ echo "Hello world" > /dev/full
bash: echo: write error: No space left on device
另一种可能性是通过setrlimit(2)系统调用和RLIMIT_FSIZE
ulimitbash
内置函数(使用-f
)来减少适当的限制。然后write(2)将失败EFBIG
而且您还可以在一些适当的文件系统上设置一些配额write(2)
,所以失败了EDQOT
.
如果您想要真正的ENOSPC
错误,write(2)
您可能需要一个由qdii回答的环回文件系统。
顺便说一句,我真的不知道如何“模拟”EIO
错误(可能是一些FUSE文件系统?)。
许多程序处理write(2)
错误(几乎所有程序都应该)。但我不知道有多少程序会以非常不同的方式处理write(2)
. 大多数程序write(2)
以相同的方式处理所有错误。
但是,您可能需要以不同的方式处理错误:这些是可恢复EINTR
的EWOULDBLOCK
错误,您通常会write(2)
在以后重做。
重新创建场景的一个好方法是挂载一个空间有限的目录。假设您的程序将在 /data 上执行。要将那里的存储限制为 100MB(根据需要进行自定义):
但是如果你想要更少的空间,就把你的袜子脱掉
如果您正在进行 POSIX 文件系统调用,则可以使用libfiu将ENOSPC
错误注入调用。