拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

bup 0.33 升级指南:Python 3 化与二进制化改造、关键缺陷修复及构建系统变更全解析

bup 0.33 升级指南:Python 3 化与二进制化改造、关键缺陷修复及构建系统变更全解析 灾备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 是 bup 备份系统基于 git packfile 格式、支持增量保存与全局去重的高效备份工具的一次里程碑式发布它彻底告别 Python 2、将bup可执行文件从 Python 脚本改为真正的二进制程序并将 Python 解释器的选择从PYTHON环境变量迁移到BUP_PYTHON_CONFIG。本文基于仓库内 note/0.33-from-0.32.md 发布说明结合 configure、lib/cmd/bup.c、DESIGN.md、README.md 等源码与文档逐条剖析 0.33 的新特性、bug 修复与构建变化并顺带覆盖 0.33.1见 note/0.33.1-from-0.33.md的 ACL 恢复修复为从 0.32 升级的用户提供一份可直接对照的清单。一、版本定位0.33 在 bup 演进中的意义在阅读本仓库的 note 目录时可以看到bup 的发布说明以0.27.1-from-0.27、0.28-from-0.27.1…… 直到0.33-from-0.32、0.33.1-from-0.33的系列文档构成。0.33 相比 0.32 的改动集中在三块运行时基础设施重构强制 Python 33.7 及以上、配置期解释器选择方式变更、可执行文件二进制化行为与界面优化bup ls、bup ftp、bup web、bup midx等命令的细节调整及性能改善一批实质性的 bug 修复涉及文件权限、签名提交、tag、save 竞态、packfile 命名等与备份正确性直接相关的缺陷。下文按这三个维度展开。二、Python 3.7彻底告别 Python 20.33 最根本的改动是Python 3 成为必需且要求 3.7 或更新版本。这意味着使用 Python 2 构建 bup 的路径在 0.33 已被彻底移除同时从 lib/cmd/bup.c 的主程序源码可以看到bup 在主程序中对 Python 版本做了编译期硬性检查当PY_MAJOR_VERSION 3或PY_MINOR_VERSION 8时会直接输出#error Halting并中止编译。也就是说实际编译环境还进一步收紧到了Python 3.8发布说明以3.7 或更新为最低承诺而仓库当前代码在编译期拒绝 3.8 以下版本二者结合理解即可。0.33.1 还同步调整了 configure 的探测顺序开始查找python3.11-config并停止查找python3.6-config因为 bup 已要求 3.7见 note/0.33.1-from-0.33.md。三、配置期变化BUP_PYTHON_CONFIG取代PYTHON3.1 行为变更在 0.32 及更早版本中运行./configure时通过环境变量PYTHON决定 bup 使用的 Python。从 0.33 开始Python 版本不再由PYTHON决定而是由配置期选中的python-config决定。你可以通过设置环境变量BUP_PYTHON_CONFIG来指定具体的python-config可执行文件例如BUP_PYTHON_CONFIGpython3.9-config ./configurepython-config是 Python 官方随解释器发布的构建辅助脚本pythonX.Y-config负责输出对应版本解释器的编译参数--cflags与链接参数--ldflags。选择不同的python-config也就意味着 bup 最终链接到不同的libpython。3.2 configure 源码层面的实现在 configure 中可以看到完整的探测逻辑若设置了BUP_PYTHON_CONFIG则通过type -p校验其可执行性非法值会直接报错退出否则按python3.14-config→python3.13-config→ … →python3.7-config的顺序逐一探测for py_min_ver in 14 13 12 11 10 9 8 7找到第一个可用者即停止若上述都不可用回退到通用的python3-config最后调用所选python-config获取 cflags / ldflags并尝试--embed变体较早的 python-config 不支持--embed此时会自动回退到不带--embed的参数。配置完成后选中的python-config路径会写入config/config.var/bup-python-config见 configure。因此想要查看当前 bup 实际使用的是哪个 Python 解释器可以查看 configure 输出或直接读取该文件若要切换解释器重新运行./configure即可。这一点在 README.md 中也有对应说明。3.3 DESIGN.md 的佐证在 DESIGN.md 的架构说明中对这一设计有更清晰的阐述The version of python bup uses is determined by thepython-configprogram selected by./configure. It tries to find a suitable default unlessBUP_PYTHON_CONFIGis set in the environment.这种由 python-config 决定解释器版本的设计与 0.33 的另一个核心改动可执行文件二进制化是配套的详见下一节。四、bup可执行文件二进制化4.1 从 Python 脚本到 C 二进制0.33 之前bup是一个 Python 脚本通过#!/...的 shebang 由系统中的 Python 解释器直接执行。0.33 起bup是一个真正的二进制程序实际影响包括运行时使用的 Python 版本由该二进制链接的libpython决定而libpython又由配置期选中的python-config指定进程列表中显示为bup而不是一长串python ...调用便于用户用ps等工具识别和管理备份进程。4.2 主程序源码剖析这一机制的实现就在 lib/cmd/bup.c 中它是一个精悍的 C 主程序通过PyImport_AppendInittab(bup_main, ...)注册一个内建 Python 模块bup_mainlib/cmd/bup.c该模块将二进制级的命令行参数以 bytes 形式暴露给 Python 层——这正是 bup 能安全处理任意字节序列路径包括非 UTF-8 文件名的关键在启动时把自身可执行文件所在目录的上级lib目录追加到PYTHONPATHprepend_lib_to_pythonpath见 lib/cmd/bup.c从而在运行时定位lib/bup下的 Python 模块最终构造-m bup.mainPython 3.11 还会额外加入-P安全标志见 lib/cmd/bup.c并调用Py_BytesMain启动 Python 运行时将控制权交给lib/bup/main.py。对应地DESIGN.md 详细解释了选择这种小型 C 启动器 Python 主体架构的三个动机避免 Python 在某些非 Unicode 友好的命令行参数上崩溃路径在 bup 中是任意字节序列这一点至关重要应对 Python 3.9 系列中对进程参数列表操作能力的破坏等上游变动获得更大灵活性不再受#!/...路径变化影响——无论/usr/bin/python或/usr/bin/python3如何从 2 变 3、或 3.5 变 3.20都不会影响已构建好的 bup 二进制。4.3 升级时的注意点对于从 0.32 升级的用户请务必注意0.33 的构建产物bup 二进制与某个具体 Python 版本强绑定。若系统升级了 Python 小版本为稳妥起见应重新运行./configure并重新构建而不是继续沿用旧的二进制。五、命令行为与界面改进5.1bup ls多路径输出更贴近系统lsbup ls在同时列出多个路径时现在会在每个路径的内容之前先输出该路径本身与系统ls的行为一致。例如bup ls a b会先显示a:与b:这样的路径头再列出各自内容便于区分多路径输出中每部分的归属。5.2bup ftpls 尊重工作目录bup ftpbup 内置的类 FTP 交互式浏览器中的ls命令现在应正确遵守cd设置的当前工作目录并且该工作目录已被加入交互提示符例如提示符会形如bup-ftp:/some/dir让用户在交互式浏览时始终清楚自己所在位置。5.3bup web界面微调0.33 对bup web基于 HTTP 的仓库浏览界面做了一些小的界面改动。仓库中对应的实现位于 lib/bup/cmd/web.py界面模板在 lib/web。注意发布说明用词为 some minor changes即属于体验层面的微调不影响功能用法。5.4bup midxindex-cache 退出 --dir 默认集合index-cachebup 的.idx索引缓存文件不再包含在bup midx --dir的默认处理范围内。也就是说使用--dir指定目录时bup 不再默认把该目录下的 index-cache 纳入合并范围避免对缓存文件做不必要的处理行为更可控。5.5 性能与资源占用0.33 将相当数量的操作从 Python 迁移到了 C 实现bup 的 C 加速扩展位于 lib/bup/_hashsplit.c、lib/bup/_helpers.c、lib/bup/bupsplit.c 等并对 VFS虚拟文件系统见 lib/bup/vfs.py做了一系列改进因此性能可能有所提升同时 bup 更加注意及时、谨慎地释放资源如内存整体资源占用可能改善。发布说明对此用的是 may have improved 这类审慎表述实际收益取决于具体负载。六、关键 Bug 修复逐一解读0.33 修复的缺陷大多直接影响备份的正确性与可恢复性下面按主题逐条说明。6.1 文件创建权限尊重 umask 与目录 sgid修复前bup 通过mkstemp创建新文件如新的 packfile导致文件只能被当前用户读取且不遵循进程的 umask 与目录的 sgidset-group-ID位。修复后bup 创建新文件时会尊重当前 umask、目录 sgid 位等权限语义。这对多用户共享仓库的场景很重要——否则其他用户无法读取新生成的 packfile备份的共享与恢复都会出问题。6.2 支持含签名提交的仓库bup 现在应能正确处理包含PGP 签名提交signed commits的仓库。此前遇到签名提交时可能出错影响读取或遍历此类仓库。这使得 bup 可以配合使用签名提交的 git 风格工作流。6.3bup tag改用git update-refbup tag原先直接写入松散引用loose refs现在改为依赖git update-ref来管理标签引用从而可以正确处理packed refs打包引用即 refs 被压缩进.git/packed-refs的情况。相关命令实现位于 lib/bup/cmd/tag.py其底层 git 操作由 lib/bup/git.py 提供。6.4bup save更严格地检测索引后类型变化bup save现在会更谨慎地检测并报告错误若某个路径在bup index之后、bup save期间其类型符号链接、普通文件、目录等发生了变化bup 会记录错误并跳过该路径而不是用错误的类型去生成备份数据。6.5 消除 save 的符号链接 / 大小竞态窗口修复前若文件系统在 save 过程中的错误时刻发生变化存在一个很窄的时间窗口可能导致 bup 为同一路径存储相互矛盾的符号链接目标或存储相互矛盾的大小信息metadata 记录中的大小与 packfile 中符号链接 blob 的大小不一致。修复后该竞态窗口被消除metadata 记录与 packfile 数据保持一致。6.6bup fuse与 VFStag 相关提交读取不再卡死修复前一次未完成的、与标签tags关联的提交读取之后bup fuse将 bup 仓库挂载为 FUSE 文件系统可能变得不可用。修复后该问题得到修复。由于底层问题出在 VFS其他依赖 VFS 的命令也可能同样受益。VFS 实现在 lib/bup/vfs.py。6.7 packfile 命名对齐 git修复前bup 仅根据排序后的对象列表计算 SHA1 来命名 packfile参照git-index-pack(1)的做法。修复后bup 的 packfile 命名与 git 一致——git 将整个 pack 文件纳入哈希计算。这意味着 bup 生成的 packfile 文件名现在与 git 自身的计算结果相符仓库能被 git 生态工具更一致地识别。6.8bup midx--dir与 idx 文件可以共存修复前向bup midx同时传入 idx 文件和--dir无法正常工作。修复后两者可以正确组合使用。0.33 中bup midx相关的另一个变化见上文 5.4index-cache 退出--dir默认集合。6.9bup index --print --longPython 3 下的字段格式bup index --print --long输出中的 mode 字段此前在 Python 3 下格式不正确——原因是 Python 3 修改了oct()的格式行为不再带前导0。0.33 修复了该格式化问题mode 字段现在能正确显示。6.10 资源释放更及时0.33 包含一系列让 bup更谨慎、更及时地释放资源例如内存的改动整体资源占用特别是长期运行场景可能有所下降。6.11 附0.33.1 的 ACL 恢复修复0.33 系列的后续补丁作为升级参考紧随其后的 0.33.1note/0.33.1-from-0.33.md修复了 POSIX 1e ACL 恢复的两个问题如果你用 bup 保存过带 ACL 的 Linux 数据务必升级到 0.33.1 或更高版本类型混淆此前 bup 错误地把默认 ACLACL_TYPE_DEFAULT当作访问 ACLACL_TYPE_ACCESS恢复当两者同时存在时会先恢复访问 ACL、再把默认 ACL 当作访问 ACL 恢复。修复后每种 ACL 都会以正确的类型恢复。该问题只影响 bup 当前支持 ACL 的平台主要就是 Linux因为实现依赖acl_extended(3)等非标准函数。分隔符错误bup 此前以换行符作为acl_to_any_text(3)输出的分隔符存储 ACL而标准以及恢复依赖的acl_from_text(3)要求使用逗号。修复后 bup 改用逗号并在恢复时尽可能转换旧格式若旧条目本身含逗号无法转换bup 会报错并跳过该条目——这意味着在个别平台上相关旧备份的恢复可能失败需要按输出错误处理。ACL 相关的实现证据可在 lib/bup/metadata.py 与配置探测configure 中对 libacl 与完整 ACL 支持的检测中找到。七、构建与安装变化0.33 在构建体系上有五项可见改动升级构建脚本时需要逐一核对。7.1--with-pylint[yes|no|maybe]./configure新增--with-pylint选项取值与含义取值含义yes强制要求并运行 pylint找不到则配置失败no明确禁用 pylintmaybe默认可用则运行不可用则跳过在 configure 中可以看到默认值with_pylintmaybe及其解析逻辑配置结果写入config/config.var/with-pylint见 configure。pylint 的实际调用入口是 GNUmakefile 中的./pylint lib规则仓库根目录的 pylint 脚本配合 dev/have-pylint 检测是否可用。如果希望跳过 lint 直接跑测试也可以参照 HACKING.md 使用make check。7.2 编译标志跨 make 调用持久化修复前./configure时设置的环境变量只影响配置过程。修复后./configure时设置的CC、CPPFLAGS、CFLAGS、LDFLAGS会被保存并在后续每次make调用中继续生效。这些值会写入config/config.vars见 configure由 GNUmakefile 读取。这意味着你不必在每次make时重复设置编译标志。注意根据 README.md 的说明也可以在单个make调用上临时覆盖例如make CFLAGS-O0 check但若要通过 configure 持久化请用CFLAGS-O0 ./configure的形式。7.3 非 GNU make 支持构建过程现在应能工作在make不是 GNU Make 的系统上——仓库中的Makefile会自动把构建重定向到GNUmakefile。这放宽了对构建工具链的要求例如某些 BSD 系统。7.4 PANDOC 路径可含空格文档构建所依赖的PANDOC工具路径现在可以包含空格修复了将 bup 安装在含空格路径下时的文档生成问题。7.5 0.33.1 的构建补充MAKEpath ./configure ...现在支持相对路径见 note/0.33.1-from-0.33.mdconfigure 的 python-config 探测顺序调整见上文第三节测试框架开始支持pytest 7仓库根目录的 pytest、pytest.ini 与 conftest.py 是相关入口。八、从 0.32 升级的实操清单综合以上内容从 0.32 升级到 0.33建议直接到 0.33.1时建议按如下顺序操作准备 Python 3.7 环境仓库当前代码编译期要求 3.8并确认系统存在对应的python3.X-config清理旧的配置状态make clean按 README.md 的说明会清除配置然后重新运行BUP_PYTHON_CONFIGpython3.11-config ./configure # 按需指定版本若需要 lint 控制追加--with-pylintno等选项若需要自定义编译参数在 configure 时一并设置CC/CPPFLAGS/CFLAGS/LDFLAGS它们会在后续make中保持重新构建并安装make make install可用DESTDIR/PREFIX指定安装位置详见 README.md验证所选解释器查看 configure 输出或config/config.var/bup-python-config验证进程表现ps中应看到bup而非python调用若仓库中含签名提交、共享目录、ACL 数据、符号链接等特殊内容建议先跑一次完整的bup indexbup savebup restore或bup fscklib/bup/cmd/fsck.py自检确认 packfile 命名、权限、ACL 恢复等修复在真实数据上生效。九、总结bup 0.33 是一次打地基式的版本升级Python 3.7 强制要求、BUP_PYTHON_CONFIG取代PYTHON、可执行文件二进制化这三项基础设施改动为后续版本的稳定性与可维护性奠定了基础而 umask/sgid 权限、packfile 命名对齐 git、save 竞态窗口、签名提交与 packed refs 支持等一批修复则直接提升了备份数据在真实复杂环境中的正确性。结合 0.33.1 的 ACL 恢复修复0.33 系列值得所有 0.32 用户认真对待按上文清单完成构建与验证后再投入生产使用。赞分享灾备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点击查看免费下载相关推荐Vitess v20.0.3 补丁版本解读关键缺陷修复、稳定性改进与升级建议Vitess v20.0.3 补丁版本解读关键缺陷修复、稳定性改进与升级建议 导读 本文基于 Vitess 20.0 系列的第三个补丁版本 v20.0.3 的数据库分布式数据库云原生后端数据存储ClickHouse v25.4.3.22-stable 版本解析性能优化、访问控制改进与关键缺陷修复ClickHouse v25.4.3.22 stable 版本解析性能优化、访问控制改进与关键缺陷修复 本文基于官方仓库 docs/changelogs/v2数据库OLAP列式数据库大数据实时分析数据分析Eclipse Mosquitto 2.0.2 / 2.0.1 发布解读TLS-DHE、WebSockets 关键缺陷修复与构建改进Eclipse Mosquitto 2.0.2 / 2.0.1 发布解读TLS DHE、WebSockets 关键缺陷修复与构建改进 2020 年 12 月物联网消息队列后端上一篇SUSFS4KSU KernelSU 模块隐藏 Root 检测 3 步上手完整指南下一篇Pandoc 缩进 HTML 块内的 Markdown 解析从回归修复到命令测试用例1841创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表