2026.06.09 Linux 陋技分享

nspawn

nspawn
systemd-nspawn 安装与使用指南

systemd-nspawn 容器安装与使用指南

使用 systemd 原生的轻量级容器管理工具 — 无需 Docker

一、概述

systemd-nspawn 是 systemd 套件自带的轻量级容器管理工具。 它基于 Linux 内核的 namespace 技术,可以在隔离的文件系统环境中运行一个完整的操作系统实例。 与 Docker 不同,nspawn 不需要守护进程,也不需要镜像仓库——它直接操作目录树。

nspawn 的核心能力:

  • 基于目录的容器——一个完整的 Linux 根文件系统就是一个"容器"
  • 支持运行 systemd 作为 init 系统(完整容器体验)
  • 无需额外守护进程,直接由 systemd 管理
  • 与 machinectl、systemd-networkd 深度集成
  • 支持 cgroup v2、用户命名空间、专用网络等
适用场景:开发环境隔离、软件测试、运行与宿主机不同发行版的系统、 学习 Linux 系统管理。介于 chroot 和 Docker 之间的轻量方案。

二、安装 systemd-nspawn

2.1 检查是否已安装

绝大多数现代 Linux 发行版默认已安装 systemd,因此 nspawn 一般已可用:

systemd-nspawn --version

如果输出版本号,说明已安装。

2.2 各发行版安装方法

发行版安装命令
Arch Linuxsudo pacman -S systemd(默认已安装)
Debian / Ubuntusudo apt install systemd-container
Fedorasudo dnf install systemd-container
openSUSEsudo 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
提示:也可以直接在容器终端内执行 poweroffreboot 来关闭或重启容器。

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

这样每次启动容器时自动应用这些配置,无需手动传参。

.nspawn 文件说明:
  • [Exec] 段:容器引导参数,如 Boot=yes 表示引导 systemd
  • [Network] 段:网络配置,如虚拟网卡、网桥
  • [Files] 段:绑定挂载宿主机目录到容器内

七、注意事项

提示:容器与宿主机共享内核,因此不能在容器中加载内核模块、 修改内核参数或运行不同架构的程序(除非通过 QEMU 用户态模拟)。
常见问题:
  • 容器内无法启动 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 配置文件说明