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


81

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

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

另请参阅旧的相关线程。



我只是问自己同样的问题,并为无法创建的目录使用了相同的名称。
ixtmixilix

Answers:


48

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

¹ 不要与* BSD nullfs混淆,后者类似于bindfs


太棒了-我已将此作为SO答案的
Phil Lello

1
给那些最终在该程序上编译错误的人的注释:g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`对我有用。
ixtmixilix

你能指出我其他的实现吗?因为我找不到任何东西
Freedo

@Freedo我怀疑许多人将其作为学习练习来进行,并且使其保持不变。他们可能不再在网上。
吉尔斯

7

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

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

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


3
...假设应用程序是否通过系统通过调用的libc,而不是直接int 0x80/ syscall/ sysenter/任何其他人。
罗斯兰

1

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


不幸的是,这种方法行不通。如果无法写入该文件,则该应用程序死亡。
dogbane

1

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

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


1
在许多系统上,删除进程已打开的文件会删除其目录条目,但是文件本身会保留在磁盘上,直到上一个使用它的进程将其关闭为止。进程可能会写文件,然后从头开始查找,然后再读回,因此操作系统不能仅仅丢弃数据。
完美的2013年

0

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

https://github.com/abbbi/nullfsvfs


-8

只是将该目录符号链接到 /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null,不必是目录。如果程序尝试写入~/.logs/log1.dump,它仍会直接进入/dev/null
我这样做是为了保护Google Chrome浏览器的缓存,因为过一会儿它变得很大,以至于Chrome需要几分钟才能启动。


3
这不起作用,因为符号链接是文件,而不是目录。尝试echo hello > ~/.logs/log1.dump~/.logs/log1.dump: Not a directory。但是,echo hello > ~/.logs因为.logs是文件,所以可以使用。
dogbane

2
你一定是在跟我们开玩笑。$ ln -s /dev/null dev-null; touch dev-null/zzz给我touch: cannot touch 'dev-null/zzz': Not a directory
Alex

1
就像我说的,它适用于Chrome。这样可以防止将其写入缓存。如果它导致提问者的程序崩溃,那么显然它不会检查文件指针是否为NULL。
jonescb 2011年

6
这可能意味着如果打开文件时出现错误,Chrome将跳过写入操作。你可以实现从转储文件或目录的书面去除写权限相同的效果。
KeithB

的确,更改目录的权限可能更有意义。
jonescb 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.