Systemd-spawn

Systemd-spawn 可用于在轻量级容器中运行命令或操作系统。在许多方面,它与 chroot 相似,但功能更强大,因为它使用命名空间来完全虚拟化进程树,IPC,主机名,域名以及可选的网络和用户数据库。

Systemd-spawn 将容器中各种内核接口的访问限制为只读,像是 /sys, /proc/sys/sys/fs/selinux。网络接口和系统时钟不能从容器内更改,不能创建设备节点。不能从容器中重启宿主机,也不能加载内核模块。

环境搭建

  1. 在主机中安装systemd-container
  2. 创建Debian容器
  3. 引导容器

在主机中安装systemd-container

sudo apt install systemd-container

这里建议主机启用非特权用户空间,但部分人员仍然认为存在一些安全隐患,因此可以支持 -U 选项

sudo echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/nspawn.conf
sudo systemctl restart systemd-sysctl.service

创建Debian容器

可以使用 debootstrapcdebootstrap 工具创建合适的 Debian 容器。

debootstrap --include=systemd,dbus stable /var/lib/machines/debian

确保 root 用户可以登录到容器。

systemd-nspawn -D /var/lib/machines/debian -U --machine debian
# 允许登录
# `pts/0` 用于 `systemd-nspawn --boot`
# `pts/1` 用于 `machinectl login`
printf 'pts/0\npts/1\n' >> /etc/securetty

引导容器

创建容器后,可以使用实例化的 systemd.servicemachinectlsystemd-nspawn 命令引导容器。

# @ 后面的部分必须与上一步中使用的容器名称匹配
$ systemctl start systemd-nspawn@debian

# 或者

$ machinectl start debian

# 或者
$ systemd-nspawn --boot -U -D /var/lib/machines/debian

这些指令必须使用 root 身份执行。启动后可使用 machinectl shell 进行登录。

常用操作

检查容器状态

若要检查容器的状态,请使用以下命令之一:

machinectl list

systemctl status systemd-nspawn@debian

登录到容器

要登录到正在运行的容器,请执行以下操作:

machinectl login debian

停止容器

若要从主机停止正在运行的容器,请执行以下操作:

systemctl stop systemd-nspawn@debian

或者可以在容器内部进行终止:

machinectl login debian

halt

或者还可以按三次 Ctrl + ]进行终止。

网络

在主机、容器和其他系统之间创建或使用网络有很多选项。与任何网络一样,您需要配置一下内容:

  • 网络接口
  • IP地址
  • 防火墙规则
  • DNS域名

默认情况下,容器共享主机的网络。若使用了--private-networking选项,则主机使用ve-<contrainer_name>@if<X>形式的虚拟接口与容器通信,而容器则使用名为host@if<Y>的虚拟接口:

(on host)
$ ip a show dev ve-debian
77: ve-debian@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether ... brd ff:ff:ff:ff:ff:ff link-netnsid 1

使用主机网络

您可以通过在 /etc/systemd/nspawn/container-name.nspawn 中添加以下行来禁用专用网络并使容器使用主机网络:

[Network]
VirtualEthernet=no

container-name替换为容器的名称。


Systemd-spawn
https://blog.cikaros.top/doc/5548802d.html
作者
Cikaros
发布于
2024年7月8日
许可协议