
灾备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.30.1 是继 0.30 之后的一个以稳健性修复与语义对齐为主打的补丁版本。本文以 note/0.30.1-from-0.30.md 为骨架结合仓库中的 lib/bup/vfs.py、lib/bup/git.py、lib/bup/cmd/index.py 等源码逐条拆解该版本“需要注意的变更”“通用改进”“缺陷修复”与“构建系统调整”帮助你理解每个修复背后的代码级原因、受影响的操作场景以及升级前应检查的事项。一、版本概览与升级定位0.30.1 不是功能大版本而是一个面向数据完整性与资源释放的修复版本其核心关注点集中在四个层面目录元数据可能损坏某些历史场景下保存的目录元数据不正确文件内容不受影响bup index --fake-valid行为与手册对齐该选项从此可以被真正用于“跳过无趣文件”的既定用途git 版本识别更准确包括对 rc 版本字符串如1.5.2-rc3的兼容判断资源回收更激进midx 等操作中更早关闭文件句柄与 mmap及时归还磁盘空间。如果你正在运行 0.30 或更早版本且使用过--strip/--graft等路径改写功能或在大目录上遇到过元数据异常0.30.1 值得重点关注具体判断标准见下一节。二、May require attention升级前必须检查的两件事2.1 历史目录元数据可能不正确文件内容不受影响这是 0.30.1 发布说明中唯一的“需要注意”项旧版本 bup 有可能以不正确的元数据保存文件系统目录但文件内容应当是完好的。触发条件有两个bup 在读取目录中某个文件的元数据时遇到错误通过 strip/graft 选项将两个同名文件保存到同一目标目录。在发生上述情况后bup 可能会为受影响目录中的部分路径呈现通用generic或不正确incorrect的元数据。这里需要理解 bup 的存储模型bup 对目录tree与文件内容blob分别编码目录条目中记录的是每个文件对应的对象 ID 及元数据权限、时间戳、属主等而文件内容本身存储在独立的 blob 中。因此即使目录元数据被写坏已保存的文件内容 blob 依然完整恢复时数据不会丢失但ls -l看到的时间戳、权限等信息可能与源目录不一致。升级建议如果历史备份中涉及大目录、使用了 strip/graft可重点抽查这些备份的目录元数据例如用bup ls对比源目录的权限与时间戳目录元数据异常只影响部分路径的展示信息不危及文件内容必要时可对受影响备份执行重新保存重新bup save以获得正确的目录元数据不需要对所有历史备份做全量重建。2.2bup index --fake-valid的语义与手册对齐旧版本中--fake-valid的实际行为与 man page 描述不符导致该选项无法实现其文档声称的用途——规避“无聊文件”boring files。0.30.1 将实现修正为与文档一致。先看选项定义lib/bup/cmd/index.pyfake-valid mark all index entries as up-to-date even if they arent fake-invalid mark all index entries as invalid再看当前实现中的约束lib/bup/cmd/index.pyif (opt.fake_valid or opt.fake_invalid) and not opt.update: o.fatal(--fake-{in,}valid are meaningless without -u) if opt.fake_valid and opt.fake_invalid: o.fatal(--fake-valid is incompatible with --fake-invalid)也就是说--fake-valid必须与-uupdate配合使用且与--fake-invalid互斥。修正后的典型用法是先用bup index -u扫描目录并建立索引项随后用bup index -u --fake-valid将全部条目标记为“已是最新”这样后续真正执行bup save时这些条目会被视为无需重新哈希/保存——即实现“跳过 boring 文件”的目的。2.3 关联说明--smaller 的真实语义发布说明同时澄清了设计文档中的一个细节bup save --smaller会把较大的文件从保存的树中整体省略而不是以某种方式降级保存。这一点在 DESIGN.md 中描述意味着使用--smaller时备份树中根本不会出现超过阈值的大文件条目恢复时也不会包含这些文件规划容量与恢复预期时需留意。三、通用改进General3.1 git 版本识别更准确旧逻辑对版本字符串的解析过于严格导致拒绝了1.5.2-rc3这样的候选发布版本拒绝形如1.5.2-rc3 (something ...)的带后缀版本。0.30.1 后lib/bup/git.py 中的is_suitable_git()采用前缀匹配 正则的方式判断 git 是否满足最低要求至少 1.7.2def is_suitable_git(ver_str): if not ver_str.startswith(bgit version ): return unrecognized ver_str ver_str[len(bgit version ):] if ver_str.startswith(b0.): return insufficient if ver_str.startswith(b1.): if re.match(br1\.[01234567]rc, ver_str): return insufficient if re.match(br1\.[0123456]\., ver_str): return insufficient if re.match(br1\.7\.01, ver_str): return insufficient if re.match(br1\.7\.2-rc, ver_str): return insufficient return suitable if re.match(br[0-9](\.|$)?, ver_str): return suitable sys.exit(13)从源码结构看判定策略是以git version为前缀解析输出0.x、1.0~1.6.x、1.7.0/1.7.1、以及1.7.2-rc一律判定为不满足要求其余1.7.x及更高版本、2.x判定为合适无法识别的输出直接报错退出。对应地require_suitable_git()lib/bup/git.py在确认不合适时会输出error: git version must be at least 1.7.2并退出同时提供环境变量绕过检查见下节。3.2 环境变量BUP_ASSUME_GIT_VERSION_IS_FINE当环境中设置BUP_ASSUME_GIT_VERSION_IS_FINEtrue|yes|1bup 会跳过 git 版本检查直接假定PATH中可用的 git 版本是可接受的。实现细节值得注意源码中实际读取的变量名是BUP_GIT_VERSION_IS_FINElib/bup/git.py取值比较不区分大小写if environ.get(bBUP_GIT_VERSION_IS_FINE, b).lower() \ in (byes, btrue, b1): _git_great True return适用场景当你的 git 版本较新、但 bup 的版本判定逻辑误判或你想跳过检查加速启动时使用。测试用例 test/int/test_git.py 也验证了设置/清除该环境变量后版本检查行为的变化。注意文档与源码中的变量名存在ASSUME_前缀差异实际以源码为准——如果你在旧文档中看到的是BUP_ASSUME_GIT_VERSION_IS_FINE在 0.30.1 对应源码中应设置为BUP_GIT_VERSION_IS_FINE。四、缺陷修复Bugs4.1 更激进地关闭文件提前归还磁盘空间修复内容bup 在各类操作中尤其 midx无论显式执行bup midx ...还是在bup save等操作中隐式触发会更早地关闭不再需要的文件。旧行为已删除的文件可能一直保持打开状态其占用的磁盘空间要到 bup 进程退出后才被归还。新行为立即关闭文件句柄让空间尽快释放同时在不立即从目录中移除已删除文件路径的文件系统上避免gc等操作崩溃。源码层面的证据midx 的PackMidx.close()lib/bup/midx.py会显式将fanout、shatable、whichlist、idxnames置空并关闭底层 mmapdef close(self): # This must be able to handle __init__ partial initializations too. if not self.closed: self.closed True self.fanout self.shatable self.whichlist self.idxnames None tmp getattr(self, map, None) if tmp is not None: self.map None tmp.close()配合发布说明中“bup 应立即释放 midx 相关的数据结构mmap 等而非依赖垃圾回收”的修复点可以推断 0.30.1 之前这些释放依赖 Python GC时机不确定0.30.1 起通过显式close()保证确定性释放。4.2 合成符号链接读取不再崩溃修复内容读取/BRANCH/latest这类合成符号链接的目标时不再崩溃。崩溃现场旧版栈File /usr/local/lib/bup/bup/vfs.py, line 524, in _compute_item_size return len(_readlink(repo, item.oid)) AttributeError: FakeLink object has no attribute oid原因分析vfs 中/BRANCH/latest这类条目由FakeLink表示——它是一个namedtuple(FakeLink, (meta, target))lib/bup/vfs.py只存 meta 与 target没有 oid。旧版_compute_item_size()对 symlink 一律走_readlink(repo, item.oid)遇到 FakeLink 就因缺少oid属性而抛AttributeError。0.30.1 的修复在 lib/bup/vfs.py 中对 FakeLink 做了分支处理def _compute_item_size(repo, item): mode item_mode(item) if S_ISREG(mode): size _normal_or_chunked_file_size(repo, item.oid) return size if S_ISLNK(mode): if isinstance(item, FakeLink): return len(item.target) return len(_readlink(repo, item.oid)) if S_ISDIR(mode): return None return 0同样地readlink()lib/bup/vfs.py也增加了isinstance(item, FakeLink)判断并直接返回item.target。从entries[blatest] FakeLink(metadefault_symlink_mode, targettip[0])lib/bup/vfs.py可以看出latest条目的 target 在解析时已经确定无需再去仓库读取对象。影响面bup ls /BRANCH/latest、bup fuse挂载后浏览latest链接、web 界面等以 vfs 为底层的访问路径都会受益。4.3bup bloom过滤器再生逻辑修正修复内容某些情况下bup bloom本应重新生成过滤器却不会。具体问题当-k值发生变化时应重新生成过滤器但旧版未这样做。查看 lib/bup/cmd/bloom.py 的当前逻辑再生判断共有三条分支if b is not None: if len(b) ! rest_count: # 已有条目数 ! 现有 idx 总数 - 再生 elif k is not None and k ! b.k: # 新 k 与已有 k 不同 - 再生 elif (b.bits bloom.MAX_BLOOM_BITS[b.k] and b.pfalse_positive(add_count) bloom.MAX_PFALSE_POSITIVE): # 误判率超限 - 再生 else: # 正常增量更新其中k即-k,hashes选项——“使用的哈希函数个数4 或 5默认自动”lib/bup/cmd/bloom.py。0.30.1 修复的就是第二条elif k is not None and k ! b.k分支之前用户显式把-k从 4 改为 5或反之时旧 bloom 文件会被错误地直接复用导致哈希函数数量与文件不符、误判率异常现在会检测到 k 不匹配并重建过滤器。4.4bup web缺省端口不再引发无关语法错误修复内容命令行只指定 hostname 而未指定端口时不再报出毫不相关的语法错误。旧版中bup web hostname不带端口本应使用默认端口却会抛出一个与端口无关的语法错误提示。0.30.1 修正了参数解析流程让省略端口时走默认值路径。使用提示bup web hostname即可端口省略时按默认端口提供服务。4.5 提交时间戳 UTC 偏移为 0 不再被误认为本地时间修复内容commit date 的 timezone offset 为0时不再在某些情况下被解释为本地时间。含义0000UTC 零偏移此前在某些路径下会被误当作“未指定时区”而套用本地时区导致提交时间展示偏差。0.30.1 保证零偏移严格按 UTC 处理git log中显示的时间戳与本地时区无关。4.6 midx 数据结构mmap 等立即释放与 4.1 一脉相承midx 相关数据结构包括 mmap 映射在close()时立即释放不再等待 Python 垃圾回收。这在长生命周期进程如bup server、bup web、fuse 挂载中尤为重要——mmap 长期不释放会造成地址空间与文件描述符压力。上文 lib/bup/midx.py 的close()即为具体实现。4.7 修复 C 层 stat 调用导致的内存泄漏部分 C 级 stat 调用位于 src/bup 下的 C 扩展实现如_helpers.c、pyutil.c存在内存泄漏0.30.1 已修复。这属于底层内存管理问题影响长期运行进程的内存稳定性对普通用户表现为进程 RSS 缓慢增长对备份服务器等常驻进程意义较大。4.8 manpage 语法问题修复文档层面修复了部分 man page 中的语法问题使 Documentation/man1 下的手册渲染更加规范不影响运行时行为。五、构建系统调整Build system自动化测试平台迁移测试环境从 FreeBSD 11.2 迁移到 FreeBSD 12.1t/test-fuse 可移植性提升修复了与 Fedora 31 的兼容性问题并降低了对本地时区差异的敏感度——这与 4.5 的时区修复相互呼应测试结果不再因机器所在时区不同而抖动内部构建依赖修正若干内部构建依赖关系被修正保证从干净环境构建时依赖解析顺序正确。六、升级与验证建议升级前如使用过 strip/graft 或曾遇到目录元数据异常升级后抽查相关备份的目录条目bup ls -l即可确认是否需要重新保存升级后验证 git 版本判断在PATH中加入带 rc 后缀或带括号备注的 git 版本如模拟git --version输出确认require_suitable_git()不再误拒也可通过设置BUP_GIT_VERSION_IS_FINEtrue跳过检查验证 bloom 再生对同一仓库先后执行bup bloom -k 4与bup bloom -k 5观察日志中出现new k 5 ! existing k 4, regenerating即修复生效lib/bup/cmd/bloom.py验证 vfs 崩溃修复直接运行bup ls /BRANCH/latest在 0.30.1 上应正常列出最新 commit 的链接目标不再出现FakeLink object has no attribute oid资源释放验证在长运行进程如bup midx、bup web中观察/proc/pid/fd与 RSS确认文件描述符与 mmap 在操作结束后即被释放。七、致谢0.30.1 的修复离不开社区贡献发布说明明确致谢了 Aidan Hobson Sayers、Greg Troxel、Johannes Berg、Luca Carlon、Reinier Maas、Rob Browning 与 Wyatt Alt。参考文件索引本版本说明 note/0.30.1-from-0.30.mdgit 版本判定 lib/bup/git.py--fake-valid选项定义与约束 lib/bup/cmd/index.pyvfs FakeLink 与尺寸计算 lib/bup/vfs.py、lib/bup/vfs.pybloom 再生逻辑 lib/bup/cmd/bloom.pymidx 显式释放 lib/bup/midx.pygit 版本检查测试 test/int/test_git.py赞分享灾备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.33.2 版本发布说明POSIX1e ACL 恢复崩溃的修复与元数据处理深度解析bup 0.33.2 版本发布说明POSIX1e ACL 恢复崩溃的修复与元数据处理深度解析 bup 是一款基于 git packfile 格式的高效备份系统灾备CLI存储lnd 0.21.4 版本说明深度解读HTLC 拦截器语义、图数据库迁移修复与 WalletKit 输出租约增强lnd 0.21.4 版本说明深度解读HTLC 拦截器语义、图数据库迁移修复与 WalletKit 输出租约增强 本文基于 lndLightning Net区块链bup bloom 命令详解Bup 仓库布隆过滤器的生成、更新与校验bup bloom 命令详解Bup 仓库布隆过滤器的生成、更新与校验 导读 bup bloom 是备份系统 bup https://link.gitcode.灾备CLI存储上一篇Apache HBase RPC 可插拔认证框架HBASE-23347基于 SASL 的 Provider 扩展机制深度解析下一篇京东自动评价完整指南5分钟告别手动烦恼智能生成真实评论创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考