我有一个可以对文件进行重复数据删除的第三方软件,但我希望它认为它已将文件复制到磁盘,但没有从远程服务器中提取它,因为我已经在磁盘上有了这些文件,并且只想符号链接到它。
有没有办法使文件夹 /x 成为某种假写入文件系统?也许用保险丝什么的?
我想打开一个任意文件夹,您可以在其中运行写入它的软件/脚本,并且它将返回成功写入但实际上不写入任何内容。
那可能吗?示例运行touch file
应该运行良好,但没有写入任何内容。
答案1
使用FUSE文件系统(Filesystem in Userspace),您可以使用libfuse库编写程序来实现大多数文件操作。您可以有效地将程序挂载到目录上,并且您在该目录中执行的任何操作都会通过内核传递给提供答复的程序。有几个带有示例程序的 Perl 和 Python 包,可以非常简单地根据您的要求进行修改。
特别是,对于我的 Fedora 25,有一个fuse-python
rpm 提供了示例程序xmp.py这“简单地”将挂载点下完成的每个操作复制到您在开始时指定的真实目录。
例如,如果您运行(不是作为 root,而是作为普通用户)
mkdir -p /tmp/myfs/under /tmp/myfs/write
xmp.py /tmp/myfs/write -o root=/tmp/myfs/under
那么您对挂载点下的文件所做的所有操作/tmp/myfs/write
也将在真正的重复“根”目录中看到/tmp/myfs/under
。例如
echo abc >/tmp/myfs/write/file1
file1
在真实目录中创建。当然,如果您的ls /tmp/myfs/*/file1
文件同时出现在两者中,那么也会xmp.py
显示真实的目录:
-rw-r--r-- 1 4 Aug 1 18:43 /tmp/myfs/under/file1
-rw-r--r-- 1 4 Aug 1 18:43 /tmp/myfs/write/file1
如果你看一下 Python 示例代码,就会发现它相当短。可以看到系统调用的实现write()
这里:
def write(self, buf, offset):
self.file.seek(offset)
self.file.write(buf)
return len(buf)
要抑制对文件的实际写入,您只需注释掉第三行:
def write(self, buf, offset):
self.file.seek(offset)
# self.file.write(buf)
return len(buf)
卸载熔断文件系统
fusermount -u /tmp/myfs/write
然后运行新的xmp.py
,现在当您写入文件时,它似乎成功了,但没有数据写入底层真实目录。明智的做法是不要尝试删除其他文件操作,例如创建目录等,因为您的程序可能会遇到虚假问题。
请注意,我使用了xmp.py
我在系统上安装的软件包中提供的内容。 github代码的链接仅供浏览。如果您找到并使用适合您系统的软件包,那么重复此实验应该不会有任何问题。请注意,FUSE 有多个 Python 库。确保使用上面的示例代码安装该版本。
您的登录必须在组中保险丝能够使用该程序。您应该会在命令的输出中看到此列表id
。如果该组不存在,请添加该组sudo usermod -a -G fuse $USER
(其中 $USER 是您的登录名),然后再次登录。
在 Ubuntu 上,该软件包是python-fuse
.然而,我在 18.04.2 LTS 中的测试不起作用。该示例xmp.py
未更改,将创建一个文件但不写入其中,说Invalid argument
。看来这是由于此版本和 libfuse 的版本不兼容造成的。当我xmp.py
使用额外的调试选项运行时-o debug
,我看到了错误
AttributeError: 'XmpFile' object has no attribute 'direct_io'
AttributeError: 'XmpFile' object has no attribute 'keep_cache'
xmp.py
您可能想尝试其他方法来解决此问题,但我只是通过添加到class XmpFile
, function def __init__
,在该行之后添加self.fd = self.file.fileno()
以下两行来添加缺少的属性:
self.direct_io = None
self.keep_cache = None
确保这些行保持完全相同的缩进,仅使用空格,而不是制表符。