2016-09-21 20 views
0

Linuxカーネルコードをブラウズしているうちに、kernel/capability.cに次の2つの機能が見つかりました。Linuxのinit_user名前空間とは何ですか?

1)

bool has_capability(struct task_struct *t, int cap) 

/*Does a task have a capability in init_user_ns.*/ 


2)

bool has_ns_capability(struct task_struct *t, struct user_namespace *ns, int cap) 

/*Does a task have a capability in a specific user ns.*/ 

最初の関数で述べたinit_user名前空間とは何ですか?

私が知っていることから、プロセスには能力があります(プロセスのさまざまな能力セットについては心配しないでください)。そうでないと、プロセスはどのようにして名前空間に関して?

cap_get_target_pid()の定義を見ると、同じファイル内で、ユーザーの名前空間について心配することなく、指定されたPIDを持つプロセスの機能を取得する方法についてのみ説明します。これは私にとってもっと自然に見えます。

答えて

0

名前空間は、dockerなどのコンテナのキーです。それらはコンテナ間でリソースを分離します。

考え方は、各容器が処理を含む属性タイプの数の別の名前空間を有し、等

各コンテナのID、ユーザIDとグループID、TCP/UDPポート、ネットワークインターフェース、マウントされたファイルシステムを、スレッドということですあたかもシステム全体であるかのように振舞うことができます。名前空間は、ある名前空間内のプロセスが別の名前空間内のプロセス(構成されている場合を除く)にアクセスできないようにしたり、誤って別の名前空間に流出したりするのを防止します。

init_userネームスペースは、基盤となるホストシステム(別名「ルート」ネームスペース)に属する「ユーザーネームスペース」です。名前空間は階層的であるため、プロセスがinit_user名前空間にある場合、その能力はルート名前空間とそれ以外のすべてのもので有効です(ルート名前空間のすべての子孫であるため)。

+0

あなたの "init_user"名前空間の定義は正しいですが、答えは完全に質問に答えません。 –

0

Linux 2.2ではLinuxの機能が導入され、Linux 3.8では名前空間が導入されました。したがって、私は独立して開発されているので、独立した存在が必要です。私が今気付いたように、これらの記事(Link1Link2)を読んだ後の状況はそうではありません。

貧弱なプロセスがユーザーの名前空間を作成できるようにする必要があるときに、2つのテクノロジが混在していました。作成されたユーザーネームスペース内では、プロセスはすべての機能を持つことができますが、外部は無力でなければなりません。したがって、プロセスP1が別のプロセスP2にIPCを送信しようとしていて、P1がIPCを送信する能力を有している場合、カーネルは機能をチェックするだけでなく、P1がユーザに対して必要な能力を有するかどうかをチェックしなければならないプロセスP2の名前空間。 2つのプロセスのユーザー名前空間は完全に分離している可能性があり、相互にIPC機能はないため、この操作は許可されてはなりません。しかし、プロセスP1は、それ自身のユーザー名前空間内のすべてのプロセスにIPCを送信することを許可されなければならない。

this Wikipediaの記事、

Permissions for namespace of the other kinds are checked in the user namespace, they got created in. 

からGil Hamiltonで指摘したように、init_user名前空間(init_user_nsは)ただ、ルート名前空間、ブート時に作成される、すなわち、ユーザの名前空間です。

Hereは、このトピックに関する記事です。

関連する問題