PID Namespace
기본 정보
PID (Process IDentifier) 네임스페이스는 Linux 커널의 기능으로, 프로세스 그룹이 다른 네임스페이스와 별개의 고유한 PID 세트를 가질 수 있도록 하여 프로세스 격리를 제공합니다. 이는 컨테이너화에서 특히 중요한 보안 및 자원 관리를 위해 프로세스 격리를 가능하게 합니다.
새로운 PID 네임스페이스가 생성되면, 해당 네임스페이스의 첫 번째 프로세스는 PID 1이 할당됩니다. 이 프로세스는 새로운 네임스페이스의 "init" 프로세스가 되며, 네임스페이스 내의 다른 프로세스를 관리하는 역할을 담당합니다. 네임스페이스 내에서 생성되는 각 후속 프로세스는 해당 네임스페이스 내에서 고유한 PID를 가지며, 이러한 PID는 다른 네임스페이스의 PID와 독립적입니다.
PID 네임스페이스 내의 프로세스 관점에서는, 동일한 네임스페이스 내의 다른 프로세스만 볼 수 있습니다. 다른 네임스페이스의 프로세스를 인식하지 못하며, 전통적인 프로세스 관리 도구 (예: kill
, wait
등)를 사용하여 해당 프로세스와 상호 작용할 수 없습니다. 이는 프로세스 간의 간섭을 방지하는 수준의 격리를 제공합니다.
작동 방식:
새로운 프로세스가 생성될 때 (
clone()
시스템 호출을 사용하여), 해당 프로세스는 새로운 또는 기존의 PID 네임스페이스에 할당될 수 있습니다. 새로운 네임스페이스가 생성되면, 해당 프로세스는 해당 네임스페이스의 "init" 프로세스가 됩니다.커널은 새로운 네임스페이스의 PID와 부모 네임스페이스 (즉, 새로운 네임스페이스가 생성된 네임스페이스)의 해당 PID 간의 매핑을 유지합니다. 이 매핑은 프로세스 간에 신호를 보낼 때와 같이 필요한 경우 커널이 PID를 변환할 수 있도록 합니다.
PID 네임스페이스 내의 프로세스는 동일한 네임스페이스 내의 다른 프로세스만 볼 수 있으며 상호 작용할 수 있습니다. 다른 네임스페이스의 프로세스를 인식하지 못하며, 해당 프로세스의 PID는 해당 네임스페이스 내에서 고유합니다.
PID 네임스페이스가 파괴될 때 (예: 네임스페이스의 "init" 프로세스가 종료될 때), 해당 네임스페이스 내의 모든 프로세스가 종료됩니다. 이는 네임스페이스와 관련된 모든 리소스가 올바르게 정리되도록 보장합니다.
Lab:
다른 네임스페이스 생성
CLI
--mount-proc
매개변수를 사용하여 /proc
파일 시스템의 새로운 인스턴스를 마운트함으로써, 새로운 마운트 네임스페이스는 해당 네임스페이스에 특정한 프로세스 정보에 대한 정확하고 격리된 뷰를 가지게 됩니다.
Docker
어떤 네임스페이스에 프로세스가 있는지 확인하기
To check which namespace your process is in, you can use the following command:
프로세스가 어떤 네임스페이스에 있는지 확인하려면 다음 명령을 사용할 수 있습니다:
This command will display the inode number of the PID namespace associated with your process.
이 명령은 프로세스와 관련된 PID 네임스페이스의 inode 번호를 표시합니다.
모든 PID 네임스페이스 찾기
초기 (기본) PID 네임스페이스에서의 root 사용자는 새로운 PID 네임스페이스에 있는 프로세스들을 포함하여 모든 프로세스를 볼 수 있습니다. 그래서 우리는 모든 PID 네임스페이스를 볼 수 있습니다.
PID 네임스페이스 안으로 들어가기
기본 네임스페이스에서 PID 네임스페이스로 진입하면 여전히 모든 프로세스를 볼 수 있습니다. 그리고 해당 PID 네임스페이스의 프로세스는 PID 네임스페이스에서의 새로운 bash를 볼 수 있습니다.
또한, 루트 권한이 있는 경우에만 다른 프로세스 PID 네임스페이스로 진입할 수 있습니다. 그리고 /proc/self/ns/pid
와 같은 디스크립터가 가리키는 네임스페이스가 없는 경우에는 다른 네임스페이스로 진입할 수 없습니다.
참고 자료
Last updated