systemd-nspawn是轻量可控的服务沙箱工具,非docker替代品,适合需systemd深度集成的后台服务;本质为带命名空间的systemd实例,复用宿主内核,init默认为/usr/lib/systemd/systemd。

在生产环境中,systemd-nspawn 不是用来替代 Docker 或 Kubernetes 的通用容器平台,而是作为轻量、可控、与宿主深度集成的服务沙箱工具。它适合部署对启动速度、资源开销、系统服务依赖(如 systemd、journald、logind)有明确要求的后台服务,比如定制化构建服务、嵌入式交叉编译网关、CI/CD 侧边车代理、或需要完整 init 生命周期管理的守护进程。
核心定位:不是容器平台,而是“带命名空间的 systemd 实例”
systemd-nspawn 的本质是启动一个隔离的用户空间实例,其 rootfs 是普通目录,内核复用宿主机,init 进程默认为 /usr/lib/systemd/systemd。这意味着:
- 服务可直接使用 systemctl start/stop/status、journalctl 查日志、timers 触发定时任务
- 无需镜像构建、推送拉取、分层存储等运维负担
- 所有 cgroup v2、SELinux/AppArmor 策略、audit 日志均可原生生效
- 不引入额外运行时(如 containerd),攻击面更小,审计路径更短
生产就绪的关键配置项
一个可用于生产的服务沙箱,需通过 .nspawn 配置文件(放在 /etc/systemd/nspawn/ 目录下)或 systemd-run 参数显式声明关键隔离与加固策略:
- Networking=private:启用独立网络命名空间,禁用默认 host 网络;如需通信,用 veth + firewall 或 --network-veth 配合桥接
- PrivateUsers=yes:启用 user namespace 映射,防止容器内 root 映射到宿主 root,是权限隔离基石
- ProtectSystem=strict:挂载 /usr、/boot、/etc 为只读,阻止篡改系统关键路径
- ReadOnlyPaths=/ + ReadWritePaths=/var/log /run /tmp:根文件系统只读,仅开放必要可写路径
- MemoryMax=512M CPUQuota=50%:基于 cgroup v2 设置硬性资源上限(需确认宿主启用 cgroup v2)
- RestrictNamespaces=yes:禁止容器内创建新 namespace,防逃逸
- CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_NET_RAW:显式剔除高危 capability
服务托管方式:以 native unit 文件驱动
不要用裸命令启动容器,应封装为 systemd service 单元,实现生命周期统一管理:
- 新建 /etc/systemd/system/myapp-sandbox.service
- Type=notify 或 Type=simple,配合 ExecStart=/usr/bin/systemd-nspawn --machine=myapp --directory=/srv/myapp-root --settings=trusted
- 添加 Wants=network.target、After=network.target 确保网络就绪
- 通过 Restart=on-failure、RestartSec=10、StartLimitIntervalSec=60 做基础健康兜底
- 日志自动归入 journald,可用 journalctl -M myapp 查看容器内服务日志
运维与安全实践要点
生产环境不能只靠配置,还需配套机制:
- 根文件系统更新必须原子化:用 rsync --delete-after 或 overlayfs+switch-root 方式切换新版 rootfs,避免运行中修改
- 禁止交互式登录:不配 getty、不开放 sshd,如需调试用 systemd-run --scope --scope --property=MemoryMax=128M -- bash 临时进入
- 定期校验完整性:对 /srv/myapp-root 使用 rpm-ostree verify 或 sha256sum -c manifest.SHA256 检查关键二进制未被篡改
- 监控关键指标:通过 systemd-cgtop、systemd-analyze plot 或 Prometheus node_exporter cgroup collector 抓取 MemoryCurrent、TasksMax、CPUUsageSec
- 备份策略分离:rsync 排除 /proc /sys /dev /run /tmp,只备份 /srv/myapp-root/{etc,usr,lib,var/lib} 等持久数据区










