1 个不稳定版本
0.4.0 | 2021年6月16日 |
---|
#941 in 文件系统
用于 datman
160KB
3.5K SLoC
山 (yama): 去重堆仓库
注意:此README尚未更新到实际情况...
yama
[-w|--with [user@host:]path] [--with-encrypted true|false]
备份配置文件
远程
在 yama.toml
中,您可以配置远程
[remote.bob]
encrypted = true
host = "bobmachine.xyz"
user = "bob"
path = "/home/bob/yama"
子命令
check
:检查仓库的一致性
验证整个仓库是否满足以下一致性约束
- 所有块都有正确的哈希值
- 所有指针都有有效的结构,递归地
用法:yama check [--gc]
报告占用的空间量和未使用块占用的空间量。
如果指定了 --gc
,则将删除未使用的块。
lsp
:列出树指针
用法:yama lsp
rmp
:删除树指针
用法:yama rmp pointer/path [--force]
如果没有指定 --force
且指针被其他指针依赖,则删除操作将因错误而中止。
store
:将树存储到仓库中
用法:yama store [--dry-run] [ssh://user@host]/path/to/dir pointer/path [--exclusions path/to/exclusions.txt] [--differential pointer/parent]
指针必须不存在,它将被创建。如果指定了 --differential
并与现有父指针一起使用,则目录列表将指定为对父目录的差异列表。这样做的目的是减少目录列表的大小。
排除列表
排除列表的格式基本上与 .gitignore
相同,每行一个glob,表示不包含的文件,相对于树根。
extract
:从仓库中提取文件(s)
使用方法: yama extract [--dry-run] 指针/路径[:路径] [ssh://用户@主机]/本地目录路径[
如果没有指定路径,则提取根目录 /. 尾随斜杠表示文件将被提取为指定目录的子目录。
remote
:在远程仓库上运行操作
使用方法: yama remote ssh://用户@主机/仓库路径 <子命令>
remote store
:将本地树存储到远程仓库
使用方法与 yama store
相同,但存储路径必须是本地的。
remote extract
:将远程仓库提取到本地树
使用方法与 yama extract
相同,但目标路径必须是本地的。
slave
:远程控制的 yama
通过 stdin/stdout 通信执行指定操作。在涉及 SSH 的 yama 命令中使用。
仓库存储详情
指针存储在 pointers.lmdb
中,块存储在 chunks.lmdb
中。如果排除文件需要定期使用,则应将其保存在与仓库相同的目录中。
块使用 zstd
进行压缩。必须首先进行训练,并将训练字典放置在 repo root/zstd.dict
。**在用此字典文件创建块之后,该字典文件不得丢失或更改。这样做将使整个仓库的完整性失效。**
块使用 BLAKE256 进行哈希,并在去重之前计算块的 xxHash。 (检测到冲突将导致备份终止。虽然这种情况不会发生,但我们不能完全确定。)
远程协议详情
- 在数据所在的主机上执行压缩。
- 仅压缩所需的块并通过 SSH 连接传播。
- 需要某种机制来提供、拒绝和接受块,而不会导致缓冲区溢出和主机崩溃。
处理器详情
其他备注
zstd--训练 FILEs-o zstd.dict
- 候选大小:
find ~/Programming -size -4k -size +64c -type f -exec grep -Iq . {} \; -printf "%s\n" | jq -s 'add'
- 想要采样
find~/Programming-size-4k-size+64c-type f -exec grep-Iq. {} \; -exec cp{} -t/tmp/d/ \;
du-sh
find>file.list
wc -l < file.list
→ gives a № linesshuf -n 4242 file.list | xargs -x zstd --train -o zstd.dict
处理4242个文件。如果接收到包含空格的文件名,则重新运行直到获取到有效集合。
依赖项
~63MB
~829K SLoC