LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

Systemd-nspawn 配置与使用

Systemd-nspawn 对 subuid/suigid 的支持相对有限,而且对 Systemd 依赖,它希望容器最好是带 Systemd 和 Dbus 的。

Systemd-nspawn 主要的交互程序是:

  • machinectl
  • systemd-nspawn

配置

权限

非 root 用户无法执行 machinectl,这是极不方便的,Systemd-nspawn 的权限基于 polkit,不同版本有着不同配置。我们需要让当前桌面用户有权限,先执行 pkaction --version,如果显示 polkit 的版本小于 0.106,那么当前就不支持 rules 配置,我们可以创建 /etc/polkit-1/localauthority/50-local.d/machined.pkla

Identity=unix-user:$your_name
Action=org.freedesktop.machine1.*
ResultActive=yes

如果是大于等于 0.106,那么我们可以创建 /etc/polkit-1/rules.d/machined.rules

polkit.addRule(
  function (action, subject) {
    if (action.id.startsWith("org.freedesktop.machine1.") && subject.user == "$your_name") {
      return polkit.Result.YES;
    }
  }
);

而且 rules 规则还可以作用与 systemctl,Systemd-nspawn 本身也可以用 systemctl 来管理:

polkit.addRule(
  function (action, subject) {
    if ((action.id.startsWith("org.freedesktop.machine1.") || (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit").startsWith("systemd-nspawn@"))) && subject.user == "$your_name") {
      return polkit.Result.YES;
    }
  }
);

使用

当在容器里面,连按三次 Ctrl-] 就能结束容器进程。

systemd-nspawn

Chroot,用于修改 root 密码或修改配置:

systemd-nspawn -D ./dist/os

启动一个容器:

systemd-nspawn -D ./dist/os -b

启动时挂载主机资源:

systemd-nspawn -D ./dist/os -b --bind=/tmp/os:/tmp --bind-ro=/dev/dri

可以指定网络设备,不指定就是使用主机的网络:

systemd-nspawn -D ./dist/os -b --network-ipvlan=vlan0

自动 uid/gid 映射,让 id 范围不会与其他冲突,实际使用会出现各种权限问题:

systemd-nspawn -D ./dist/os -b -U

超级权限运行:

SYSTEMD_SECCOMP=0 systemd-nspawn -D ./dist/os -b --capability=all

machinectl

临时挂载:

machinectl bind --mkdir os /tmp/os:/tmp/123
machinectl bind --read-only os /dev/dri

获取 Shell:

machinectl shell $your_name@os

systemctl

使用 systemctl 管理的容器是在 /var/lib/machines 里面,而且默认的启动是 systemd-nspawn-U 参数的,需要自己改动。