3 个不稳定版本
0.2.2 | 2023年2月13日 |
---|---|
0.2.1 | 2021年1月28日 |
0.1.0 | 2018年7月1日 |
#928 in 文件系统
42KB
882 行
备份完整性检查器
这是一个备份和文件系统的完整性检查工具。
它做了什么
-
给定一个目录,工具会构建一个包含内容元数据(哈希值、大小、时间戳等)的数据库。当然,这个数据库本身也会进行校验和。
-
给定两个数据库(或一个数据库和一个目录),工具会遍历条目并打印出两者之间差异的有用摘要。例如,工具会突出显示可疑模式,例如文件被截断(原来有非零大小,现在为零大小)或存在其他可能指示损坏的模式(例如,如果文件最初没有NUL字节,则出现NUL字节)。在最小化误报的同时突出显示有用数据是一个持续的工作。
它有什么好处?
以下是一些示例用例
-
备份完整性检查:在制作备份时记录数据库。在恢复备份时,与数据库进行比较以确保备份恢复功能已正常工作。(或者更好的是,定期执行此检查以确保备份正常工作。)
-
连续同步检查:假设您使用像Dropbox这样的工具。从理论上讲,您的文件会持续“备份”。在实践中,您无法保证该工具不会在您不知情的情况下修改文件。通过定期记录数据库,您可以检查那些不应该经常更改的目录实际上并未更改。(注意:为了使其有用,该工具必须非常擅长最小化误报。)
这也适用于任何活动文件系统。考虑到一个典型的用户可能会在几十年的硬件和文件系统升级过程中保持数据的连续性。每次转换都是一个静默数据损坏的机会。这个工具可以提供长寿命数据完整性的安心保证。
该工具的设计围绕着一个特别稳定的数据库格式,以便如果发生某些情况,恢复包含的元数据将会相对简单。
安装
对于运行在x86(-64)上的macOS或Linux的用户,请运行
cargo install integrity-checker --features=asm
其他用户请运行
cargo install integrity-checker
asm
特性使sha2
crate中的优化成为可能,从而加快SHA2哈希实现的速度。
用法
要从path
目录构建数据库db.json.gz
,请运行
ick build db.json.gz path
可以在数据库上执行几种操作。以下命令分别检查数据库与目录的一致性,比较两个数据库,并验证单个数据库。
ick check db.json.gz path
ick diff db.json.gz db2.json.gz
ick selfcheck db.json.gz
格式
请参阅格式描述。
性能
语料库:Linux 4.16.7源代码(4403个目录,62872个文件,890 MiB)
机器:2016年MacBook Pro 2.7 GHz四核i7
配置 | 时间(秒) | 带宽(MiB/s) |
---|---|---|
无哈希 | 0.8832 | 1007.7 |
SHA2-512/256 | 1.3128 | 677.9 |
Blake2b | 1.3034 | 682.8 |
SHA2-512/256 + Blake2b | 1.8119 | 491.2 |
常见问题解答
-
这不是现有工具(如ZFS、Tarsnap等)更好地解决的问题吗?ZFS、Tarsnap等工具永远不会损坏您的数据。
嗯,这取决于。并非所有用户都能访问对文件内容进行校验和的文件系统,或者具有ECC RAM的机器,即使他们有,也可能遇到文件系统错误。一般来说,深度防御是好的,即使是像ZFS和Tarsnap这样的相对可信的工具也是如此。此外,在持续同步用例中,即使有备份,也很难保证没有受到静默数据损坏的影响。这个工具可以是确保长期存储有效性的大型工具集的一部分。
待办事项
- 测量性能,看是否任何主要组件(例如校验和)是CPU限制的,并且可以使其运行得更快
- 在实际备份上检查结果,看是否可以采取任何措施来展示有用的数据,同时最大限度地减少误报
- 重写check子命令,以交互式报告结果,而不是同步在内存中构建整个数据库
- 审查check/diff的输出,考虑是否可以使其更有帮助
- 决定是否要保存任何元数据。想法
- 包含空字节
- 包含非ASCII字节
- 可编码为UTF-8或其他格式
- 行结束符(某些VCS工具喜欢篡改这些)
- 是符号链接(Dropbox喜欢忘记这个)
- 具有扩展属性或资源分支或其他不寻常的功能
- 文件名大小写不同(可能表明与大小写不敏感的文件系统有关的问题)
- 具有仅大小写不同的多个文件名(可能表明与大小写敏感的文件系统有关的问题)
- 权限不同(可能表明与不跟踪权限的文件系统有关的问题)
- 跟踪统计信息(如字节频率),这些统计信息可能是文档一般内容类型(例如文本与二进制)的指示器,如果这些统计信息偏移太多,则报告
- 单元/集成测试
- 测试顶层命令工作流程
- 测试数据库校验和是否工作(即修改数据库或校验和会导致错误)
- 测试格式的长期稳定性(即旧数据库可以被读取和使用)
- 添加一个
-v
标志,以显示详细的差异 - 添加标志以配置ignore crate(即包括或排除路径)
依赖关系
~7–17MB
~216K SLoC