systemd-sysctl 服务启动并尝试写入 /proc/sys/user/ 中的文件时权限被拒绝

systemd-sysctl 服务启动并尝试写入 /proc/sys/user/ 中的文件时权限被拒绝

我正在尝试启用Docker 上的用户命名空间。这当然需要在内核中启用用户命名空间。

在 RHEL/CentOS 中启用用户命名空间的步骤之一是:

echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf

因为默认情况下 max_user_namespaces 为 0。此后,您必须重新启动或执行sysctl -p以加载 sysctl.conf 中的 sysctl 设置。加载设置后,/proc/sys/user/max_user_namespaces应包含 15000。这在 RHEL 7.4(内核:3.10.0-957.10.1.el7.x86_64)上工作正常。

当我运行 时,它也可以在 CentOS 7.4 (内核:3.10.0-693.10.1.el7.x86_64) 上运行sysctl -p。但是如果我重新启动,max_user_namespaces 会被设置回 0。
我检查了 systemd-sysctl 服务的状态,发现它的active (exited)状态为:

● systemd-sysctl.service - Apply Kernel Variables
  Loaded: loaded (/usr/lib/systemd/system/systemd-sysctl.service; static; vendor preset: disabled)
  Active: active (exited) since Wed 2019-04-03 16:15:34 WEST; 16s ago
    Docs: man:systemd-sysctl.service(8)
          man:sysctl.d(5)
 Process: 2786 ExecStart=/usr/lib/systemd/systemd-sysctl (code=exited, status=0/SUCCESS)
Main PID: 2786 (code=exited, status=0/SUCCESS)

Apr 03 16:15:34 localhost.localdomain systemd[1]: Starting Apply Kernel Variables...
Apr 03 16:15:34 localhost.localdomain systemd[1]: Started Apply Kernel Variables.

经过仔细检查,我发现每次启动 systemd-sysctl 服务时,当它尝试写入以下内容时都会因“权限被拒绝”错误而失败/proc/sys/user/max_user_namespaces

$ journalctl -xn
[...]
Apr 03 16:15:34 localhost.localdomain sudo[2779]:     user : TTY=tty1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/systemctl start systemd-sysctl
Apr 03 16:15:34 localhost.localdomain polkitd[763]: Registered Authentication Agent for unix-process:2780:7181831 (system bus name :1.51 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Apr 03 16:15:34 localhost.localdomain systemd[1]: Starting Apply Kernel Variables...
-- Subject: Unit systemd-sysctl.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit systemd-sysctl.service has begun starting up.
Apr 03 16:15:34 localhost.localdomain systemd-sysctl[2786]: Failed to write '15000' to '/proc/sys/user/max_user_namespaces': Permission denied
Apr 03 16:15:34 localhost.localdomain systemd[1]: Started Apply Kernel Variables.
-- Subject: Unit systemd-sysctl.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit systemd-sysctl.service has finished starting up.
-- 
-- The start-up result is done.
Apr 03 16:15:34 localhost.localdomain polkitd[763]: Unregistered Authentication Agent for unix-process:2780:7181831 (system bus name :1.51, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)

以下是该文件的权限(在 RHEL 和 CentOS 中):

$ ls -l /proc/sys/user/max_user_namespaces
-rw-r--r--. 1 root root 0 Apr  3 10:10 /proc/sys/user/max_user_namespaces

正如我所说,我可以sysctl -p使用 sudo 直接编辑它或使用命令来更改它。为什么 systemd-sysctl 服务无法写入它?

请注意,RHEL 上也存在同样的问题...我不知道问题出在哪里,也找不到答案。问题,但仍然没有答案。

有任何想法吗?

相关内容