我现在正在玩LXC,而我在一个我无法弄清楚的问题前面。 这是关于Linux用户命名空间。 想象一下,我正在用configuration文件中的这些行创build两个容器:
lxc.id_map = u 0 300000 90000 lxc.id_map = g 0 300000 90000
对于集装箱A,以及:
lxc.id_map = u 0 400000 90000 lxc.id_map = g 0 400000 90000
对于容器B.
如果我在容器A的根用户的共享文件夹上创build一个文件,我可以从主机看到这个文件实际上是用户拥有的uid 300000,这正是我所期望的:
#ls -l -rw-rw-r--. 1 300000 300000 0 19 juil. 09:35 test
现在,我想在主机上创build一个用户和一个组,以便能够pipe理它们:
groupadd --gid 300000 container_A useradd --uid 300000 --gid 300000 container_A groupadd --gid 400000 container_B useradd --uid 400000 --gid 400000 container_B
像以前一样,事情发生在我预料之中。 现在, ls命令显示了良好的用户/组名称,而不是匿名ID:
#ls -l -rw-rw-r--. 1 container_A container_A 0 19 juil. 09:35 test
下一步是限制对testing文件的访问,如: -rw-r----- ,并将container_B用户添加到container_A组。 现在, container_B用户应该能够读取testing文件,但不能编辑它:
#id container_B uid=400000(container_B) gid=400000(container_B) groups=300000(container_A) # su container_B $ cat test You can read the file. \m/
现在对我来说是奇怪的事情。 将自己附加到container_B中 ,然后再次尝试读取testing文件:
#ls -l -rw-r----- 1 nobody nobody 0 Jul 19 09:35 test #cat test cat: can't open 'test': Permission denied
我知道uid和gid在容器中是不可见的,因此ls命令不会打印任何东西 ,但那个失败的cat呢? 内核不应该将容器内的root用户映射到外部的400000 uid,因此,当open系统调用正在处理时,请注意它实际上是container_A组的成员?
这是一个错误或function?
事先感谢。