尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零构建tini完全指南:CMake配置、多架构编译与DEB/RPM打包全流程

从零构建tini完全指南:CMake配置、多架构编译与DEB/RPM打包全流程 从零构建tini完全指南CMake配置、多架构编译与DEB/RPM打包全流程【免费下载链接】tiniA tiny but valid init for containers项目地址: https://gitcode.com/gh_mirrors/ti/tinitini 是一个「微小但功能完整」的容器 init 进程负责收养僵尸进程和正确转发信号如 SIGTERM。本文将带你从零开始完成 tini 的 CMake 配置解析、本地编译、多架构交叉编译直至生成 DEB/RPM 安装包的全流程。一、为什么需要 tini在容器里直接运行应用时应用进程往往成为 PID 1而普通程序并不具备 init 能力会导致两个经典问题僵尸进程堆积无人回收的子进程最终耗尽 PID 空间信号丢失SIGTERM等信号无法正确传递给子进程容器停止缓慢。tini 只做一件事启动你的子进程然后一边等待它退出一边回收僵尸、转发信号。整个二进制仅约 10KB是极轻量级的方案。二、获取源码与准备构建依赖克隆源码仓库git clone https://gitcode.com/gh_mirrors/ti/tini cd tini构建依赖清单定义在 ci/install_deps.sh核心为build-essential、cmake、rpm编译与打包工具gdb、valgrind、hardening-includes调试与安全加固校验gnupg二进制签名本地构建时执行一次bash ci/install_deps.sh即可自动装齐需要 root 权限。三、CMake 配置解析整个构建逻辑集中在 CMakeLists.txt 中读懂它是理解 tini 构建的关键配置块位置作用版本定义CMakeLists.txt#L5-L7当前版本 0.19.0MINIMAL选项CMakeLists.txt#L10-L14关闭参数解析与详细输出产出极简版Git 版本提取CMakeLists.txt#L17-L37将短 hash 及 dirty 标记注入版本号安全编译标志CMakeLists.txt#L56-L57-Werror -O2 -fstack-protector链接时启用relro并 strip 符号双目标构建CMakeLists.txt#L82-L85同时生成动态版tini与静态版tini-static版本号通过模板 src/tiniConfig.h.in 注入源码--version输出的内容即来源于此。两个构建目标的区别tini动态链接依赖 libc体积约 10KBtini-static静态链接-static标志适合精简基础镜像体积小于 1MB。四、本地编译三步生成 tini在项目根目录执行cmake . make⚠️ 一个容易被忽略的细节如果你的构建系统内核头文件版本低于 3.4需要手动补上 subreaper 相关宏否则编译出的 tini 不支持「子进程再回收」特性export CFLAGS-DPR_SET_CHILD_SUBREAPER36 -DPR_GET_CHILD_SUBREAPER37ci/run_build.sh#L30-L36 中正是通过FORCE_SUBREAPER1默认注入这两个宏的。构建完成后可用 ci/run_build.sh#L174-L180 中的hardening-check校验安全加固是否生效再运行./tini --version验证产物。 如果想构建「极简版」只需配置时加上-DMINIMALON该版本不含-v、-s等参数解析逻辑。五、多架构交叉编译一条命令跨架构出包tini 官方支持 AMD64、ARM、MIPS、POWERPC、s390x 等多种架构。交叉编译依赖在 ci/install_deps.sh#L12-L23 中按ARCH_SUFFIX自动选择对应工具链架构工具链arm64gcc-aarch64-linux-gnuarmhf / armelgcc-arm-linux-gnueabihf / gnueabii386gcc-multilibmuslc-amd64musl-toolsppc64el / s390x / mips64el对应交叉 gcc binutils仓库提供了基于 Docker 的完整构建入口 ddist.sh其工作方式是基于 Dockerfile 构建tini-build_${ARCH_SUFFIX}镜像安装对应交叉工具链挂载源码目录传入ARCH_SUFFIX、ARCH_NATIVE、CC等构建参数容器内执行 ci/run_build.sh把产物按架构后缀命名放入dist/目录。示例在本机编译一个原生 DEB 包可执行ARCH_NATIVE1 ./ddist.sh交叉编译 musl 静态版则传CCmusl-gcc ARCH_SUFFIXmuslc-amd64。六、DEB/RPM 打包全流程打包能力由 CMake 的 CPack 模块驱动关键配置在 CMakeLists.txt#L93-L111CPACK_GENERATOR DEB RPM同时启用两种格式DEB 目标架构设为amd64依赖libc6 ( 2.3.4)RPM 目标架构设为x86_64包名固定为tini_0.19.0LICENSE 与 README 自动附带。在构建目录执行make package即可生成tini_0.19.0.deb和tini_0.19.0.rpm仅ARCH_NATIVE原生构建才会打包见 ci/run_build.sh#L61-L64。其中还有一个小机关ci/util/rpmbuild 是一个 rpmbuild 包装脚本它先修正 spec 文件中的/usr路径前缀再透传给真实的 rpmbuild以兼容旧版 CMake 生成的 spec 模板。七、构建后的自动化验证CI 流程ci/run_build.sh在编译后会自动执行三层验证冒烟测试--version、无参数退出码为 1、管道透传、命令不存在返回 127 等基础行为ci/run_build.sh#L77-L172Python 内层测试由 test/run_inner_tests.py 覆盖僵尸回收、信号转发SIGTERM/SIGUSR1/SIGUSR2、进程组终止、父进程死亡信号、退出码映射等核心场景包内容审计用rpm -qlp与dpkg --contents检查包内文件。本地可通过 run_tests.sh 一键跑完整流程——它分别在FORCE_SUBREAPER0/1两种模式下执行构建ddist.sh与外部测试dtest.sh。八、最终产物与签名构建完成后dist/目录会包含tini、tini-static交叉构建时带架构后缀如tini-amd64tini_0.19.0.deb/tini_0.19.0.rpm原生构建每个文件附带的sha1sum与sha256sum校验文件若提供了 GPG 密钥与口令ci/run_build.sh#L264-L281 还会自动对所有产物做分离签名.asc文件供下游用户校验二进制完整性。常见问题FAQQ1编译出的 tini 不支持 subreaper检查是否按上文导出了PR_SET_CHILD_SUBREAPER相关 CFLAGS这是旧内核头文件环境的常见坑。Q2-e、-g参数在极简版中可用吗不可用。-DMINIMALON会编译掉整个参数解析逻辑这是 CMakeLists.txt#L10-L14 中TINI_MINIMAL宏的作用。Q3为什么 DEB 包架构写死为 amd64CPack 的 DEB 架构字段目前为静态配置CMakeLists.txt#L106 标注了 TODO其他架构用户建议直接使用对应的二进制文件。小结至此你已完成 tini 的完整构建链路CMake 配置 → 本地编译 → 多架构交叉编译 → DEB/RPM 打包 → 自动化测试 → 签名发布。tini 的代码量虽小但其构建系统在安全加固、多架构支持和发布可验证性上做到了工业级水准是学习「小型 C 项目工程化打包」的优质范本。【免费下载链接】tiniA tiny but valid init for containers项目地址: https://gitcode.com/gh_mirrors/ti/tini创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表