我正在尝试在 CentOS 7 上的 Libvirt 下实现具有映射 uid/gid(用户命名空间)的 LXC,并安装完全独立的根。Libvirt 配置片段
<idmap>
<uid start='0' target='100000' count='65535'/>
<gid start='0' target='100000' count='65535'/>
</idmap>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/var/lib/libvirt/lxc/test2'/>
<target dir='/'/>
</filesystem>
我更改了 /var/lib/libvirt/lxc/test2 中文件/目录的所有权,容器本身运行良好(只是一个测试容器,其中的 bash 脚本为 /init,运行 Apache 并捕获 SIGTERM 以正常停止 Apache)。如果我这样做,ps aux
我会看到容器应用程序在用户 ID 100000 下运行
100000 7392 0.0 0.0 12476 2212 pts/0 Ss+ Feb17 0:20 /bin/sh /init
100000 7409 0.0 0.0 230408 3684 ? Ss Feb17 0:15 /usr/sbin/httpd
100048 7411 0.0 0.0 230544 3796 ? S Feb17 0:00 /usr/sbin/httpd
100048 7412 0.0 0.0 230544 3800 ? S Feb17 0:00 /usr/sbin/httpd
我可以看到默认的 Apache 页面,所以一切都很好。
现在,当我尝试执行此操作时,virsh lxc-enter-namespace test2 /bin/bash
我发现容器内的 bash 在未知的 uid/gid 下运行
bash-4.2$ id
uid=65534 gid=65534 groups=65534
我认为它在主机系统中以真实根 (uid/gid 0/0) 身份运行。/proc/$PID/uid_map 与在容器中运行的 httpd 进程相同。
[root@lxctest ~]# cat /proc/21219/uid_map <- bash
0 100000 65535
[root@lxctest ~]# cat /proc/7413/uid_map <- apache
0 100000 65535
因此映射似乎有效,但 libvirt (virsh) 以错误的用户身份启动该进程。当然,主机系统中不存在用户 100000。
那么有人知道如何以用户 100000(容器根)身份附加(输入命名空间)吗?我遗漏了什么吗?