/proc/sys/vm/drop_cachesに書き込むには、どのLinux機能が必要ですか?

/proc/sys/vm/drop_cachesに書き込むには、どのLinux機能が必要ですか?

次のように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権限は、呼び出しプロセスがアクセスできるかどうかを決定します。したがって、ルートのみがこのファイルに書き込むことができます。ユーザーネームスペースの場合、これはグローバルルート(元のネームスペースのルート)です。コンテナのルートは sysctl 設定を変更できません。

私が知っている限り、権限のない名前空間内でsysctl設定を変更する唯一の解決策は、通信チャネル(たとえばソケットまたはパイプ)を外部にソートし、受信プロセスがコンテナ外のルートとして実行されるようにすることです。

答え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は、Gillesが知らない間に権限を使用するように構成されているため、Gillesに対してすべてが機能していると確信しています。

関連情報