我想创建一个“ /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 系统实现需要将数据从用户空间复制到内核空间,与直接作为内核模块实现相比,速度相当慢。看:
答案4
如果程序非常愚蠢,不让您关闭这些日志,那么它可能在打开日志文件后也不检查错误?我会尝试安装一些虚拟只读文件系统(例如使用mount -o loop
。)