Systemd-spawn
Systemd-spawn 可用于在轻量级容器中运行命令或操作系统。在许多方面,它与 chroot
相似,但功能更强大,因为它使用命名空间来完全虚拟化进程树,IPC,主机名,域名以及可选的网络和用户数据库。
Systemd-spawn 将容器中各种内核接口的访问限制为只读,像是 /sys
, /proc/sys
和 /sys/fs/selinux
。网络接口和系统时钟不能从容器内更改,不能创建设备节点。不能从容器中重启宿主机,也不能加载内核模块。
环境搭建
- 在主机中安装
systemd-container
- 创建Debian容器
- 引导容器
在主机中安装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容器
可以使用 debootstrap
或 cdebootstrap
工具创建合适的 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.service
、machinectl
或 systemd-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
替换为容器的名称。