본문 바로가기
개발/개발공부

PID Namespace / Container 기초, Process, 격리, 네임스페이스, 컨테이너, 간단정리, Linux, Init process

by 치킨개발자 2023. 1. 13.
728x90

Pids in Linux


프로세스가 생성될 때 fork syscall을 통해 pid가 부모로 전달

커널에 의해 생성된 첫 프로세스는 pid1을 가짐

모든 프로세스는 부모를 계속 타고 올라가면 pid1을 만나고, 해당 프로세스가 죽으면 시스템 재부팅이 필요 (Init process)

Tree의 구조를 하고있다. 차례대로 fork되어 부모-자식관계

이렇듯 Linux namespace는 unshare syscall을 통해 생성되고, 해당 namespace로 바로 이동하는 것

하지만 PID namespace는 바로 이동하지 않음

완벽히 분리된 구조라기보단 fork로 계층화된 process이고, PID namespace안에 따로 pid1이 존재하는 구조

 

PID Namespace


PID Namespace에서의 pid1이 죽으면 namepsace가 죽음

signal handlers가 자동으로 등록되지 않음

zombie, orphan process 처리를 해줘야함

PID namespace의 구조

unshare과 fork를 하고 난 뒤의 구조

이렇듯 PID namespace에서는 2개의 pid를 갖게됨

parent namespace에서 보면 PID4인 프로세스가 child namespace에서 보면 PID1로 존재

 

## host2 (parent namespace)
# ps -ef | grep unshare
root       19429   19423  0 05:32 pts/0    00:00:00 unshare -fp --mount-proc

# lsns -p 19429
        NS TYPE   NPROCS   PID USER COMMAND
4026532230 mnt         2 19429 root unshare -fp --mount-proc

# lsns 4026532230
  PID  PPID USER COMMAND
19429 19423 root unshare -fp --mount-proc
19430 19429 root └─-bash

## host1 (PID(child) namespace)
# lsns -t pid -p 1
        NS TYPE NPROCS PID USER COMMAND
4026532231 pid       2   1 root -bash

## host2 (parent namespace)
# lsns -t pid -p 19429
        NS TYPE NPROCS PID USER COMMAND
4026531836 pid     127   1 root /sbin/init

하나의 호스트에서 unshare + fork로 새로운 process를 실행한 뒤

다른 호스트와 PID namespace에서 pid를 확인한 결과

차례대로 보면 pid19429가 PID(child) namepsace에서는 pid1로 존재하는 것을 확인가능

 

반응형

댓글