리눅스 네임 스페이스는 다른 것들 중에서도 좀비와 덤핑 가능성없이 자식 프로세스를 안전하게 제한하고 다루기 위해 활용 될 수 있다는 것을 알고있다 init
. 그러나 구현 세부 사항에 대해 애매합니다. 어떻게에서 제공하는 도구를 사용할 수있는 util-linux
같은 mount
과 nsenter
, 시청하는 모니터를하고, 모든 프로세스가 다른 프로세스의 직접 네임 스페이스의 후손이 시작되도록?
답변
PID 네임 스페이스 생성
여기에 올바른 명령은 unshare
입니다. 이 작업을 수행하는 데 필요한 옵션은에서만 사용할 수 있습니다 util-linux 2.23
. 아이디어는 실행중인 프로그램에 대해 새로운 PID 네임 스페이스 를 작성하여 모든 하위 요소 도이 네임 스페이스에 작성되도록하는 것입니다. 다음을 수행하여 새 PID 네임 스페이스에서 명령을 실행할 수 있습니다.
sudo unshare -fp some_command
쉘을 실행하려면 명령을 생략하십시오. 이렇게하면 자식 (자식)과 함께 부모 (시스템) 네임 스페이스 내에서 평소와 같이 PID를 갖는 프로세스가 생성됩니다. 그러나 새 네임 스페이스 내 1
에서 init
프로세스 의 일부 특수 특성과 함께 PID를 갖게 됩니다. 모니터링 관점에서 가장 관련성이 높은 특성은 하위 항목 중 하나가 고아 인 경우 실제 init
프로세스 가 아니라이 프로세스로 다시 양육된다는 것 입니다.
이 작업을 수행하면 대부분의 모니터링 사례에 충분할 수 있습니다. 앞에서 언급 한 것처럼 네임 스페이스 내의 프로세스에는 모두 부모 네임 스페이스 내에 PID가 있으므로 일반 명령을 사용하여 활동을 모니터링 할 수 있습니다. 또한 네임 스페이스의 프로세스가 고아가되면 최상위 수준 프로그램의 PID 아래에있는 프로세스 트리 분기에서 벗어나지 않으므로 여전히 쉽게 추적 할 수 있습니다.
마운트 네임 스페이스와 결합
그러나 우리가 할 수없는 것은 PID가 있다고 생각 하는 프로세스를 모니터링하는 것입니다 . 이를 위해, 특히 ps
새 네임 스페이스 내에서 명령 을 사용할 수 있으려면 네임 스페이스에 대해 별도의 procfs
파일 시스템 을 마운트해야 합니다. 이를 ps
수용 하는 유일한 위치는이므로 다른 문제 procfs
가 발생 /proc
합니다. 한 가지 해결책은 chroot
감옥 을 만들고 procfs
거기 에 새 감옥을 설치하는 것입니다. 그러나 이것은 최소한 우리가 사용하려는 바이너리를 새로운 루트에 의존하는 라이브러리와 함께 복사 (또는 적어도 하드 링크)해야하기 때문에 번거로운 접근법입니다.
해결책은 새로운 마운트 네임 스페이스를 사용하는 것 입니다. 이 안에서 우리는 procfs
진정한 루트 /proc
디렉토리 를 사용하는 방식으로 새로운 것을 마운트 할 수 있고 PID 네임 스페이스 내에서 사용 가능하며 다른 어떤 것도 방해하지 않습니다. 이 프로세스를 매우 간단하게하기 위해이 unshare
명령은 다음 --mount-proc
옵션을 제공합니다 .
sudo unshare -fp --mount-proc some_command
이제 ps
결합 된 네임 스페이스 내에서 실행 하면 PID 이름 공간이있는 프로세스 만 표시되고 PID가있는 최상위 프로세스가 표시됩니다 1
.
무엇에 대해 nsenter
?
이름에서 알 nsenter
수 있듯이으로 이미 생성 된 네임 스페이스를 입력하는 데 사용할 수 있습니다 unshare
. 이것은 관련이없는 스크립트에서 네임 스페이스 내부에서만 사용 가능한 정보를 얻으려는 경우에 유용합니다. 가장 간단한 방법은 네임 스페이스 내에서 실행중인 모든 프로그램의 PID에 액세스하는 것입니다. 명확하게하려면이 이름 nsenter
이 실행중인 네임 스페이스 내에서 대상 프로그램의 PID 여야합니다 (네임 스페이스가 중첩 될 수 있으므로 단일 프로세스에 많은 PID가있을 수 있음). 대상 PID / 마운트 네임 스페이스에서 쉘을 실행하려면 다음을 수행하십시오.
sudo nsenter -t $PID -m -p
이 네임 스페이스가 위와 같이 설정되면 ps
해당 네임 스페이스 내의 프로세스 만 나열됩니다.