systemd-nspawn 的行为和容器根目录的权限有关?

非root用户,systemd 258.1,用下面这个脚本,在 /tmp 内进入一个新目录内执行。

mkdir {etc,usr,var,opt}{,wk}
sudo mount -t overlay overlay -o upperdir=usr,lowerdir=/usr,workdir=usrwk usr
sudo mount -t overlay overlay -o upperdir=etc,lowerdir=/etc,workdir=etcwk etc
sudo mount -t overlay overlay -o upperdir=var,lowerdir=/var,workdir=varwk var
sudo mount -t overlay overlay -o upperdir=opt,lowerdir=/opt,workdir=optwk opt
sudo systemd-nspawn -bD . 

当这个新目录权限为 700 时,启动容器时会卡在这里:

         Starting D-Bus System Message Bus...
[  OK  ] Started D-Bus System Message Bus.
[FAILED] Failed to start Userspace Out-Of-Memory (OOM) Killer.
See 'systemctl status systemd-oomd.service' for details.
         Starting D-Bus System Message Bus...
[  OK  ] Started D-Bus System Message Bus.

而权限为 755 的时候能正常启动。比较好奇这行为是预期的么。

另外就是好奇一下有没有更好的方案启一个当前系统的容器(wiki里倒是有个btrfs的方案

不需要自己overlay的说,nspawn有--volatile=yes和--volatile=overlay参数用。
权限不足出问题不是很正常吗。

1 Like

好像想明白了,是因为一些非 root 权限的服务在 700 的权限下读不到根目录下有哪些东西了么

非root进程不但读不到,因为缺少x权限,它实质上对文件系统没有任何权限了。

1 Like

--volatile=overlay 好像不让直接在 / 上用,=yes 好像只挂了 /usr
=state 直接启动不起来
是不是还得手动指定 --overlay 参数才行

是,根据你的需求来选择参数。

这个需求的话,我有个脚本:lxc-arch2

1 Like