当运行下一个命令时,我收到有关访问某些文件或目录(如/root
)的错误,因为 Duplicity 没有足够的权限:
duplicity --dry-run --include="/home/user" --include="/other/dir" \
--exclude='/' / file:///tmp/backup-test/
我开始想知道为什么会发生这种情况,并运行 strace 来查看访问了哪些文件:
strace -o /tmp/duplicity-traced -e trace=file !!
令我惊讶的是,目录/
和中的每个文件都/home
通过 访问stat()
。从性能角度来看,这看起来不太好。duplicity 是否没有针对此查询进行优化,还是我遗漏了什么?
答案1
在深入研究了所检索到的源代码之后apt-get source duplicity
,我得出结论,如果不修改源代码及其算法,这是不可能的。
重复的工作方式:
- 扫描 *source_directory* 以查找条目
- 对于找到的每个条目,执行一次
lstat()
调用。这用于确定 inode 类型(例如常规文件或目录)。结果将缓存在此条目中 如果该条目存在...
- 并且是符号链接,则将使用以下方式读取目标
readlink
- 并且是常规文件或目录,
access()
将被调用来检测该条目是否可读 - 如果条目可读,它将由每个选择函数进行测试(通过
--include
和等选项设置--exclude
)
- 并且是符号链接,则将使用以下方式读取目标
这看起来非常合理,除非磁盘访问非常慢(NFS?),否则无需更改该算法来在stat
调用之前进行路径检查。