nspawn
systemd-nspawn 容器安装与使用指南
使用 systemd 原生的轻量级容器管理工具 — 无需 Docker
一、概述
systemd-nspawn 是 systemd 套件自带的轻量级容器管理工具。
它基于 Linux 内核的 namespace 技术,可以在隔离的文件系统环境中运行一个完整的操作系统实例。
与 Docker 不同,nspawn 不需要守护进程,也不需要镜像仓库——它直接操作目录树。
nspawn 的核心能力:
- 基于目录的容器——一个完整的 Linux 根文件系统就是一个"容器"
- 支持运行 systemd 作为 init 系统(完整容器体验)
- 无需额外守护进程,直接由 systemd 管理
- 与 machinectl、systemd-networkd 深度集成
- 支持 cgroup v2、用户命名空间、专用网络等
二、安装 systemd-nspawn
2.1 检查是否已安装
绝大多数现代 Linux 发行版默认已安装 systemd,因此 nspawn 一般已可用:
systemd-nspawn --version
如果输出版本号,说明已安装。
2.2 各发行版安装方法
| 发行版 | 安装命令 |
|---|---|
| Arch Linux | sudo pacman -S systemd(默认已安装) |
| Debian / Ubuntu | sudo apt install systemd-container |
| Fedora | sudo dnf install systemd-container |
| openSUSE | sudo zypper install systemd-container |
安装 systemd-container 包还会附带 machinectl 管理工具。
2.3 额外工具(可选)
推荐一并安装:
# Arch Linux sudo pacman -S debootstrap arch-install-scripts # Debian / Ubuntu sudo apt install debootstrap
debootstrap 用于快速构建 Debian/Ubuntu 容器根文件系统。
三、创建第一个容器
步骤 1 — 创建容器根目录
sudo mkdir -p /var/lib/machines/mycontainer
所有容器默认存放在 /var/lib/machines/ 目录下。
你也可以放在其他路径,但 systemd 默认只扫描这个目录。
步骤 2 — 使用 debootstrap 构建文件系统
以下命令创建一个最小化的 Debian 系统:
sudo debootstrap --include=systemd,systemd-container,bash,iproute2 \ stable /var/lib/machines/mycontainer \ https://deb.debian.org/debian
等待下载完成,这取决于网络速度,通常需要几分钟。
步骤 3 — 设置 root 密码
sudo systemd-nspawn -D /var/lib/machines/mycontainer passwd
输入并确认密码,这是容器内 root 用户的密码。
步骤 4 — 启动容器
sudo systemd-nspawn -b -D /var/lib/machines/mycontainer
-b 表示以启动 systemd 的模式运行(完整引导),
-D 指定容器目录。容器将像一台独立机器一样启动。
步骤 5 — 使用 machinectl 启动
如果容器在 /var/lib/machines/ 下,也可以直接用 machinectl 管理:
sudo machinectl start mycontainer sudo machinectl login mycontainer
后者直接打开一个登录终端。
四、容器管理
4.1 查看容器状态
# 列出所有已注册的容器 machinectl list-images # 列出正在运行的容器 machinectl list # 查看容器详细信息 machinectl status mycontainer
4.2 在容器中执行命令
# 在运行中的容器里执行命令 sudo machinectl shell mycontainer /bin/bash # 或者在容器未运行时直接 chroot 进去执行 sudo systemd-nspawn -D /var/lib/machines/mycontainer apt update
4.3 停止 / 重启容器
# 停止容器 sudo machinectl poweroff mycontainer # 重启容器 sudo machinectl reboot mycontainer
poweroff 或 reboot 来关闭或重启容器。
4.4 删除容器
# 先确保容器已停止 sudo machinectl poweroff mycontainer # 删除容器目录 sudo rm -rf /var/lib/machines/mycontainer
容器本质上是一个目录,删除目录即删除容器。
五、网络配置
5.1 默认网络(NAT 模式)
默认情况下,容器与宿主机共享网络。添加 --network-veth 参数可以为容器创建一对虚拟网卡(veth pair),
配合 NAT 实现容器访问外网:
sudo systemd-nspawn -b -D mycontainer \ --network-veth \ --network-macvlan=eth0
5.2 配置 systemd-networkd
在宿主机上创建网桥或 NAT 配置。以下是一个简单的 NAT 配置示例:
# /etc/systemd/network/ve-mycontainer.network [Match] Name=ve-mycontainer [Network] Address=192.168.100.1/24 IPMasquerade=yes DHCPServer=yes
5.3 容器内网络配置
在容器内启用 DHCP 获取 IP:
# 容器内 /etc/systemd/network/default.network [Match] Name=host0 [Network] DHCP=yes
然后在容器内启动 systemd-networkd:
systemctl enable --now systemd-networkd
5.4 常用网络选项
| 选项 | 说明 |
|---|---|
--network-veth | 创建一对虚拟以太网设备 |
--network-bridge=br0 | 将容器连接到指定网桥 |
--network-macvlan=eth0 | 使用 macvlan 共享宿主机网卡 |
--network-ipvlan=eth0 | 使用 ipvlan 共享宿主机网卡 |
--network-zone=zone1 | 将容器分配到虚拟网络区域 |
-p, --port=8080:80 | 端口转发(宿主机端口:容器端口) |
六、开机自启
6.1 注册为 systemd 服务
对于 /var/lib/machines/ 下的容器,直接启用即可:
sudo machinectl enable mycontainer
6.2 开机自启
sudo systemctl enable systemd-nspawn@mycontainer
这样系统启动时会自动引导该容器。
6.3 使用 .nspawn 配置文件
在 /etc/systemd/nspawn/ 目录下创建 mycontainer.nspawn 文件,可以持久化配置容器参数:
[Exec] Boot=yes PrivateUsers=yes [Network] VirtualEthernet=yes Bridge=br0 [Files] Bind=/home/jac/project:/mnt/project
这样每次启动容器时自动应用这些配置,无需手动传参。
[Exec]段:容器引导参数,如Boot=yes表示引导 systemd[Network]段:网络配置,如虚拟网卡、网桥[Files]段:绑定挂载宿主机目录到容器内
七、注意事项
- 容器内无法启动 systemd 时,检查是否缺少
-b参数 - 网络不通时,确认宿主机开启了 IP 转发:
sysctl net.ipv4.ip_forward=1 - 容器启动报错 "Failed to mount" 时,尝试添加
--private-users=no参数 - 如果使用 user namespace,注意容器内 mount 操作的权限限制
- machinectl 只能管理
/var/lib/machines/下的容器
man systemd-nspawn— 完整的手册页man machinectl— machinectl 管理工具手册man systemd.nspawn— .nspawn 配置文件说明