无法在 RHEL 中创建用户命名空间

Sur*_*ala 6 linux rhel namespace docker

我尝试在 RHEL 7 中创建用户命名空间,但由于以下错误而无法创建:

[root@teja7131 ~]# unshare -U /bin/bash
unshare: unshare failed: Invalid argument
Run Code Online (Sandbox Code Playgroud)

请解释创建用户命名空间的正确参数格式。

thr*_*rig 9

如果使用strace检查命令

$ strace -o logf -f unshare -U sh
unshare: unshare failed: Invalid argument
$ grep 'Invalid argument' logf
31728 unshare(CLONE_NEWUSER)            = -1 EINVAL (Invalid argument)
31728 write(2, "Invalid argument\n", 17) = 17
Run Code Online (Sandbox Code Playgroud)

这表明系统调用unshare(2)失败。值得注意的CLONE_NEWUSER是,它没有出现在手册页中,这可能是一个文档错误,或者可能表明CLONE_NEWUSERRedHat 7 的库存安装不支持它(我在测试系统上使用 Centos7,它与 RedHat 7 相似但不同) )。

$ man 2 unshare | col -b | grep CLONE_NEWUSER
$ 
Run Code Online (Sandbox Code Playgroud)

这很奇怪; altagoobingleduck 查阅术语unshareCLONE_NEWUSER产生有关unshare(CLONE_NEWUSER)尽管CONFIG_USER_NS在 Centos 7 上显然已启用的问题:

$ grep CONFIG_USER_NS /boot/config-$(uname -r)
CONFIG_USER_NS=y
Run Code Online (Sandbox Code Playgroud)

然而,更多的 altagoobingleduckgoing 出现了一个lxc 线程,表明“当前用户命名空间处于技术预览阶段”(从 RedHat 7.2 开始),因此可能有效也可能无效。添加user_namespace.enable=1到内核参数对我的 Centos 7.5 系统没有帮助(并且在下面的测试中没有必要)。然而,内核功能页面列出了受支持的用户命名空间;Filipe Brandenburger 发现启用用户命名空间是否安全,这表明默认情况下 RedHat 7 为用户启用 0 个命名空间,尽管这个数字可以增加:

# cat /proc/sys/user/max_user_namespaces
0
# echo 640 > /proc/sys/user/max_user_namespaces
# unshare -U sh
sh-4.2$ 
Run Code Online (Sandbox Code Playgroud)

因此,max_user_namespaces在 Centos 7.5 上进行增加是可行的,并且不需要user_namespace.enable=1内核标志。

更多阅读:

https://rhelblog.redhat.com/2015/07/07/whats-next-for-containers-user-namespaces/

  • 另请参阅 https://superuser.com/a/1294246/879179,也许您还需要在最新的 RHEL 7 内核上调整“/proc/sys/user/max_user_namespaces”。 (2认同)