如何创建类似 /dev/null 的“黑洞”目录?

如何创建类似 /dev/null 的“黑洞”目录?

我想创建一个“ /dev/null”目录(或“黑洞”目录),这样写入其中的任何文件都不会真正写入,而是消失。

我有一个将大型临时文件写入目录的应用程序。我无法控制文件的名称,而且我并不真正关心这些文件的内容。我可以编写一个脚本来定期破坏这些文件,但是这些文件会很快写出并填满我的磁盘。我正在寻找更聪明的东西。我希望应用程序“认为”它正在写出这些文件,而实际上,写入内容只是在另一端被丢弃。

另请参阅旧的相关线程。

答案1

据我所知,任何 UNIX 都不支持开箱即用,但你可以用它做几乎任何事情保险丝。至少有nullfs 的一种实现1,一个文件系统,其中每个文件都存在并且行为类似/dev/null(这不是我见过的唯一实现)。

^ 不要与*BSD nullfs,这类似于绑定文件系统

答案2

另一种方法是LD_PRELOAD包装器;基本上是一个小型共享库,在 libc.so 之前加载,并拦截对open()某些内容的调用,检查预期文件路径并替换/dev/null它是否位于目标目录中。

这样做的优点是(a)完全在用户空间中——不需要内核黑客攻击; (b) 仅影响单个错误的申请。

一个简单的例子是http://www.noah.org/wiki/LD_PRELOAD_notes,但在您的情况下,您将希望拦截access(), open()&creat()系统调用。为了更完整的实现,您可能还需要拦截chdir()accessat()openat()以及可能的其他内容。

答案3

我基于Linux内核中的ramfs示例创建了一个内核模块,它基本上是一个名为nullfsvfs的黑洞文件系统。 FUSE 系统实现需要将数据从用户空间复制到内核空间,与直接作为内核模块实现相比,速度相当慢。看:

https://github.com/abbbi/nullfsvfs

答案4

如果程序非常愚蠢,不让您关闭这些日志,那么它可能在打开日志文件后也不检查错误?我会尝试安装一些虚拟只读文件系统(例如使用mount -o loop。)

相关内容