16

我有一个程序在写入某个文件时磁盘空间不足时可能会死机,我不确定是否是这种情况。

我想运行它看看,但我的测试服务器不会很快耗尽空间。有什么办法可以模拟这种行为吗?看起来没有任何方法可以在 Ubuntu 中设置文件夹/文件大小限制,并且设置用户配额将是一个过程(由于获得权限)

有没有一种通用的方法来测试这种情况?

我正在运行 Ubuntu 12.04

4

5 回答 5

34
  1. 创建所需大小的文件(此处为 10MB)

    dd if=/dev/zero of=/home/qdii/test bs=1024 count=10000

  2. 用这个文件制作一个环回设备

    losetup -f /home/qdii/test

  3. 在您想要的文件系统中格式化该设备

    mkfs.ext4 /dev/loopXXX

  4. 将它安装在您想要的任何位置(/mnt/test应该存在)

    sudo mount /dev/loopXXX /mnt/test

  5. 将您的程序复制到该分区并进行测试

    cp /path/my/program /mnt/test && cd /mnt/test && ./program


/dev/loopXXX用创建的循环设备代替losetup,用losetup -a.

完成后,不要忘记:

  • 卸载sudo umount /mnt/test
  • 使用后清理循环装置,用losetup -D /dev/loopXXX
  • 删除文件。
于 2013-04-16T18:26:39.430 回答
12

只需使用 /dev/full,当您尝试写入它时,它会引发 ENOSPC 错误:

$ echo "Hello world" > /dev/full
bash: echo: write error: No space left on device
于 2017-01-20T13:31:48.593 回答
4

另一种可能性是通过setrlimit(2)系统调用和RLIMIT_FSIZEulimitbash 内置函数(使用-f)来减少适当的限制。然后write(2)将失败EFBIG

而且您还可以在一些适当的文件系统上设置一些配额write(2),所以失败了EDQOT.

如果您想要真正的ENOSPC错误,write(2)您可能需要一个由qdii回答的环回文件系统。

顺便说一句,我真的不知道如何“模拟”EIO错误(可能是一些FUSE文件系统?)。

许多程序处理write(2)错误(几乎所有程序都应该)。但我不知道有多少程序会以非常不同的方式处理write(2). 大多数程序write(2)以相同的方式处理所有错误。

但是,您可能需要以不同的方式处理错误:这些是可恢复EINTREWOULDBLOCK错误,您通常会write(2)在以后重做。

于 2013-04-16T18:41:23.050 回答
0

重新创建场景的一个好方法是挂载一个空间有限的目录。假设您的程序将在 /data 上执行。要将那里的存储限制为 100MB(根据需要进行自定义):

  1. 须藤
  2. mkdir /媒体/图像/
  3. dd if=/dev/zero of=/media/images/data.img bs=512K count=200 #100MB
  4. mkfs.ext4 /media/images/data.img
  5. mkdir /数据
  6. mount -o 循环 /media/images/data.img /data

但是如果你想要更少的空间,就把你的袜子脱掉

  • dd if=/dev/zero of=/media/images/data.img bs=1M count=1 #1MB
于 2022-03-03T03:48:35.503 回答
0

如果您正在进行 POSIX 文件系统调用,则可以使用libfiuENOSPC错误注入调用。

于 2019-10-07T11:02:20.043 回答