解决 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

经验总结

  1. ldd 是排查共享库缺失的首选工具ldd $(which buildah) \| grep "not found" 能快速定位所有缺失的库。
  2. GitHub Releases 不一定有二进制包:buildah 的 release 页面 assets 为空,需要自行编译或使用系统包管理器。
  3. apt reinstall 可以恢复被覆盖的系统文件:当二进制被意外替换时,重新安装包是最快的恢复方式。
  4. 从源码编译是获取最新版本的可靠途径:只要 Go 环境就绪,make bin/buildah 一条命令即可完成编译。