模拟没有可用磁盘空间情况的最简单方法?

Posted

技术标签:

【中文标题】模拟没有可用磁盘空间情况的最简单方法?【英文标题】:Easiest way to simulate no free disk space situation? 【发布时间】:2011-01-03 21:06:43 【问题描述】:

我需要在没有剩余磁盘空间的情况下测试我的 Web 应用程序,即我无法再写入任何文件。但我不想为了确保真的没有剩余空间而用垃圾填满我的硬盘。我想要的是用一个特定的进程(实际上是一个 php 应用程序)来模拟这种情况。

确实,暂时禁止对某个进程进行磁盘写入就足够了。

最简单的方法是什么?我正在使用带有内置 Apache/PHP 包的 Mac OS X 10.6.2。谢谢。

编辑:磁盘可用空间检查将不可靠,因为它可以随时更改。许多页面同时被提供。检查时可能有足够的可用空间,但在你真正写东西的时候就没有了。此外,检查磁盘可用空间将需要在我编写文件的任何地方更改代码,这不是我想要的:-) 最后,这个解决方案与我试图测试的完全相反:我的应用程序将如何表现它不能再写了。

【问题讨论】:

【参考方案1】:

我敢打赌,您也可以创建自己的 .dmg 文件,其文件系统大小为……比如说 2Mb 并写入它。如果这行得通,那么测试就非常容易——你只需安装它并切换测试路径。如果 dmg 足够小,您甚至可以将其上传到源代码管理。

【讨论】:

【参考方案2】:

当我需要这样做时,我创建了一个分配给虚拟磁盘空间有限的虚拟机。

【讨论】:

【参考方案3】:

无需使用预填充的虚拟文件系统。 使用disk_free_space() 模拟文件系统

disk_free_space() - 给定一个包含目录的字符串, 此函数将返回数字 可用的字节数 对应的文件系统或磁盘 分区。

要进行模拟,只需将函数包装到 FileSystem 类中。然后将其作为依赖项注入到您的类中,并在进行实际保存之前检查驱动器是否已满。在您的 UnitTest 中,只需将常规类替换为模拟完整文件系统的类即可。这样一来,您就不必重新创建完整的磁盘驱动器或在想要重新运行测试时始终将驱动器与项目文件一起保存,例如

class MyFileSystem

    public static function df($drive)
    
        return disk_free_space($drive);
    

并模拟一个完整的文件系统做

class MyFileSystemFull

    public static function df($drive)
    
        return 0;
    

如果您想重载函数以始终返回 0,您可以使用 RunKit Pecl 扩展并执行以下操作:

runkit_function_redefine('disk_free_space','string','return 0;');

作为替代方式查看vfsStream:

vfsStream 是虚拟文件系统的流包装器,它可能有助于单元测试以模拟真实文件系统。它可以与任何单元测试框架一起使用,例如 PHPUnit 或 SimpleTest。

【讨论】:

我对 php 部分完全无能,但这听起来像是在嘲笑你的依赖,这正是我会尝试做的。 @Mathias:是的,应该是这样。它可能需要一些调整以适应 OP 的代码,但它是一个模拟。我已经更新了答案以使其更清晰。 听起来像是竞争条件的候选者。 @gs 你的意思是当两个进程尝试保存文件并且都通过检查时,但是第一个文件被写入,然后没有足够的空间给另一个文件。是的。真的。但这不是上面的代码要解决的问题。只是为了模拟没有可用磁盘空间。 拥有自己的 diskfull 功能就可以了 - 但不建议使用此功能来测试全盘情况,还有其他随机错误可能是由未命中的全盘引起的。就像你调用一个库并且它有一个 diskfull 案例。【参考方案4】:

我使用拇指驱动器作为进程的音量。

【讨论】:

【参考方案5】:

我不确定如何在 OSX 上执行此操作,但在 Linux 上,我可能会为我的测试用户设置磁盘配额,然后运行该应用程序。

或者创建一个空文件(一个小文件),将其格式化为 ext3 分区,使用环回设备挂载它并在其中运行 PHP 应用程序。这将更接近于空间不足的物理磁盘。

【讨论】:

【参考方案6】:

一种快速简便的解决方案是为专门的用户帐户设置配额。 Quota support on Mac OS X

如果您不介意设置它的麻烦,并且您可能需要为您的操作系统提供第二个许可证这一事实,那么虚拟机可能是具有最长期可能性的最佳主意。

【讨论】:

【参考方案7】:

在常规文件(大小有限)中创建磁盘/文件系统映像并循环挂载它。

但如果你经常这样做,我会创建一个虚拟机——你会找到重用它的机会。

【讨论】:

【参考方案8】:

难道你不能使用 Mock,将代码中实际写入磁盘的部分替换为会抛出你期望看到的异常的虚假测试替换吗?

【讨论】:

【参考方案9】:

从您的网络文件夹、文件夹和您的应用将要写入的文件中递归删除所有写入权限。

【讨论】:

【参考方案10】:

底线;不要那样做。说真的——当卷空间用完时,很多事情会出现可怕的错误。除非目标卷不是引导卷并且没有其他应用程序写入它,否则磁盘填充时的行为将不受您的控制。

如果它是启动驱动器,系统很可能会在满盘时出现恐慌或崩溃。或者,如果不是,它的行为就会不稳定。

如果您谈论的是数据量,那么您的唯一应用程序会写入数据量吗?如果有任何其他应用程序正在编写,您是否知道它们可能会如何失败?

现在磁盘空间太便宜了,你最好确保磁盘空间不足永远不会发生。放入 2TB 驱动器并在达到 50% 容量时发出警报。实施起来便宜得多(除非您的时间是空闲的),而且更可靠。

【讨论】:

这似乎不是一个解决方案,而是一个临时修复。【参考方案11】:

你试过用 -f -r 挂载吗?这不是磁盘空间太低,但它应该从同一级别抛出错误。

【讨论】:

【参考方案12】:

我认为模拟类的想法是正确的方向。我通常也以这种方式测试我的代码。如果可能的话,我会为此使用一个框架,而不是自己编写这些类。我不太了解 PHP(更多使用 C# 和 Java 进行编程),但这似乎很好。 https://github.com/padraic/mockery

【讨论】:

【参考方案13】:

无论您在哪里获得剩余磁盘空间,只需将其注释掉并使用替换值(例如 0.1、0、-1)运行您的应用

【讨论】:

如果您依赖某种“NoFreeDiskSpace”异常出现,这将不起作用。

以上是关于模拟没有可用磁盘空间情况的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server--获取磁盘空间使用情况

正在保存备份的磁盘没有足够的可用空间

磁盘上没有足够的空间完成此操作

linux查看磁盘大小,文件大小常用方法

linux查看磁盘大小,文件大小常用方法

如何查看Linux磁盘空间大小