如何模拟文件的删除?(linux)

如何模拟文件的删除?(linux)

为了运行一些测试,我需要运行一个将删除文件的应用程序

由于每次我需要运行另一个测试时重新创建此文件(> 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 库来模拟unlinkstat64如果测试还检查文件是否存在)并预加载它。在不太重要的文件上测试它 :)

答案4

简单:创建要删除文件的硬链接,如ln original /some/where/safe。继续删除文件,它不会消失(只是链接,您可以随时重新创建)。

相关内容