systemd-nspawn¶
systemd-nspawn
是一个容器管理器,可以在一个目录结构中运行一个完整操作系统或命令,类似于 chroot
但是提供了更多安全性。例如, chroot
只提供了文件系统隔离,但是没有提供 Kernel Cgroup 和 namespaces
。
当创建容器是, systemd-nspawn
需要一个root文件系统以及可以选的 JSON 容器配置文件,这个文件提供了一个 OCI runtime bundle 。 systemd-nspawn
是一个完全OCI兼容实现,就像类似于 runc
安装¶
在 Ubuntu Linux 系统中可以通过如下方式安装
systemd-nspawn
(包含在systemd-container
默认已经安装):
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 -D /var/lib/docker/ubuntu-dev
实际为了方便编译,独立出android和ccache目录:
在 ZFS快速起步(zcloud) 基础上 (已经构建了
zpool-data
的 zpool) 创建独立的卷:
zfs create zpool-data/android
zfs create zpool-data/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-updates
和 jammy-security
仓库以及 universe
分支