当从非特权用户命名空间内访问时,OverlayFS 挂载的工作方式很奇怪。最好用例子来解释:
~# uname -a
Linux host 4.1.0-1-amd64 #1 SMP Debian 4.1.3-1 (2015-08-03) x86_64 GNU/Linux
~# runuser - test -c id
uid=2000(test) gid=2000(test) groups=2000(test)
~# cat /etc/subuid /etc/subgid | grep test
test:200000:65536
test:200000:65536
~# cd ~test
/home/test# mkdir -p upper/test1 lower/test2 target target.work
/home/test# chown -R test:test upper lower target target.work
/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
/home/test# mount | grep test
overlay on /home/test/target type overlay (rw,relatime,lowerdir=lower,upperdir=upper,workdir=target.work)
Overlay 已安装并按预期工作:
/home/test# runuser - test
~$ cd target
~/target$ ls -l
total 8
drwxr-xr-x 2 test test 4096 Sep 15 13:50 test1
drwxr-xr-x 2 test test 4096 Sep 15 13:50 test2
~/target$ mkdir test3
~/target$ mkdir test2/test2-3
~/target$ mkdir test1/test1-3
现在让我们尝试非特权用户命名空间
~/target$ ^D
/home/test/target# cd ..
/home/test# umount target
/home/test# rm -rf upper lower target target.work
/home/test# mkdir -p upper/test1 lower/test2 target target.work
/home/test# chown -R 200000:200000 upper lower target target.work
/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
/home/test# mount | grep test
overlay on /home/test/target type overlay (rw,relatime,lowerdir=lower,upperdir=upper,workdir=target.work)
确保允许非特权命名空间:
/home/test# sysctl -w kernel.unprivileged_userns_clone=1
好的,让我们尝试一下:
/home/test# runuser - test
~$ lxc-usernsexec -m u:0:200000:65536 -m g:0:200000:65536 -m u:65536:2000:1 -m g:65536:2000:1 -- /bin/bash
~# cd target
~/target# ls -l
total 8
drwxr-xr-x 2 root root 4096 Sep 15 13:57 test1
drwxr-xr-x 2 root root 4096 Sep 15 13:57 test2
到目前为止,一切都很好。
~/target# mkdir test3
~/target# mkdir test2/test2-3
~/target# mkdir test1/test1-3
mkdir: cannot create directory 'test1/test1-3': Permission denied
这就是它被打破的地方。 Aufs 在相同场景下工作得很好(除了 debian 4.1 内核不再支持 aufs)。
有什么办法让它发挥作用吗?
答案1
我认为这是因为target.work/work
挂载属于root。你能尝试在挂载后chown那个目录吗?但是我发现更简单的复制情况,我们只需要位于下层的目录,而不是上层的目录:
# from user
mkdir -p upper lower/test2 target target.work
# from root
mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
# from user again
unshare -Ur touch target/test2/1
如果我chown user:user target.work/work
在安装后插入,那么一切正常。不确定我们是否应该将此视为 overlayfs 错误或功能:)
答案2
我不知道你是否注意到,你的第二个安装是不正确的:
-m g:0:2000000:65536
应该-m g:0:200000:65536
。你的命令有一个额外的0
.
我按照你的步骤操作了,没有发现错误:
root@clone-newuser:/home/test# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=target.work overlay target
root@clone-newuser:/home/test# runuser - test
test@clone-newuser:~$ lxc-usernsexec -m u:0:100000:65536 -m g:0:100000:65536 -m u:65536:1000:1 -m g:65536:1000:1 -- /bin/bash
root@clone-newuser:~# ls
lower target target.work upper
root@clone-newuser:~# cd target
root@clone-newuser:~/target# ls
test1 test2
root@clone-newuser:~/target# mkdir test3
root@clone-newuser:~/target# mkdir test2/test2-3
root@clone-newuser:~/target# mkdir test1/test1-3
root@clone-newuser:~/target#
不过,我使用的是稍新的内核:
root@clone-newuser:/home/test# uname -srm
Linux 4.1.7-040107-generic x86_64
我真的不知道这是否对你有帮助。