最近开始研究 containerd, 按照官网教程 在 Centos7.2 上下载了 containerd-1.3.4.linux-amd64.tar.gz ,解压缩运行程序的时候遇到如下报错信息:

./containerd: symbol lookup error: ./containerd: undefined symbol: seccomp_version

网上查了下,这个错误意思是说系统缺少对应版本的 libseccomp, 有两个可能:

  • 系统没有安装 libseccomp
  • 系统安装的 libseccomp 版本不匹配(较低),建议使用 2.4.2

libseccomp 是什么

library provides an easy to use, platform independent, interface to the Linux Kernel’s syscall filtering mechanism.

它是一个 C 语言开发的 Linux 内核系统调用过滤帮助库,很多容器项目都使用到它,比如 containerd、docker、runc ,其源代码地址为 https://github.com/seccomp/libseccomp

libseccomp 安装

因为 containerd 需要依赖的 libseccomp 较新,经过测试,v2.4.2 可以在 Centos7.2 成功运行,所以我们直接通过源代码来安装。

  • 下载源代码
curl -LO https://github.com/seccomp/libseccomp/releases/download/v2.4.2/libseccomp-2.4.2.tar.gz
  • 解压缩
tar -vxf libseccomp-2.4.2.tar.gz
cd libseccomp-2.4.2
  • 编译构建
./configure --prefix=/usr --disable-static &&  make 
  • 安装
make install 
  • 通过 whereis libseccomp 查看安装目录
libseccomp: /usr/lib/libseccomp.so /usr/lib/libseccomp.la

注意:如果以前使用系统包管理工具安装了低版本的 libseccomp,即使通过编译安装最新版本,还是会报错。

这是因为引用路径的优先级的缘故,其 containerd 还是使用了老版本,故需要先删除系统包管理安装的老版本,删除命令根据操作系统的类别而定,比如 Centos 可以使用 yum remove libseccomp

再次运行 containerd

当安装了 v2.4.2 的 libseccomp 后, 我们再次运行 containerd,报错信息消失。

INFO[2020-06-04T17:47:34.306847085+08:00] starting containerd                           revision=814b7956fafc7a0980ea07e950f983d0837e5578 version=v1.3.4
INFO[2020-06-04T17:47:34.361473441+08:00] loading plugin "io.containerd.content.v1.content"...  type=io.containerd.content.v1
INFO[2020-06-04T17:47:34.361589154+08:00] loading plugin "io.containerd.snapshotter.v1.btrfs"...  type=io.containerd.snapshotter.v1
INFO[2020-06-04T17:47:34.362042869+08:00] skip loading plugin "io.containerd.snapshotter.v1.btrfs"..

参考资料: