为了运行一些测试,我需要运行一个将删除文件的应用程序
由于每次我需要运行另一个测试时重新创建此文件(> 40 GB)的开销很大,因此我想模拟此文件的删除。
但这必须对删除它的应用程序完全透明。这意味着创建符号链接不是一个好的解决方案([ -L symlink ] 返回 0,而 [ -L file ] 返回 1,因此这对应用程序来说不是完全透明的)。
答案1
有几种解决方案。dd
像解决方案可能需要一些时间,但是使用寻找
dd of=mybigfile bs=1 count=0 seek=40G
是即时的。然而该命令占用的40g空间是不是见于df
...
所以最好的可能是
fallocate -l 40g mybigfile
即刻创造我的大文件并且该空间实际上是从 FS 保留的(在 中可以看到df
)
--评论后编辑--
那么硬链接呢
cd data
make 40g file "myfile"
然后对于每个测试
cd ../test
ln ../data/myfile testfile
command to unlink testfile
数据和测试目录位于同一个 FS 上(不同的目录是为了防止错误等)。
硬链接状态相当透明,不太可能被应用程序测试。解除链接操作将删除与 inode 关联的名称,然后减少 inode 中的链接计数器,并且应该非常快(只有当 inode 计数器降至零时,文件及其数据才会真正被释放 - 除非您也取消链接,否则这不会发生data/myfile
)。
答案2
使用支持快照的文件系统。ZFS 和 btrfs 就是很好的例子。只需在文件存在的情况下拍摄快照,然后在每次测试后恢复该快照即可。
这两种文件系统都以某种方式拍摄快照,因此恢复速度非常快。
答案3
对于这样的事情,我更喜欢使用LD_PRELOAD
技巧。编写一个小型 C 库来模拟unlink
(stat64
如果测试还检查文件是否存在)并预加载它。在不太重要的文件上测试它 :)
答案4
简单:创建要删除文件的硬链接,如ln original /some/where/safe
。继续删除文件,它不会消失(只是链接,您可以随时重新创建)。