.. _systemd-nspawn:
=====================
systemd-nspawn
=====================
``systemd-nspawn`` 是一个容器管理器,可以在一个目录结构中运行一个完整操作系统或命令,类似于 ``chroot`` 但是提供了更多安全性。例如, ``chroot`` 只提供了文件系统隔离,但是没有提供 :ref:`cgroup` 和 ``namespaces`` 。
当创建容器是, ``systemd-nspawn`` 需要一个root文件系统以及可以选的 JSON 容器配置文件,这个文件提供了一个 OCI runtime bundle 。 ``systemd-nspawn`` 是一个完全OCI兼容实现,就像类似于 :ref:`runc`
安装
========
- 在 :ref:`ubuntu_linux` 系统中可以通过如下方式安装 ``systemd-nspawn`` (包含在 ``systemd-container`` 默认已经安装):
.. literalinclude:: systemd-nspawn/install_systemd-container
:caption: 安装 ``systemd-container`` 获得 ``systemd-nspawn``
配置
========
``systemd-nspawn`` 容器管理器默认会在以下目录查找配置::
/etc/systemd/nspawn/
/run/systemd/nspawn/
/var/lib/machines/
需要持久化的配置需要存储在 ``/etc/systemd/nspawn/`` 目录
实践
=====
我在 :ref:`android_build_env_ubuntu` 参考 `How to build LineageOS inside a container `_ 发现 ``systemd-nspawn`` 结合 :ref:`debootstrap` 是一个非常轻量级的容器化运行 :ref:`ubuntu_linux` 的方案
- 执行容器启动:
.. literalinclude:: systemd-nspawn/systemd-nspawn_ubuntu-dev
:language: bash
:caption: 执行 ``systemd-nspawn`` 启动 ``ubuntu-dev`` 容器
实际为了方便编译,独立出android和ccache目录:
- 在 :ref:`zfs_startup_zcloud` 基础上 (已经构建了 ``zpool-data`` 的 zpool) 创建独立的卷:
.. literalinclude:: systemd-nspawn/zfs
:caption: 在zfs上创建独立的子卷用于 ``android`` 和 ``ccache``
.. literalinclude:: systemd-nspawn/systemd-nspawn_ubuntu-dev_android_ccache
:language: bash
:caption: 执行 ``systemd-nspawn`` 启动 ``ubuntu-dev`` 容器(提供独立android和ccache目录)
- 此时位于容器内部,执行 ``df -h`` 检查可以看到如下挂载目录:
.. literalinclude:: systemd-nspawn/systemd-nspawn_ubuntu-dev_df_output
:caption: 进入容器内部后检查磁盘卷挂载
:emphasize-lines: 12-14
.. note::
``debootstrap`` 和 ubuntu 的docker容器镜像一样,默认只启用了 ``main`` 仓库,要访问安装所有依赖软件包,例如 :ref:`android_build_env_ubuntu` ,需要添加 ``jammy-updates`` 和 ``jammy-security`` 仓库以及 ``universe`` 分支
参考
======
- `archlinux: systemd-nspawn `_
- `On Running systemd-nspawn Containers `_
- `systemd-nspawn — Spawn a command or OS in a light-weight container `_
- `How to build LineageOS inside a container `_