it-swarm.cn

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

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

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

另请参阅 this 旧的相关线程。

84
dogbane

我所知道的任何unix都不支持开箱即用,但是您可以使用 Fuse 进行几乎所有操作。至少有 nullfs¹的一种实现 ,每个文件都存在且行为类似于/dev/null(这不是我见过的唯一实现)。

¹ 不要与 * BSD nullfs 混淆,它与 bindfs 类似。

49

另一种方法是LD_PRELOAD包装器;基本上是一个小的共享库,该库在libc.so之前加载,并通过检查预期文件路径并用“/dev/null”替换目标目录中的内容来拦截对“ open”的调用。

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

一个简单的示例位于 http://www.noah.org/wiki/LD_PRELOAD_notes ,但是在您的情况下,您将希望截获“ open”和“ creat”系统调用。

8
Martin Kealey

如果程序如此愚蠢以至于您无法关闭这些日志,那么打开日志文件后是否也不会检查错误?我会尝试挂载一些虚拟的只读文件系统(例如,使用mount -o loop。)

1
alex

您说用脚本定期删除文件还不够快。您可以使用触发器来在应用程序完成写入并关闭时删除一个临时文件吗?如果是这样,您可以使用“ inotify” API。

(请参阅 http://en.wikipedia.org/wiki/Inotifyhttps://github.com/rvoicilas/inotify-tools/wiki/

1
Elliot Nelson

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

https://github.com/abbbi/nullfsvfs

1
michael