在 Debian 12 上编译安装最新版 Buildah 1.44.0
☰
解决
libsubid.so.5缺失错误,并升级到最新版本的全过程记录。
问题背景
在 Debian 12 (bookworm) 上执行 buildah -v 时遇到以下错误:
buildah: error while loading shared libraries: libsubid.so.5: cannot open shared object file: No such file or directory
用 ldd 检查依赖后发现三个缺失项:
| 缺失的库 | 原因 |
|---|---|
libsubid.so.5 |
Debian 12 只有旧版本,不兼容 |
libgpgme.so.45 |
Debian 12 只有 libgpgme.so.11 |
GLIBC_2.38 |
Debian 12 的 GLIBC 版本是 2.36 |
根因分析
/usr/bin/buildah 二进制文件被替换成了针对较新系统(如 Debian 13/trixie 或 Ubuntu 24.04)编译的版本,与当前 Debian 12 系统不兼容。
虽然 apt 显示 buildah 包版本为 1.28.2+ds1-3+b1(来自 bookworm 仓库),但磁盘上的二进制文件已被覆盖。
解决步骤
第一步:恢复系统包版本(临时修复)
1sudo apt-get install --reinstall buildah -y
此时 buildah -v 可以正常输出了,但版本是 1.28.2,而最新版是 1.44.0。
第二步:从源码编译最新版
由于 buildah 官方 GitHub Releases 不提供预编译的静态二进制包(assets 为空),只能从源码编译。
2.1 安装编译依赖
1sudo apt-get install -y \
2 libseccomp-dev \
3 libgpgme-dev \
4 libdevmapper-dev \
5 pkg-config
2.2 克隆源码
1git clone --depth 1 --branch v1.44.0 \
2 https://github.com/containers/buildah.git \
3 /tmp/buildah
如果网络受限,可配置代理:
1ALL_PROXY=socks5://proxy_ip:port git clone ...
2.3 编译
1cd /tmp/buildah
2make bin/buildah
编译产物位于 bin/buildah,包含的特性标签:
seccomp— 安全计算模式支持exclude_graphdriver_btrfs— 排除 btrfs 存储驱动libsqlite3— SQLite 支持
2.4 安装
1sudo cp /tmp/buildah/bin/buildah /usr/bin/buildah
2.5 验证
1$ buildah -v
2buildah version 1.44.0 (image-spec 1.1.1, runtime-spec 1.3.0)
2.6 清理
1rm -rf /tmp/buildah
环境信息
| 项目 | 版本 |
|---|---|
| 操作系统 | Debian 12 (bookworm) |
| 架构 | x86_64 |
| Go 版本 | 1.26.4 |
| 旧 buildah | 1.28.2 |
| 新 buildah | 1.44.0 |
经验总结
ldd是排查共享库缺失的首选工具:ldd $(which buildah) \| grep "not found"能快速定位所有缺失的库。- GitHub Releases 不一定有二进制包:buildah 的 release 页面 assets 为空,需要自行编译或使用系统包管理器。
apt reinstall可以恢复被覆盖的系统文件:当二进制被意外替换时,重新安装包是最快的恢复方式。- 从源码编译是获取最新版本的可靠途径:只要 Go 环境就绪,
make bin/buildah一条命令即可完成编译。
