我想创建一个“ /dev/null
”目录(或“黑洞”目录),以便写入其中的任何文件都不是真正写入的,而只是消失了。
我有一个将大型临时文件写到目录中的应用程序。我无法控制文件名,而且我也不在乎这些文件的内容。我可以编写一个脚本来定期清除这些文件,但是文件很快被写出并填满了我的磁盘。我正在寻找更聪明的东西。我希望应用程序“认为”它正在写出这些文件,而实际上,写操作只是在另一端被丢弃。
另请参阅此旧的相关线程。
我想创建一个“ /dev/null
”目录(或“黑洞”目录),以便写入其中的任何文件都不是真正写入的,而只是消失了。
我有一个将大型临时文件写到目录中的应用程序。我无法控制文件名,而且我也不在乎这些文件的内容。我可以编写一个脚本来定期清除这些文件,但是文件很快被写出并填满了我的磁盘。我正在寻找更聪明的东西。我希望应用程序“认为”它正在写出这些文件,而实际上,写操作只是在另一端被丢弃。
另请参阅此旧的相关线程。
Answers:
我所知道的任何unix都不支持开箱即用,但是FUSE几乎可以做任何事情。至少有一个nullfs¹的实现,/dev/null
这是一个文件系统,其中每个文件都存在并且行为类似(这不是我见过的唯一实现)。
¹ 不要与* BSD nullfs混淆,后者类似于bindfs。
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
对我有用。
另一种方法是LD_PRELOAD包装器;基本上是一个小的共享库,该库在libc.so之前加载,并通过检查预期文件路径并用“ / dev / null”替换目标目录中的内容来拦截对“ open”的调用。
这样做的好处是:(a)完全在用户空间中-无需内核黑客攻击;(b)仅影响单一错误申请。
一个简单的示例位于http://www.noah.org/wiki/LD_PRELOAD_notes,但是在您的情况下,您将希望截获“ open”和“ creat”系统调用。
int 0x80
/ syscall
/ sysenter
/任何其他人。
您说用脚本定期删除文件还不够快。您可以使用触发器来在应用程序完成写入并关闭时删除一个临时文件吗?如果是这样,您可以使用“ inotify” API。
(请参阅http://en.wikipedia.org/wiki/Inotify和https://github.com/rvoicilas/inotify-tools/wiki/)
我已经基于linux内核中的ramfs示例创建了一个内核模块,它基本上是一个称为nullfsvfs的黑洞文件系统。与作为内核模块的直接实现相比,FUSE系统实现需要将数据从用户复制到内核空间,并且速度很慢。看到:
只是将该目录符号链接到 /dev/null
rm -rf ~/.logs
ln -s /dev/null ~/.logs
/dev/null
,不必是目录。如果程序尝试写入~/.logs/log1.dump
,它仍会直接进入/dev/null
。
我这样做是为了保护Google Chrome浏览器的缓存,因为过一会儿它变得很大,以至于Chrome需要几分钟才能启动。
echo hello > ~/.logs/log1.dump
给~/.logs/log1.dump: Not a directory
。但是,echo hello > ~/.logs
因为.logs是文件,所以可以使用。
$ ln -s /dev/null dev-null; touch dev-null/zzz
给我touch: cannot touch 'dev-null/zzz': Not a directory