containerd 是 Docker 的基础(containerd VS Docker)。今天尝试了在新世界 Archlinux 上构建并使用 containerd + nerdctl,因为我发现源里面有 runc 了。但是 containerd 或者 Docker 的那堆东西还是没有的。
然后我们需要解决 nerdctl -> containerd / buildkit -> containers-common -> netavark / cni-plugins 的依赖链。
netavark
netavark 是容器网络栈,它是 rust 写的。构建的时候首先的问题是 CARCH=loong64
,而 rust 里面龙芯架构叫做 loongarch64
,这个手动指定一下就可以了。
然后会出现依赖的两个版本的 nix(不是 nixos 的 nix)一堆常量没有定义的问题,这个就手动打开出错的文件,比如说 ~/.cargo/registry/src/github.com-1ecc6299db9ec823/nix-0.23.1/src/sys/ioctl/linux.rs
,然后找到前面有一些架构相关的部分。因为龙芯是中国 RISC-V,就把 loongarch64
写在 riscv64
边上好了,像这样
#[cfg(any(target_arch = "x86",
target_arch = "arm",
target_arch = "s390x",
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "riscv64",
target_arch = "loongarch64"))]
mod consts {
然后编译就过了。
然后 containers-common 是 any 包,直接偷
sudo pacman -U https://archlinux.org/packages/community/any/containers-common/download/
containerd & buildkit
这两个包一个是最主要的容器服务,一个是管构建的。它们是用 go 写的,所以照常进行 net 和 sys 两个模块的替换。然后它们都会依赖一个叫做 bbolt 的模块,它的 master 分支已经加入了龙芯支持的代码,但是还没有发布,我们手动获取最新版本。
编辑那个 go.mod
文件,把 bbolt 那行改成这样
go.etcd.io/bbolt v1.3.7-0.20221114114133-eedea6cb26ef
然后执行这个命令更新一下 lock 文件
go get go.etcd.io/bbolt
然后可能有一个 buildmode=pie
之类的在 PKGBUILD 里面,龙芯不支持,把它删掉。
nerdctl
这个就比较简单了,buildmode=pie
去掉就可以构建成功了
cni-plugins
这个依赖没有明写,但是跑容器的时候就需要了
它也是 buildmode=pie
和 sys / net 这两个问题,但是这个修改之后需要运行一下 go mod vendor
来同步一下 vendor/modules.txt
凌莞最近正在做一套新的软件源构建系统,不再使用 GitHub Actions 环境,直接在本地机器上构建,并且引进一些新的机制来提供一个更稳定并且支持更广泛的凌莞源。这次大概会实现 loong64
和 riscv64
架构的持续构建(以前是手动传包的),以及大概会增加 manjaro,ubuntu 等系统。大概敬请期待吧
目前我的源里面那个 loongarch64
还是改名之前的版本,应该有好多东西都 break 了。目前也没准备在旧环境下增加 loong64
的支持。等新版本出来了就有了