systemd-nspawn

systemd-nspawn 是一个容器管理器,可以在一个目录结构中运行一个完整操作系统或命令,类似于 chroot 但是提供了更多安全性。例如, chroot 只提供了文件系统隔离,但是没有提供 Kernel Cgroupnamespaces

当创建容器是, systemd-nspawn 需要一个root文件系统以及可以选的 JSON 容器配置文件,这个文件提供了一个 OCI runtime bundle 。 systemd-nspawn 是一个完全OCI兼容实现,就像类似于 runc

安装

  • Ubuntu Linux 系统中可以通过如下方式安装 systemd-nspawn (包含在 systemd-container 默认已经安装):

安装 systemd-container 获得 systemd-nspawn
sudo apt install systemd-container:

配置

systemd-nspawn 容器管理器默认会在以下目录查找配置:

/etc/systemd/nspawn/
/run/systemd/nspawn/
/var/lib/machines/

需要持久化的配置需要存储在 /etc/systemd/nspawn/ 目录

实践

我在 构建Android编译环境(Ubuntu) 参考 How to build LineageOS inside a container 发现 systemd-nspawn 结合 debootstrap 是一个非常轻量级的容器化运行 Ubuntu Linux 的方案

  • 执行容器启动:

执行 systemd-nspawn 启动 ubuntu-dev 容器
systemd-nspawn -D  /var/lib/docker/ubuntu-dev

实际为了方便编译,独立出android和ccache目录:

在zfs上创建独立的子卷用于 androidccache
zfs create zpool-data/android
zfs create zpool-data/ccache
执行 systemd-nspawn 启动 ubuntu-dev 容器(提供独立android和ccache目录)
systemd-nspawn -D  /var/lib/docker/ubuntu-dev \
    --bind=/zpool-data/android:/home/admin/android \
    --bind=/zpool-data/ccache:/home/admin/.ccache
  • 此时位于容器内部,执行 df -h 检查可以看到如下挂载目录:

进入容器内部后检查磁盘卷挂载
Filesystem          Size  Used Avail Use% Mounted on
tmpfs                38G  3.4M   38G   1% /run
/dev/sdb2            32G   24G  5.9G  81% /
tmpfs               189G   12K  189G   1% /dev/shm
tmpfs               5.0M     0  5.0M   0% /run/lock
tmpfs               189G     0  189G   0% /run/qemu
/dev/sdb1           511M  6.1M  505M   2% /boot/efi
/dev/sdb3           187G   94G   92G  51% /var/lib/docker
zpool-data          1.7T   97G  1.6T   6% /zpool-data
zpool-data/y-k8s    1.6T  128K  1.6T   1% /zpool-data/y-k8s
tmpfs                38G  4.0K   38G   1% /run/user/502
/dev/sdb3           187G   94G   92G  51% /var/lib/docker/ubuntu-dev
zpool-data/android  1.6T  128K  1.6T   1% /zpool-data/android
zpool-data/ccache   1.6T  128K  1.6T   1% /zpool-data/ccache

备注

debootstrap 和 ubuntu 的docker容器镜像一样,默认只启用了 main 仓库,要访问安装所有依赖软件包,例如 构建Android编译环境(Ubuntu) ,需要添加 jammy-updatesjammy-security 仓库以及 universe 分支

参考