为Incus构建Distrobuilder

Distrobuilder作为构建Incus/LXC容器镜像的主要工具,竟然只通过Snap商店提供预编译的二进制包。

岂有此理,让我们设置一个Distrobuilder构建环境吧!一切其实很简单!

启动基础容器

当然,构建一系列动作都可以在本机上直接进行。如果决意如此,请自动忽略本文中容器相关的操作。

不过,Distrobuilder是用Golang编写的程序,因此我们完全可以在容器中构建完成后,移动到主机系统中运行。

既然,构建生成的可执行文件要在主机系统中运行,那当然更推荐设置一个和主机系统相符或接近的容器环境。

例如,我的主机系统是Debian,那么现在一个Debian容器构建环境将具备更好的兼容性。

1
incus launch images:debian/12 go-dev

安装容器基础软件

由于Debian Bookworm中的golang-go软件包版本号过低,不满足distrobuilder的最低要求版本1.21,因此需要先安装好系统基础组件,稍后自行下载golang编译器。

1
2
3
4
5
cat <<EOF | incus exec go-dev /bin/bash
sed -i 's/deb.debian.org/mirrors.bfsu.edu.cn/g' /etc/apt/sources.list
apt-get update
apt-get -y install debootstrap rsync gpg squashfs-tools git make build-essential
EOF

不要遗漏构建基础套件

对于手动安装golang编译器的用户,请务必记得安装build-essential或其他构建基础套件!

安装Golang套件

1
2
3
4
cat <<EOF | incus exec go-dev -- /bin/bash
rm -rf /usr/local/go && wget -qO- https://go.dev/dl/go1.22.5.linux-amd64.tar.gz | tar xz -C /usr/local
echo 'export PATH=\$PATH:/usr/local/go/bin' >> /root/.bashrc
EOF

如有需要,可以将上述下载链接更换为镜像站链接。

获取distrobuilder源代码

直接前往Releases - lxc/distrobuilder下载最新的源代码包。

如果在本机上下载完成了,可以推送到容器中:

1
incus file push distrobuilder-distrobuilder-3.0.tar.gz go-dev/root/

执行incus exec go-dev -- /bin/bash进入容器,接着执行:

1
2
3
4
mkdir -p $HOME/go/src/github.com/lxc/
cd $HOME/go/src/github.com/lxc/
tar xzf /root/distrobuilder-distrobuilder-3.0.tar.gz
mv distrobuilder-distrobuilder-3.0 distrobuilder

配置go语言资源代理(可选)

以南京大学镜像站为例:

1
2
go env -w GO111MODULE=on
go env -w GOPROXY="https://repo.nju.edu.cn/go/,direct"

开始编译!

1
2
cd distrobuilder/
make

试运行

1
2
cd ~/go/bin/
./distrobuilder --help

若能成功运行,就可以拉回本机使用了。需要回到主机运行:

1
incus file pull go-dev/root/go/bin/distrobuilder .

容器也可以随之摧毁:

1
incus delete go-dev -f