重新硬链接使用“rsync --link-dest”创建的目录。
项目描述
使用rsync --link-dest创建的重新硬链接目录。
rsync --link-dest
这是一种制作备份的好方法,恢复简单(cp -a)且占用磁盘空间小。低技术含量,当新文件比修改的大文件多时,我更信任它。
问题
有时,由于用户错误或错误,您可能会创建一个新的完整备份。结果,备份中突然分配了大量的磁盘空间,但实际上变化很小。这个程序是尝试在发生后解决这个问题。
算法
让我们看一下以下简单的备份内容
/some/place/2017-01-01/home/foo/bar /some/place/2017-01-01/home/foo/boo /some/place/2017-01-02/home/foo/bar /some/place/2017-01-02/home/foo/baz /some/place/2017-01-03/home/foo/bar /some/place/2017-01-03/home/foo/baz /some/place/2017-01-03/home/foo/boo
它可以看作是一个稀疏的2d网格,其中每行的单元格之间关系紧密(它们比跨行更有可能是同一文件)
相对路径↓ |
头部→ |
2017-01-01 |
2017-01-02 |
2017-01-03 |
---|---|---|---|---|
/home/foo/bar |
inode 1 |
inode 3 |
||
/home/foo/baz |
(n/a) |
inode 2 |
||
/home/foo/boo |
inode 4 |
(n/a) |
inode 5 |
此工具以 heads 作为参数(例如:每天一个文件夹)。它递归遍历第一个heads,并对每个找到的非目录路径,遍历其右侧的heads,建立inode和每个inode所在的heads之间的映射。
# relative_path = "/home/foo/bar"
{
1: ["2017-01-01", "2017-01-02"],
3: ["2017-03-03"],
}
然后,每个inode与其他inode进行比较(通过选择列表中的任意一个文件),将每个与给定inode相同的inode解除链接并重新链接到该inode。
可选的(默认启用),代码随后会记住它刚刚分析的(相对)路径,以便在迭代下一个heads时不再分析它。这非常高效,但会使内存使用量与唯一相对路径的数量及其长度成正比。据我经验,在pypy上,对于超过300k个唯一相对路径,这低于200MB。
然后它转到当前heads中的下一个相对路径。然后它转到下一个heads以处理当前heads中尚未存在的文件。
因此,执行时间主要由唯一相对路径的数量决定,而不是文件总数。对于上面的例子,它将按此顺序读取这些文件,此数量次。
/some/place/2017-01-01/home/foo/bar /some/place/2017-01-03/home/foo/bar /some/place/2017-01-01/home/foo/boo /some/place/2017-01-03/home/foo/boo /some/place/2017-01-02/home/foo/baz
假设inode 1和2相同,inode 4和5相同,最优的 rsync --link-dest(因此没有用户和代码问题)将产生
相对路径↓ |
头部→ |
2017-01-01 |
2017-01-02 |
2017-01-03 |
---|---|---|---|---|
/home/foo/bar |
inode 1 |
|||
/home/foo/baz |
(n/a) |
inode 2 |
||
/home/foo/boo |
inode 4 |
(n/a) |
inode 5 |
此脚本将产生
相对路径↓ |
头部→ |
2017-01-01 |
2017-01-02 |
2017-01-03 |
---|---|---|---|---|
/home/foo/bar |
inode 1 |
|||
/home/foo/baz |
(n/a) |
inode 2 |
||
/home/foo/boo |
inode 4 |
(n/a) |
inode 4 |
与其他硬链接程序相比,此方法的优点是它在运行过程中通过一次性解除所有同名重复项来定期冻结空间。
与其他硬链接程序相比,此方法的缺点是不会将名称不同的相同文件链接在一起。但rsync --link-dest 也不会,因此它也不会是我们的首选备份。
项目详情
resynclinkdest-1.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fb48b3ab55115b9c70fafbef0506b6f660084796962e98afd82d95519aa71a7f |
|
MD5 | cb285df8186f643250e66ae73e3aa2e8 |
|
BLAKE2b-256 | 317fb2f1c2ada4e69cd8c80e50190c4966d01f7918d704d763f734017f138572 |