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
参数的,需要自己改动。