
从源码构建 KeyDB DEB 包pkg/deb 打包体系全解析【免费下载链接】KeyDBA Multithreaded Fork of Redis项目地址: https://gitcode.com/GitHub_Trending/ke/KeyDB本指南围绕 KeyDB 仓库 pkg/README.md 展开完整讲解如何利用仓库内置脚本与 Debian 打包基础设施在不同发行版与架构上从源码生成.deb安装包。读完本文你将掌握deb-buildsource.sh的完整打包流程、参数语义、目录结构debian与debian_dh9双套方案、命名规范、changelog 生成机制以及打包产物在deb_files_generated中的落位方式可直接用于自己构建 KeyDB 的 Debian 软件包。一、打包体系概览pkg 目录与双套 debian 源布局KeyDB 的 Debian 打包相关文件全部集中在 pkg/deb 目录下其顶层结构如下pkg/deb/ ├── deb-buildsource.sh # 打包主脚本唯一入口 ├── master_changelog # 主变更日志模板含占位符 ├── README.md # 打包说明文档本指南依据 ├── conf/ │ ├── keydb.conf # 安装后落盘到 /etc/keydb 的服务器配置 │ └── sentinel.conf # Sentinel 监控配置 ├── debian/ # 新版打包源debhelper 11bionic/buster 及更新发行版 ├── debian_dh9/ # 旧版打包源debhelper 9xenial/stretch 及更早发行版 └── deb_files_generated/ # 构建完成后 .deb 产物输出目录为什么需要两套 debian 目录debian/目录面向 bionic、buster 及之后的发行版因为其中使用了仅 debhelper 11 才提供的函数例如dh_installsystemd等 systemd 相关辅助功能而debian_dh9/面向 xenial、stretch 等更早的发行版使用 debhelper 9。这两套目录在打包脚本中根据发行版代号自动选择详见下文脚本流程分析。对比两套rules文件可发现新版 pkg/deb/debian/rules 通过override_dh_auto_install额外调用了dh_installsystemd --restart-after-upgrade并在override_dh_auto_test中执行完整测试而旧版 pkg/deb/debian_dh9/rules 中的测试调用被注释掉安装流程也较简单。此外 pkg/deb/debian_dh9/patches 下还携带了多个针对旧发行版的补丁例如0001-fix-ftbfs-on-kfreebsd.patch修复 kfreebsd 上的构建失败0007-Add-support-for-a-USE_SYSTEM_HIREDIS-flag.patch支持使用系统 hiredis0010-Add-support-for-USE_SYSTEM_JEMALLOC-flag.patch支持使用系统 jemalloc0011-Add-support-for-USE_SYSTEM_LUA-flag.patch支持使用系统 Lua0001-fix-ftbfs-on-kfreebsd.patch之外还有0010-Use-get_current_dir_name-over-PATHMAX-etc.patchdebian-packaging/0003-dpkg-buildflags.patch、debian-packaging/0007-Set-Debian-configuration-defaults.patch这些补丁通过debian_dh9/patches/series文件按序应用保证 KeyDB 能在较老的工具链上成功编译。二、环境准备pbuilder 与依赖安装打包前需要先安装 pbuilder 及其它发行版相关的依赖$ sudo apt install pbuilderpbuilder 是打包脚本的核心依赖它负责创建隔离的 chroot 构建环境保证包是在干净的发行版环境中编译避免宿主机的库文件干扰。除此之外构建 Debian 包通常还需要debuild来自devscripts包以及lsb-release脚本用lsb_release读取发行版代号与版本。提示脚本执行过程中会调用sudo pbuilder create、sudo pbuilder --update、sudo pbuilder --build等特权命令因此需要确保当前用户拥有 sudo 权限。三、运行打包脚本deb-buildsource.sh在pkg/deb目录下执行以下命令即可触发完整打包流程$ ./deb-buildsource.sh脚本执行完成后会生成一套完整的目录结构包含.dsc文件、keydb_版本.orig.tar.gz原始源码包为当前发行版与架构生成新的 changelog构建出的 Debian 包最终位于deb_files_generated目录。脚本参数None 与自定义注释deb-buildsource.sh接受 0 个或 1 个参数参数行为不传参自动生成默认注释This is a new source build generated from the deb_build_source.sh script追加到该 deb 包的 changelog你的自定义注释将引号内的注释字符串追加到该 deb 包的 changelogNone不追加注释假设 changelog 中已有针对当前版本的永久条目例如已在 git 仓库中维护好了 changelog从脚本源码 pkg/deb/deb-buildsource.sh 可以看到参数判断逻辑if [ $# -eq 0 ]; then changelog_commentsThis is a new source build generated from the deb_build_source.sh script else changelog_comments$1 fi而注释真正写入 changelog 的条件是if [ $# -eq 0 ]; then sed -i 1s/^/$changelog_str\n/ debian/changelog elif [ $# -eq 1 ] [ $1 ! None ]; then sed -i 1s/^/$changelog_str\n/ debian/changelog fi即只有不传参数或传入非None的字符串时才会把新条目插入到 changelog 顶部传入None则跳过插入依赖仓库中已维护的 changelog 条目。打包示例# 默认注释打包 $ ./deb-buildsource.sh # 带自定义注释打包注释会进入 changelog $ ./deb-buildsource.sh This is a custom build for internal testing # 使用仓库已维护的 changelog不追加新注释 $ ./deb-buildsource.sh None四、脚本内部流程从版本号到 pbuilder 构建深入阅读 pkg/deb/deb-buildsource.sh 可以还原完整的打包流水线主要包括以下几个阶段。1. 提取版本号与发行版信息脚本首先从 src/version.h 中读取KEYDB_REAL_VERSION宏来获得 KeyDB 版本号version$(grep KEYDB_REAL_VERSION ../../src/version.h | awk { printf $3 } | tr -d \) majorv${version:0:1}注意 src/version.h 中KEYDB_REAL_VERSION的默认值是255.255.255正式发布时由发布流程写入真实版本号打包前请确认该文件中的版本号正确。随后根据发行版类型生成不同的版本后缀distnameif [ $distributor Debian ]; then distnamedeb$(lsb_release --release --short | cut -d. -f1)u1 elif [ $distributor Ubuntu ]; then distname~$(lsb_release --codename --short)1 fiDebian生成deb主版本号u1后缀例如 Debian 11bullseye得到deb11u1Ubuntu生成~代号1后缀例如 Ubuntu 20.04focal得到~focal1另外针对 Debian 12bookworm有一处硬编码覆盖distnamedeb12u1。最终包名由pkg_namekeydb-$majorv:$version$distname组成例如keydb-6:6.3.4~focal1。这也是 pkg/deb/debian/control 中Source: keydb包体系命名的直接来源其中6:是上游版本号段epoch用来区分 KeyDB 与 Redis 的版本演进。2. 构建源码树orig tarball debian 源脚本执行cd ../../../回到仓库根目录将整个 KeyDB 源码目录打包为keydb_$version.orig.tar.gz然后建立$pkg_name/tmp构建树mkdir -p $pkg_name/tmp if [[ $codename xenial ]] || [[ $codename stretch ]]; then cp -r debian_dh9 $pkg_name/tmp/debian else cp -r debian $pkg_name/tmp fi cp master_changelog $pkg_name/tmp/debian/changelog mv ../../../keydb_$version.orig.tar.gz ./$pkg_name关键点xenialUbuntu 16.04与 stretchDebian 9自动选用debian_dh9其余发行版选用debian以 pkg/deb/master_changelog 作为 changelog 模板其中含有distribution_placeholder与codename_placeholder两个占位符由脚本后续替换为实际值。3. 生成 changelog 条目脚本构造新的 changelog 头并插入到模板顶部同时替换占位符changelog_strkeydb ($majorv:$version-$build$distname) $codename; urgencymedium\n\n * $version $changelog_comments \n\n -- Ben Schermel beneqalpha.com $date 0000\n\n ... sed -i s/distribution_placeholder/$distname/g debian/changelog sed -i s/codename_placeholder/$codename/g debian/changelog可见 pkg/deb/master_changelog 中的历史条目同样带有distribution_placeholder/codename_placeholder占位符例如keydb (6:6.3.4-1distribution_placeholder) codename_placeholder; urgencymedium脚本会将其整体替换为实际发行版后缀保证整个 changelog 版本号自洽。每次打包都会在顶部追加一条urgencymedium的新条目包含构建号build脚本默认值为1按 KeyDB 惯例通过更新 minor 版本而非构建号来推进版本。4. 生成 .dsc 并进入 pbuilder 构建debuild -S -sa # 生成 .dsc、原始源码包等 Debian 源包所需文件 sudo pbuilder create --distribution $codename # 创建 chroot 构建环境 sudo pbuilder --update sudo pbuilder --build *.dsc --logfile /mnt/pbuilderlog.log其中debuild -S -sa生成包含全部源码的源包.dsc文件xenial 会额外附加 universe/multiverse 镜像源。构建日志写入/mnt/pbuilderlog.log便于排错。5. 收集产物并清理cp /var/cache/pbuilder/result/*$version*.deb ../deb_files_generated sudo pbuilder clean cd ../ rm -rf $pkg_name最终所有匹配当前版本的.deb包被拷贝到deb_files_generated目录随后清理 pbuilder 缓存与临时构建树。已测试的发行版脚本作者声明已在以下发行版上完成测试Ubuntuxenial / bionic / focalDebianstretch / buster / bullseye五、生成的二进制包组成根据 pkg/deb/debian/control 的定义构建产物由 4 个二进制包组成包名说明keydb元包metapackage依赖keydb-server方便一次性安装keydb-server服务器主体依赖keydb-toolskeydb-sentinelSentinel 监控组件依赖keydb-toolskeydb-tools命令行客户端与运维工具其中keydb-tools的安装清单见 pkg/deb/debian/keydb-tools.install包含/usr/bin/keydb-benchmark /usr/bin/keydb-check-aof /usr/bin/keydb-check-rdb /usr/bin/keydb-cli /usr/bin/keydb-server /usr/bin/keydb-sentinel /usr/bin/keydb-diagnostic-tool以及 bash 补全脚本debian/bash_completion.d/*→/usr/share/bash-completion/completions。keydb-server的安装清单 pkg/deb/debian/keydb-server.install 则把 systemd 服务文件安装到/lib/systemd/system/并把 pkg/deb/conf/keydb.conf 安装到/etc/keydb/keydb.conf。每个包还配有独立的 man page、logrotate 配置、postinst/postrm维护脚本。以 pkg/deb/debian/keydb-server.postinst 为例安装后会自动创建keydb系统用户并通过dpkg-statoverride将/etc/keydb/keydb.conf的属主设为keydb:keydb、权限640最后执行systemctl daemon-reload。debian_dh9版本则额外包含keydb-server.init/keydb-sentinel.initinit.d 脚本见 pkg/deb/debian_dh9适配旧发行版无 systemd 的场景。构建选项从两套rules文件可以看出打包时启用的构建选项export BUILD_TLSyes export USE_SYSTEMDyes export ENABLE_FLASHyes export DEB_BUILD_MAINT_OPTIONS hardeningall export DEB_LDFLAGS_MAINT_APPEND -ldl -latomic $(LUA_LDFLAGS)即启用 TLS 支持、启用 systemd 集成、启用 KeyDB FLASH 存储特性并开启全量安全加固hardening。链接参数追加-ldl -latomic。构建还支持DEB_BUILD_OPTIONSparallelN并行编译以及nocheck选项跳过测试。新版 pkg/deb/debian/rules 的测试阶段会执行./runtest、./runtest-cluster、./runtest-sentinel三个测试套件失败不中断打包|| true同时 pkg/deb/debian/tests/control 定义了 autopkgtest 测试覆盖keydb-cli、benchmark、check-aof、check-rdb 四个场景。六、安装与使用生成的包构建完成后在deb_files_generated目录中会出现形如keydb-server_6:6.3.4-1~focal1_amd64.deb的文件具体版本、发行版与架构取决于构建环境。安装方式$ sudo apt install ./deb_files_generated/keydb-server_*.deb或使用dpkg$ sudo dpkg -i deb_files_generated/keydb-server_*.deb安装后keydb-server由 systemd 管理systemctl start keydb-server配置文件位于/etc/keydb/keydb.confpkg/deb/conf/keydb.conf 是完整示例配置涵盖网络、TLS、持久化、复制、FLASH 存储等全部指令运维工具keydb-cli、keydb-benchmark、keydb-check-aof、keydb-check-rdb、keydb-diagnostic-tool安装到/usr/bin。七、常见问题与注意事项版本号来源打包版本取自 src/version.h 的KEYDB_REAL_VERSION发布打包前务必确认该宏为真实版本号而非开发占位值。changelog 占位符不要直接编辑debian/changelog中的distribution_placeholder/codename_placeholder脚本运行时会自动替换若要长期维护版本条目应更新 pkg/deb/master_changelog。None参数的使用当且仅当 master_changelog 中已为当前版本写好正确条目时才应传None否则请传入自定义注释或留空使用默认注释。发行版兼容性xenial/stretch 使用debian_dh9debhelper 9其余发行版使用debiandebhelper 11新发行版迁移时需关注 debhelper 版本与 systemd 集成差异。构建环境要求需要sudo权限运行 pbuilder构建日志位于/mnt/pbuilderlog.log产物在deb_files_generated临时构建树会在结束时自动清理。脚本定位deb-buildsource.sh假定从pkg/deb目录运行且仓库根目录下存在KeyDB目录结构脚本通过cd ../../../定位源码请勿改变目录层级关系。通过以上流程你可以在 Ubuntuxenial/bionic/focal与 Debianstretch/buster/bullseye环境中从源码构建出一套完整的、带 systemd 集成与安全加固的 KeyDB Debian 软件包供内网部署或二次分发使用。【免费下载链接】KeyDBA Multithreaded Fork of Redis项目地址: https://gitcode.com/GitHub_Trending/ke/KeyDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考