이것매뉴얼 페이지PID 네임스페이스를 생성할 때 --fork
및 사용에 관심이 있을 수 있음을 지정 --mount-proc
하지만 이러한 옵션이 기본값이 아닌 이유는 무엇입니까?
답변1
Linux 네임스페이스는 다음 명령을 사용하여 생성됩니다.unshare(2)
시스템 호출. 이것unshare
프로그램그냥 얇은 포장지unshare(2)
기본 시스템 호출만큼 유연한 방식으로 네임스페이스 기능을 노출하는 시스템 호출입니다.
대부분의 네임스페이스의 경우unshare(2)
호출 프로세스 런타임 환경을 수정하여 상위 네임스페이스에서 분리하고 새(일반적으로 비어 있는) 네임스페이스와 연결합니다. 예를 들어, 프로세스는 다음에서 시작됩니다.네트워크 네임스페이스장치가 없는 비어 있는 새 네트워크 네임스페이스가 즉시 표시됩니다.
이것PID 네임스페이스, 그러나 다르게 작동합니다. 분리된 PID 네임스페이스가 호출 되면 unshare()
호출 프로세스의 런타임 환경을 수정하지 않지만 이후의 하위 프로세스가 fork()
새 pid 네임스페이스에 들어가고 새 네임스페이스에서 PID 1을 수신하게 됩니다. PID 1은 init
이 프로세스를 위해 예약되어 있습니다.
--fork
및 --mount-proc
가 기본 옵션이 아닌 가능한 이유 는 다음과 같습니다 .
--fork
기본값이 아닐 수도 있음다른 네임스페이스는 분기할 필요가 없습니다.이며--fork
이 옵션의 동작이--pid
다른 네임스페이스 옵션이 직접 매핑되는 방식과 일치 하도록 별도의 옵션으로 제공됩니다.unshare(2)
배너.--mount-proc
아마도 기본값은 아닐 것입니다. 이는--mount
적절한 플래그를 사용하는--fork
것 외에 다른 작업을 수행하는 것과 유사한 네임스페이스( ) 설치를 의미하기 때문입니다.unshare(2)
PID 네임스페이스를 올바르게 사용하려면 init
새 네임스페이스에서 작동하도록 설계된 특수 프로그램이 필요합니다. 새로운 PID 네임스페이스에서 pid
PID 1을 사용하는 프로세스는 다른 프로세스에 비해 세 가지 고유한 기능을 갖습니다.
1) 기본 신호 처리기를 자동으로 수신합니다. 이는 프로세스가 명시적으로 신호 처리기를 등록하지 않는 한 전송된 신호가 무시된다는 의미입니다.
2) 네임스페이스의 다른 프로세스가 하위 프로세스보다 먼저 종료되면 해당 하위 프로세스는 pid 1의 프로세스로 재설정됩니다. 이를 통해 init
프로세스의 종료 상태를 수집하여 커널이 프로세스 테이블에서 해당 프로세스를 제거할 수 있습니다.
3) PID 1인 프로세스가 종료되면 pid 네임스페이스의 다른 모든 프로세스가 강제 종료되고 네임스페이스가 소멸됩니다.
이러한 이유로 애플리케이션 프로세스는 일반적으로 PID 네임스페이스 내에서 PID 1로 실행하기에 적합하지 않습니다.
다양한 커널 제어 리소스에 대한 네임스페이스를 추가하는 주요 동기는 다음과 같습니다.컨테이너 기술, 특히시스템 컨테이너기존 환경과 매우 유사한 환경 제공가상 기기(VMS)이지만 가상 머신 하드웨어를 에뮬레이트하는 별도의 코어를 실행하는 오버헤드가 없습니다. 초기에 네임스페이스가 Linux 커널에 도입되었습니다(주로 Linux 2.4.19 - 3.8 사이), PID 네임스페이스는 Mount, UTS, IPC 및 Network 네임스페이스 뒤에 도입되었습니다.이전 버전unshare
다양한 네임스페이스 옵션의 예상 동작에 대한 선례를 설정하세요.
성숙한 컨테이너 프레임워크 이전.LXC그리고루스트어바웃사용 가능,unshare
새 PID 네임스페이스 및 기타 비공유 네임스페이스로 구성된 새 컨테이너 내에 init
데몬(예:)을 생성하기 위한 임시 유틸리티로 사용할 수 있습니다. systemd
이러한 프레임워크에는 별도의 작업 없이 컨테이너를 시작하기 위한 자체 기능이 포함되어 있습니다.unshare
. 현대 버전systemd
unshare
이 기능은 별도의 유틸리티 없이도 지원됩니다..