"nsenter:"를 사용하여 하위 프로세스를 감옥에 두는 안정적인 방법

"nsenter:"를 사용하여 하위 프로세스를 감옥에 두는 안정적인 방법

나는 무엇보다도 Linux 네임스페이스를 사용하여 자식 프로세스를 좀비화하거나 init. util-linux시작된 모든 프로세스가 다른 프로세스의 직접적인 네임스페이스 하위 항목인지 관찰, 모니터링 및 확인 하는 도구를 어떻게 사용하고 제공할 수 있습니까 ?mountnsenter

답변1

PID 네임스페이스 생성

여기서 사용할 올바른 명령은 입니다 unshare. 이 작업을 수행하는 데 필요한 옵션은 에서만 사용할 수 있습니다 util-linux 2.23.PID 네임스페이스실행 중인 프로그램의 모든 서브루틴도 이 네임스페이스에 생성됩니다. 새 PID 네임스페이스에서 명령을 실행하려면 다음을 수행하면 됩니다.

sudo unshare -fp some_command

셸을 실행하려면 명령을 생략하면 됩니다. 그러면 프로세스와 그 하위 프로세스가 평소와 같이 상위(시스템) 네임스페이스 내에 PID를 갖게 됩니다. 그러나 새 네임스페이스에서는 PID 1와 프로세스의 일부 특별한 특성을 갖게 됩니다 init. 아마도 모니터링 관점에서 가장 관련성이 높은 기능은 해당 하위 항목 중 하나라도 고아가 되면 init프로세스의 실제 부모가 아닌 해당 프로세스로 재설정된다는 것입니다 .

대부분의 모니터링 사례에서는 이 작업을 수행하는 것만으로도 충분할 수 있습니다. 앞서 언급했듯이 네임스페이스 내의 프로세스는 상위 네임스페이스 내에 PID를 가지므로 일반 명령을 사용하여 해당 활동을 모니터링할 수 있습니다. 또한 네임스페이스의 프로세스가 고아가 되더라도 최상위 프로그램 PID 아래의 프로세스 트리 분기에서 벗어나지 않도록 보장할 수 있습니다. 즉, 여전히 쉽게 추적할 수 있다는 의미입니다.

마운트 네임스페이스와 결합

그러나 우리가 할 수 없는 것은 프로세스의 PID를 모니터링하는 것입니다.생각하다거기에 있습니다. 이를 수행하고 특히 새 네임스페이스에서 명령을 사용할 수 있으려면 해당 네임스페이스에 대해 별도의 파일 시스템을 마운트 ps해야 합니다 . 을 허용하는 procfs유일한 위치 는 이기 때문에 이는 또 다른 문제로 이어집니다 . 한 가지 해결책은 감옥을 만들고 거기에 새 감옥을 설치하는 것 입니다 . 그러나 최소한 우리가 사용하려는 바이너리와 그것이 의존하는 모든 라이브러리를 새 루트에 복사(또는 적어도 하드 링크)해야 하기 때문에 이것은 번거로운 접근 방식입니다.psprocfs/procchrootprocfs

해결책은 또한 새로운 것을 사용하는 것입니다마운트 네임스페이스. 여기서는 PID 네임스페이스에서 사용할 수 있고 다른 것을 방해하지 않는 procfs실제 루트 디렉터리를 사용하여 새 디렉터리를 마운트 할 수 있습니다. /proc이 프로세스를 매우 간단하게 만들기 위해 unshare명령은 다음 --mount-proc옵션을 제공합니다.

sudo unshare -fp --mount-proc some_command

결합된 네임스페이스에서 실행하면 이제 psPID 네임스페이스가 있는 프로세스만 표시되고 PID가 있는 최상위 프로세스가 표시됩니다 1.

무엇에 대해 nsenter?

이름에서 알 수 있듯이 를 nsenter사용하여 생성된 네임스페이스를 입력하는 데 사용할 수 있습니다 unshare. 이는 네임스페이스 내에서만 사용할 수 있는 관련되지 않은 다른 스크립트에서만 정보를 얻으려는 경우에 유용합니다. 가장 쉬운 방법은 네임스페이스 내에서 실행되는 모든 프로그램의 PID에 액세스하는 것입니다. 명확하게 말하면 이는 실행 중인 네임스페이스 내의 대상 프로그램의 PID여야 합니다 nsenter. 네임스페이스는 중첩될 수 있으므로 단일 프로세스에 여러 PID가 있을 수 있습니다. 대상 PID/마운트 네임스페이스에서 셸을 실행하려면 다음을 수행하세요.

sudo nsenter -t $PID -m -p

위에서 설명한 대로 이 네임스페이스를 설정하면 ps이제 이 네임스페이스 내의 프로세스만 나열됩니다.

관련 정보