OverlayFS 不适用于非特权用户命名空间

OverlayFS 不适用于非特权用户命名空间

当从非特权用户命名空间内访问时,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

我真的不知道这是否对你有帮助。

相关内容