
灾备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 是一款基于 git packfile 格式的高效备份系统而bup validate-refs正是其仓库健康体检工具它可以扫描指定分支备份集或 save 的全部可达对象找出引用了缺失对象的 commit/tree以及条目被截断的 bupm 元数据文件并报告具体路径。读完本文你将掌握bup validate-refs的完整语法、--links与--bupm两种检查模式的行为差异、退出码语义以及它与bup-get --repair、bup-fsck等工具的配合关系并深入理解其底层遍历实现基于find_live_objects与 bloom 过滤器的对象存活扫描。命令概览做什么、不做什么bup validate-refs用于检查仓库 refs例如备份集分支或 save是否存在两类问题某些 commit 或 tree目录引用了缺失的对象missing objects某些bupm 文件bup 用于存放路径元数据——所有者、权限、时间戳等——的特殊对象损坏或条目被截断。命令会报告发现问题的路径。若未指定任何 ref则检查仓库中的全部 refs若指定了 ref则只检查这些 ref。特别需要注意的是validate-refs检查的是从给定分支或 save可达的一切包括其之前的所有 save——也就是说检查某个最新 save 时等于连带校验了整个备份历史链参见原文档 DESCRIPTION 部分及 validate_refs.py 的实现。同时要明确它的两个重要边界原文档 DESCRIPTION 明确说明存在性检查只查询仓库索引.idx并不读取对象内容。因此如果索引本身出错incorrect index检查结果可能被误导。目前损坏路径信息只输出到标准错误stderr且格式未被严格规范——适合人工检查不适合脚本解析。完整语法与命令行参数bup validate-refs [--links] [--bupm] [ref...]从命令源码 validate_refs.py 的 optspec 可以看到完整定义bup validate-refs [--links] [--bupm] [REF...] -- bupm report broken bupm (path metadata) objects within REFs links report missing objects referred to by REFs v,verbose increase log output (can be used more than once)参数说明参数作用--bupm检查 bupm路径元数据存储文件。目前主要检查缺失的路径条目此类问题可能由 bup 0.25 至 0.30.1 之前含 0.25、不含 0.30.1的版本引发。也可能顺带发现缺失对象但不配合--links时可能无法发现全部缺失对象--links检查是否存在 commit 或 tree 引用了缺失对象。可用来比尝试restore或把 savejoin到 /dev/null 更快地校验某个 save对多个相关 save 而言速度优势更明显。但需注意它只检查叶子blob数据是否存在并不会真正读取该数据-v/--verbose增加日志输出可多次叠加使用源码中 verbosity 被传递给对象计数与遍历逻辑ref...要检查的 ref 列表缺省时检查全部 refs默认行为有一个关键细节如果既未指定--links也未指定--bupm则二者都会被启用。源码 validate_refs.py 的判定逻辑是显式传入--links/--bupm但值均为 False 时报错 no validation requested两者都未指定值为 None时则自动将二者置为 True。因此直接运行bup validate-refs等价于同时做两种检查。用法示例原文档 EXAMPLES 给出两个最典型的用法# 对全部 refs 执行 --links 与 --bupm 两种检查 $ bup validate-refs # 只检查 archives/2025-01-01-030405 这一支及其之前所有 save 的对象链接 $ bup validate-refs --links archives/2025-01-01-030405实践中还可以组合使用# 只做 bupm 元数据完整性检查更快 $ bup validate-refs --bupm # 对某个具体 save 快速验证其对象链完整性 $ bup validate-refs --links 2026-09-26-010203如需获得更多过程信息可叠加-v或-vv提升日志详细程度源码会在对象计数阶段输出 found N objects 以及遍历进度scanned i of n refs。退出状态EXIT STATUS原文档明确规定了退出码语义0未发现问题1发现 broken links存在缺失对象或问题项其他正整数其他类型的失败例如 ref 解析失败等。对应到源码 validate_refs.py 的返回逻辑具体规则如下存在bad_bupmtree 中 bupm 条目数多于期望值时返回EXIT_FAILUREbup 中该常量通常对应退出码 2表示更严重的错误只要存在 ref 缺失、发现缺失对象或存在 abridged被截断的bupm就返回EXIT_FALSE即 1全部通过则返回EXIT_TRUE即 0。因此脚本化运维中可以直接依据退出码判断仓库健康状况0表示干净1表示发现可报告的问题2及以上表示命令本身执行失败如非法参数、无法解析的 ref。两种检查模式的深层原理--links对象链接完整性检查--links遍历给定 refs 可达的 commit 与 tree 结构逐个确认其引用的对象是否真实存在于仓库索引中。与完整restore/join相比它的优势在于不做数据解码与内容读取只做索引存在性查询因此明显更快多个相关 save 共享大量子树合并一次遍历即可批量校验比逐个 save 恢复快得多原文档明确强调这一点。从源码实现看真正的遍历发生在 gc.py 的find_live_objects()中它通过git.walk_object从每个 ref 的对象 ID 出发递归遍历 commit/tree/blob并用git.PackIdxListvalidate_refs.py 中在--links模式下构建做广泛的存在性检查oid_exists对每个遍历到的 item都会回调for_item若对象缺失item.data is False则调用notice_missing向 stderr 输出missing oid path格式的报告。--bupm元数据文件完整性检查bup 为每个备份目录维护一个名为.bupm的元数据对象存储该目录下各路径的所有者、权限、时间戳、xattr、ACL 等。--bupm模式下命令会解析每个.bupm中的元数据条目数量并与对应 tree 期望的条目数比对依据 validate_refs.py 的expected_bup_entry_count_for_tree()期望数 1父目录自身 遍历 tree 中各条目的计数其中.bupd分块目录直接导致期望为 1.bupm自身被跳过目录条目非分块被跳过实际条目数多于期望值 → 输出error: tree with extra bupm entries (N M)记为bad_bupm实际条目数少于期望值 → 输出abridged-bupm path记为 abridged截断。abridged bupm 正是原文档指出的历史问题bup 0.25 到 0.30.1 之前的版本可能罕见地丢失非目录路径的元数据条目。这会让同一目录下其余非目录路径的元数据全部失效产生歧义。检测到该问题后可借助bup-get(1) --repair修复——详见下文。测试用例 test-validate-refs 完整复现了这一场景它构造两个 save先 2 个根文件、后 3 个根文件再把 3 条目 save 的.bupm替换成 2 条目 save 的abridged然后用bup validate-refs --bupm断言退出码为 1并匹配输出行abridged-bupm refs/heads/src [0-9a-f]{40}:\.bupm。同时该测试也验证了健康仓库下三种运行方式--links、--bupm、默认都不产生任何输出。实现细节一次遍历、逐 ref 报告的代价权衡原文档特别提醒了一个当前实现的重要限制遍历过程中每个唯一的 tree 或 commit 对象只会被检查一次无论它在被检查的 refs 中出现多少次因为 gc.py 用live_trees集合构建stop_at回调遍历到已见过的 tree 就直接停止下钻。由此产生两个实际操作含义可能不会报告某个缺失对象的全部路径。例如同一条路径数据被多个 save 共享命令只会报告首次遇到它的位置若想找出每一个含缺失对象的 save需要对每个 ref 分别单独运行该命令。但代价是分多次运行无法复用跳过已见子树的优化总开销几乎肯定远高于一次合并运行。所以实际取舍是日常健康巡检用一次合并运行即可若确需逐 save 精确定位再按 ref 逐个执行。此外还有一个值得注意的细节默认不带--links运行时若发现了缺失对象源码会额外输出提示note: missing object list may be incomplete without --linksvalidate_refs.py提醒你缺失对象清单可能不完整因为 bupm 检查对缺失对象的发现是顺带而非穷尽的。发现问题之后与 bup-get --repair、bup-fsck 的分工原文档指出若发现问题bup-get(1) --repair可能帮得上忙。关于可修复问题的官方定义参见 bup-get.1.md 的 REPAIRS 一节abridged.bupm0.25 ≤ 版本 0.30.1 引入这正是validate-refs --bupm能检测到的类型。bup get --repair检测到后会丢弃该.bupm中除目录自身条目.之外的所有条目受影响路径将失去大部分或全部元数据所有权、权限、时间戳等并且在bup-restore(1)、bup-ls(1)等展示时权限会被收紧近似 umask 077 的效果。缺失对象0.33.5 之前的bup get/bup gc可能引发这类问题由bup-validate-object-links(1)检测。bup get --repair会为缺失对象的路径合成repair files来替换注意分块文件split files中未受影响的部分目前无法单独保留整个文件会被替换。与同类工具的分工关系bup-fsck.1.md面向 packfile 索引与对象仓库本身的一致性与垃圾回收偏底层仓库体检bup-validate-object-links.1.md专门校验对象之间的链接即 0.33.5 之前的 get/gc 引发的缺失对象问题bup-validate-ref-links.1.md等价于bup validate-refs --links的独立命令其源码 validate_ref_links.py 只是把--links追加到参数后再转发给validate_refs.main。官方文档明确建议优先使用bup validate-refs --linksbup-join(1)、bup-restore(1)完整读取数据可作为验证 save 可用性的另一种手段但速度远不如validate-refs --links。适用前提与限制小结必须在 bup 仓库内运行源码会先调用git.check_repo_or_die()检查基于.idx索引不读取对象数据因此无法发现对象存在但内容损坏的情况这类问题更适合用bup fsck或完整 restore 校验输出仅到 stderr格式未规范化不适合程序化解析一次合并遍历不会穷举同一缺失对象的所有出现位置需按 ref 单独运行才能逐 save 定位--bupm对缺失对象的发现不完整如需全面检测缺失对象请使用--links或直接运行无参数形式。结语bup validate-refs是 bup 仓库日常健康巡检中性价比极高的工具一条命令即可覆盖全部 refs 的对象链接与元数据完整性检查退出码清晰、适合集成进备份后的自动验证脚本发现 abridged bupm 或缺失对象后可分别结合bup get --repair与bup-validate-object-links完成修复。理解其只看索引、不读数据、单次遍历去重的实现特性能帮助你在快速体检与逐 save 精确定位之间做出正确的取舍。相关资源命令实现 lib/bup/cmd/validate_refs.py、遍历引擎 lib/bup/gc.py、回归测试 test/ext/test-validate-refs以及配套文档 bup-validate-ref-links.1.md、bup-get.1.md、bup-fsck.1.md。赞分享灾备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 仓库校验与修复完全指南packfile 完整性检查、par2 恢复块与损坏恢复实战bup fsck 仓库校验与修复完全指南packfile 完整性检查、par2 恢复块与损坏恢复实战 bup 是一款基于 git packfile 格式的高效灾备CLI存储Citra 3DS模拟器终极指南如何在电脑上免费畅玩任天堂3DS游戏Citra 3DS模拟器终极指南如何在电脑上免费畅玩任天堂3DS游戏 想要在电脑上重温《精灵宝可梦》系列、《塞尔达传说》等经典任天堂3DS游戏吗Citra模class-validator 实战指南用 validate 与 validateOrReject 完成对象校验class validator 实战指南用 validate 与 validateOrReject 完成对象校验 本篇指南以 docs/basics/vali后端开发工具上一篇FreeKill录像回放系统解析实现游戏记录与回放功能的完整方案下一篇如何用Pywalfox自定义Firefox主题完整调色板与模板使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考