저는 컨테이너화 메커니즘을 연구 중입니다. 매뉴얼 페이지사용자 네임스페이스 상태의 경우: "모든 프로세스는 사용자 네임스페이스의 구성원입니다."
나도 따라해보려고 하는데이 기사저자는 다음과 같이 지적합니다. "사용자 네임스페이스는 사용자 네임스페이스 1의 프로세스가 사용자 네임스페이스 1의 UID와 다른 UID를 가질 수 있도록 허용합니다.동일한 프로세스에 대해사용자 네임스페이스 2"
위의 두 진술은 모순되는 것처럼 보입니다. 동일한 프로세스가 여러 사용자 네임스페이스의 일부가 될 수 있나요? 프로세스, UID 및 사용자 네임스페이스 간의 관계는 무엇입니까? 일부 그래픽 설명을 주시면 감사하겠습니다.
답변1
명백한 모순은 기사에서 사용자 네임스페이스 계층 구조를 생략한 데서 비롯됩니다. 맨페이지 인용:
사용자 네임스페이스는 중첩될 수 있습니다. 즉, 각 사용자 네임스페이스(초기("루트") 네임스페이스 제외)에는 상위 사용자 네임스페이스가 있고 0개 이상의 하위 사용자 네임스페이스가 있을 수 있습니다. 상위 사용자 네임스페이스는 다음을 호출하여 사용자 네임스페이스를 생성한 프로세스의 사용자 네임스페이스입니다.
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 외에도 다른 프로세스에 의해서도 프로세스가 생성됩니다. 프로세스가 자식 프로세스를 생성할 때 선택적으로 자식 프로세스를 새로운 사용자 네임스페이스에 할당할 수 있습니다. 이 사용자 네임스페이스는 부모 프로세스 사용자 네임스페이스의 "하위 네임스페이스"라고도 합니다.
소위 UID(사용자 ID) 및 GID(그룹 ID)매핑프로세스 UID 및 GID를 활성화합니다.나타나다다른 네임스페이스에서 확인할 때는 다릅니다. 프로세스는 시스템의 다른 네임스페이스에 있는 프로세스가 액세스하려는 파일을 수정할 수 있고 네임스페이스 외부에서 해당 파일에 대한 의미 있는 UID 또는 GID를 확인하려고 하기 때문에 매핑이 중요합니다.
매핑된 UID(GID와 동일)는 새 네임스페이스를 생성한 프로세스의 UID를 가져와 /proc/<Process_ID>/uid_map
이를 새 네임스페이스의 새 프로세스와 일치시키고 매핑된 UID를 할당하는 방식으로 작동합니다. 새 사용자 네임스페이스를 생성할 때 매핑이 지정되지 않으면 새 네임스페이스의 프로세스 UID가 값을 사용합니다. /proc/sys/kernel/overflowuid
이러한 매핑을 정의하는 방법 에 대한 자세한 내용은 다음을 참조하세요.이 LWN 기사.