
灾备CLI存储【免费下载链接】bupVery efficient backup system based on the git packfile format, providing fast incremental saves and global deduplication (among and within files, including virtual machine images). Please post problems or patches to the mailing list for discussion (see the end of the README below).项目地址https://gitcode.com/gh_mirrors/bu/bup点击查看免费下载bup fsck是 bup 仓库自检与修复的核心命令其基于par2的恢复块机制经历了多次迭代从 0.33.4 的临时目录规避、0.33.8 的符号链接改硬链接到 0.33.10 引入硬链接失败即复制的回退策略。本文以 0.33.10 发布说明 为主体结合 fsck 命令源码 与 fsck 手册完整讲解该机制的设计动机、实现细节与使用方法帮助你理解 bup 如何在无硬链接文件系统上依然可靠地生成 par2 恢复数据。一、版本背景0.33.10 变更了什么0.33.10 的官方发布说明中Bugs 一节仅列出了一条核心变更正如 0.33.8 中所提到的bup fsck已从符号链接切换到硬链接以适应par21.0 的不兼容行为变化。为了允许在无硬链接的文件系统上使用现在bup会在硬链接失败时复制输入文件。这条变更的完整演化链是符号链接symlink→ 硬链接hardlink→ 硬链接失败则复制copy fallback。要理解这一演进必须回到par21.0 的兼容性问题。二、问题根源par2 1.0 与符号链接的不兼容在 0.33.4 发布说明 中bup 团队记录了对par2行为变化的担忧par2命令由bup fsck -g调用在被中断如按 Ctrl-C时可能生成空的恢复文件。为缓解该问题bup 开始在临时目录中运行par2只有生成成功后才把恢复文件移动到目标位置同时检查任何与待检 packfile 关联的空 par2 文件或不完整恢复集。到 0.33.8 发布说明 时问题进一步明确par21.0 改变了行为不再与 bup 此前用符号链接规避par2bug 的方式兼容。于是 0.33.8 将符号链接改成了硬链接。而 0.33.10 补上了最后一块拼图某些文件系统如 FAT、部分网络文件系统、以及配置了跨目录硬链接限制的环境根本不支持硬链接此时os.link会抛错。为了让bup fsck在这些平台上仍能生成恢复数据0.33.10 引入了复制回退。三、源码实现par2_generate 的硬链接与复制回退核心实现在 lib/bup/cmd/fsck.py 的par2_generate(stem)函数中。该函数在临时目录中准备 packfile 的副本以便par2在其中工作def par2_generate(stem): parent, base os.path.split(stem) # Work in a temp_dir because par2 was observed creating empty # files when interrupted by C-c. # cf. https://github.com/Parchive/par2cmdline/issues/84 with temp_dir(dirparent, prefix(base b-bup-tmp-)) as tmpdir: pack base b.pack pack_src join(tmpdir, b.., pack) pack_dst join(tmpdir, pack) copy_instead False try: os.link(pack_src, pack_dst) except OSError as ex: if not ex.errno in _unable_to_link: raise copy_instead True if copy_instead: copy2(pack_src, pack_dst) rc par2(bcreate, [b-n1, b-c200, b--, base, pack], verb_floor2, cwdtmpdir) ...关键逻辑拆解如下临时目录隔离在 packfile 所在目录parent下创建前缀为pack-HASH-bup-tmp-的临时目录par2在其中执行。这是 0.33.4 引入的防中断策略——即使par2 create被 Ctrl-C 打断也只会留下临时目录中的残骸不会污染正式恢复文件。首选硬链接os.link(pack_src, pack_dst)将原始 packfile 硬链接进临时目录。硬链接不产生数据复制对大 packfile 尤其高效且能保持文件内容一致。识别无法硬链接的错误码模块级定义了一个_unable_to_link错误码集合见 fsck.py 第 101-109 行覆盖了各平台常见的拒绝硬链接场景errno触发场景EMLINK文件链接数达到上限EOPNOTSUPP文件系统不支持硬链接FreeBSD 常见EPERM权限受限Linux 常见如禁止硬链接到不可拥有的文件ERANGEcryfs 等 FUSE 文件系统EREMOTEIOkafs跨目录硬链接受限EXDEV跨设备/跨文件系统openafs 常见复制回退仅当错误码命中上述集合时copy_instead置为 True随后用shutil.copy2复制 packfile 到临时目录。copy2会尽量保留文件元数据权限、时间戳等。若错误码不在此集合中则直接raise把异常暴露给调用者避免掩盖意外错误。par2 参数调用par2 create -n1 -c200即生成 1 个恢复文件、最多 200 个恢复块。生成成功后临时目录中的*.vol000200.par2与*.par2会被逐一os.rename回正式目录函数最后断言临时目录中仅剩 packfile 本身。四、恢复文件校验par2_recovery_file_statuspar2_generate之后fsck 每次运行都会调用 par2_recovery_file_status 检查恢复数据的完整性。该函数验证两个文件pack-HASH.par2par2 索引文件pack-HASH.vol000200.par2恢复卷文件判定规则任一文件不存在且两者都缺失 → 返回None无恢复数据不报错任一文件存在但大小为 0 → 记录error: empty par2 file - path返回False两者存在其一但另一个缺失 → 记录error: missing par2 file - path返回False。这正是为了防御 0.33.4 记录的中断场景旧版 bup 直接在正式目录运行par2 create被 Ctrl-C 打断时可能留下空的恢复文件现在任何空文件或不完整恢复集都会被 fsck 视为错误。test/ext/test-fsck 中专门有fsck rejects empty par2 index files与fsck rejects empty par2 vol files两组测试验证空 par2 文件会令bup fsck -v、-vr、-vg全部失败WVFAIL。五、par2 可用性检测与 --par2-ok / --disable-par2fsck 在启动时通过 par2_setup 探测par2是否可用执行par2 --help找不到命令或返回码非零都会打印警告并禁用恢复特性。命令行层面提供两个互斥开关见 bup-fsck 手册--par2-ok立即返回 0par2 可用或 1不可用不做任何检查。与--repair、--generate、--quick、--jobs、--disable-par2同时使用时会被判定为参数冲突源码中通过o.fatal报错。--disable-par2强制假装 par2 未安装忽略所有恢复块。此外fsck 会动态探测par2是否支持-t1单线程选项is_par2_parallel在临时目录里用 canary 文件试运行一次par2 create -t1避免向不支持并行控制的 par2 版本传入无效参数。六、bup fsck 完整使用手册以下选项完整继承自 bup-fsck.1.md结合 0.33.x 的演进注意与恢复机制相关的行为细节选项作用-r, --repair用已有恢复块尝试修复损坏的 pack需要 par2-g, --generate为没有恢复块的 pack 生成恢复块需要 par2-v, --verbose提高输出详细程度可多次叠加--quick不做完整git verify-pack只校验最终校验和显著提速-j, --jobsN并行验证的 pack 数量上限需根据 CPU 与磁盘吞吐权衡--par2-ok只探测 par2 是否可用返回 0/1--disable-par2忽略 par2 及所有恢复块典型操作示例继承自手册 EXAMPLES 节# 为所有缺少恢复块的 pack 生成恢复数据 bup fsck -g # 为指定 pack 生成恢复数据 bup fsck -g ~/.bup/objects/pack/153a1420cb1c8*.pack # 全量校验可能非常慢 bup fsck # 全量校验并修复损坏的 pack bup fsck -r # 在脚本中检测 par2 是否可用 if bup fsck --par2-ok; then echo par2 is ok fi关于--repair的退出码0.33.x 系列明确语义当且仅当--repair被请求、确实需要修复、修复成功且无其他错误时退出码为 1无错误时退出 0其他错误返回非 0 非 1 的值。测试 test/ext/test-fsck 中bup fsck --quick -rvv -j9后WVPASSEQ 1 $?即验证了修复成功 → 退出 1的语义。七、fsck 与 gc 的联动孤儿 pack 相关文件检测0.33.10 之前的版本中bup gc删除 packfile 时可能遗留pack-HASH.*相关文件例如 fsck 生成的恢复文件。为此main.md 记录bup gc现在删除 packfile 时会一并清除所有pack-HASH.*相关文件bup fsck在扫描整个仓库时即未指定 packfile 参数会报告此类残留文件。实现位于 report_stray_pack_related_files用正则pack-([a-f0-9]{40})(?:\..*)?扫描objects/pack/下所有pack-*文件凡是不对应现有*.pack的都输出No pack file for path。test/ext/test-fsck 中模拟了该场景bup rm --unsafe doc后执行bup gc --unsafe再手工touch出pack_stem、pack_stem.、pack_stem.lingering三个残留文件最后断言 fsck 恰好按字典序报告这三条No pack file for ...。八、限制与注意事项par2 恢复能力上限fsck 调用par2 create -c200恢复块可覆盖约 5% 的.pack文件损坏手册说明。测试注释明确提醒损坏超过可恢复范围时bup fsck -r会返回非 0/1 的退出码WVEXPRC [!01]。无法对抗整盘故障手册明确警告fsck 无法从完全磁盘故障中恢复重要数据仍需 RAID 或异地备份等冗余策略。检查范围bup fsck只验证 packfile 与索引在写入后是否被改动数据级损坏不检查更高层的对象连通性缺失对象。后者由bup-validate-object-links与bup-validate-refs负责。无 par2 时--generate/--repair直接报错main.md 记录bup fsck --generate与--repair在无可用 par2 时会立即以错误退出此前--generate只是打印 skipped。源码中对应 fsck.py 第 345-347 行 的error: cannot --generate or --repair without par2。硬链接回退仅覆盖已知错误码若os.link抛出_unable_to_link之外的其他异常fsck 会直接报错终止不会静默降级为复制。九、总结bup 0.33.10 的这处修复看似微小却完成了 par2 恢复机制在真实文件系统生态下的最后兼容闭环临时目录隔离0.33.4保证中断安全硬链接0.33.8适配 par2 1.0 并避免复制开销而硬链接失败即复制0.33.10则让 FAT、cryfs、openafs 等无硬链接或限制硬链接的环境也能正常生成与修复恢复数据。对于使用 bup 做去重备份的用户定期执行bup fsck并配合-g生成恢复块是抵御静默数据损坏、保障备份集可用性的关键手段。赞分享灾备CLI存储【免费下载链接】bupVery efficient backup system based on the git packfile format, providing fast incremental saves and global deduplication (among and within files, including virtual machine images). Please post problems or patches to the mailing list for discussion (see the end of the README below).项目地址https://gitcode.com/gh_mirrors/bu/bup点击查看免费下载相关推荐bup 0.29.3 变更深度解析bup fsck 如何用 -t1 消解与 par2 的并行竞争bup 0.29.3 变更深度解析bup fsck 如何用 t1 消解与 par2 的并行竞争 导读 本文基于 bup 仓库的版本说明 note/0.29.3灾备CLI存储bup fsck 仓库校验与修复完全指南packfile 完整性检查、par2 恢复块与损坏恢复实战bup fsck 仓库校验与修复完全指南packfile 完整性检查、par2 恢复块与损坏恢复实战 bup 是一款基于 git packfile 格式的高效灾备CLI存储Bup数据完整性与恢复机制Bup数据完整性与恢复机制 Bup备份系统采用PAR2冗余校验技术确保数据可靠性通过生成恢复块提供数据损坏恢复能力。该系统包含多层验证机制包括对象链接验证、灾备CLI存储上一篇AI长篇小说生成完整指南用AI_NovelGenerator写出设定不崩的多章节作品下一篇5分钟找回QQ空间全部历史说说的实用解决方案GetQzonehistory数字记忆守护者创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考