我需要哪种 Linux 功能才能写入 /proc/sys/vm/drop_caches?

我需要哪种 Linux 功能才能写入 /proc/sys/vm/drop_caches?

我正在尝试从 docker 容器内部清除文件系统缓存,如下所示:

docker run --rm ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"

如果我运行这个命令我得到

sh: 1: cannot create /proc/sys/vm/drop_caches: Read-only file system

/proc这是预期的,因为我无法从容器内部写入。

现在当我打电话时

docker run --rm --privileged ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"

它有效,这对我来说也很有意义,因为--privileged容器可以在主机上执行(几乎)任何操作。

我的问题是:如何找出需要在命令中设置哪些 Linux 功能

docker run --rm --cap-add=??? ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"

为了使这项工作无需设置--privileged

答案1

作为 Gilles 接受的答案的附录:在使用 docker 时,我成功地实现了以更简单的方式写入/proc/sys/vm/drop_caches(或者/proc一般来说,准确地说)的目标:

docker run -ti --rm -v /proc:/writable_proc ubuntu:vivid bash
# echo 3 > /writable_proc/sys/vm/drop_caches

这就是为了我的目的。

非常感谢您的有用回答!

答案2

文件proc系统不支持功能、ACL,甚至不支持使用chmod. Unix 权限决定调用进程是否获得访问权限。因此只有 root 可以写入该文件。对于用户命名空间,这就是全局根(原始命名空间中的根);容器中的 root 无法更改 sysctl 设置。

据我所知,从非特权命名空间内部更改 sysctl 设置的唯一解决方案是安排与外部的通信通道(例如套接字或管道),并让侦听进程在容器外部以 root 身份运行。

答案3

我刚刚测试了以下内容:

docker run -ti --rm -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches

而且,它失败了:

bash: /writable_proc/sys/vm/drop_caches: Permission denied

我以特权运行它:

docker run -ti --rm --privileged -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches

而且,一切都有效,所以我非常确定,不知何故,事情对 Gilles 有效,因为他的守护进程或 cli 被配置为在不知情的情况下使用特权:

相关内容