私はコンテナ化メカニズムを研究しています。 マニュアルページユーザーの名前空間状態の場合: 「すべてのプロセスはユーザーの名前空間のメンバーです。」
私もフォローしようとしています。この記事著者は次のように指摘します。 「ユーザーネームスペースは、ユーザーネームスペース1のプロセスがユーザーネームスペース1のUIDとは異なるUIDを持つことを許可します。同じプロセスについてユーザーネームスペース 2"
上記の2つの文は矛盾しているようです。同じプロセスが複数のユーザーネームスペースの一部になることはできますか?プロセス、UID、およびユーザーの名前空間の間の関係は何ですか?一部のグラフィックの説明をいただきありがとうございます。
答え1
明らかな矛盾は、記事からユーザーの名前空間階層を省略したことに由来します。マンページ引用:
ユーザーの名前空間は入れ子にすることができます。つまり、各ユーザー名前空間(初期(「ルート」)名前空間を除く)には、親ユーザー名前空間があり、ゼロ以上の子ユーザー名前空間がある可能性があります。親ユーザー名前空間は、次を呼び出してユーザー名前空間を作成したプロセスのユーザー名前空間です。
unshare(2)
またはclone(2)
そしてCLONE_NEWUSER
バナー。
この資料では、プロセスDは、ユーザーネームスペース1内にネストされたユーザーネームスペース2の一部です。単一のプロセスは単一ユーザーの名前空間に属しますが、そのユーザーの名前空間はルート名前空間まで連続した親名前空間内にネストされます。
プロセスは複数のユーザー名前空間で表示できます。特に、すべてのプロセスは最上位のユーザーネームスペース(または必要に応じてすべてのユーザーネームスペースの外側)に表示できます。プロセスに関連付けられたユーザーIDは、照会されるユーザー名前空間と各ユーザー名前空間で使用されるuid / gidマッピングに基づいて値を変更します。これがこの記事で説明したい点です。
たとえば、コンテナ内で実行されているルートレスコンテナを起動すると、これを確認できますbash
。ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.3 0.0 12024 3196 pts/0 Ss 13:49 0:00 /bin/bash
しかし、同じ bash
プロセスは次のように表示されます。
skitt 23345 0.0 0.0 12024 3208 pts/0 Ss+ 15:49 0:00 /bin/bash
コンテナの外。/proc/.../uid_map
使用中のuidマッピングを表示します。
$ cat /proc/23345/uid_map
0 1000 1
1 624288 65536
これは、uidの「範囲」が0から0までであることを意味します。~へそのユーザーの名前空間は、私が照会するユーザーの名前空間から1000にマップされ、1から65536までの範囲は624288から689823にマップされます。
答え2
多くの悩みの終わりにいくつかの答えを得たようです。すべてのプロセスは実際には一部です。まさに一つユーザーネームスペース(ここで確認されたとおり)、記事の写真正確に描写しています。 initに加えて、他のプロセスによってもプロセスが作成されます。プロセスが子プロセスを作成すると、オプションで子プロセスを新しいユーザー名前空間に割り当てることができます。このユーザーネームスペースは、親プロセスのユーザーネームスペースの「サブネームスペース」とも呼ばれます。
いわゆるユーザーID(UID)とグループID(GID)マッピングプロセスUIDとGIDを有効にします。現れる他の名前空間で確認するときは異なります。プロセスは、システム内の他の名前空間内のプロセスがアクセスしようとしているファイルを変更でき、名前空間の外側でそのファイルの意味のあるUIDまたはGIDを確認しようとするため、マッピングが重要です。
マッピングされたUID(GIDと同じ)は、新しい名前空間を作成したプロセスのUIDを取得し、/proc/<Process_ID>/uid_map
それを新しい名前空間の新しいプロセスと一致させ、マッピングされたUIDを割り当てるように機能します。新しいユーザー名前空間を作成するときにマッピングが指定されていない場合、新しい名前空間のプロセスUIDは値を使用します。/proc/sys/kernel/overflowuid
これらのマッピングを定義する方法の詳細については、次を参照してください。このLWN記事。