Linux에서 두 개의 프로세스 네임스페이스를 결합하는 것이 가능한지 알고 싶습니다. 내가 의미하는 바를 증명하기 위해 시나리오는 다음과 같습니다.
프로세스는 별도의 네임스페이스에서 실행됩니다. 우리는 이 과정을 A라고 부릅니다.
이제 프로세스 A가 작업을 수행하고 있으므로 별도의 네임스페이스에 격리된 다른 프로세스 B를 시작합니다.
이제 프로세스 A와 프로세스 B에는 별도의 네임스페이스가 있지만 두 프로세스 네임스페이스를 하나로 "병합"하고 싶습니다. 즉, 프로세스 B가 A의 네임스페이스를 보고 신호를 보내고 A의 프로세스와 상호 작용할 수 있기를 원합니다.
이에 대한 사용 사례는 결국 연결된 컨테이너가 실행 중인 컨테이너와 상호 작용할 수 있도록 컨테이너를 다른 실행 중인 컨테이너에 연결하려는 것입니다.
생각해봤는데 프로세스 B 도 격리되어 setns()
프로세스 A의 네임스페이스 핸들( )을 모르기 때문에 작동하지 않을 것입니다 . /proc/PID/ns/pid
나는 호스트 시스템에서 이것을 달성하는 가장 좋은 방법이 무엇인지 생각하려고 노력하고 있습니다.
이는 이미 docker에 구현되어 있습니다.여기그러나 나는 그 뒤에 있는 논리를 이해할 수 없습니다. 일부 구현 문제도 논의되었습니다.여기그게 도움이 된다면.
시간 내 주셔서 감사합니다!
답변1
Linux 네임스페이스에 관해 이야기할 때 실제로는 여러 가지에 대해 이야기하고 있습니다.다른네임스페이스는 모두 개별적으로 설정할 수 있습니다.
- 프로세스 ID
- 공유 메모리
- 네트워킹
- 호스트 이름 등
- 사용자 ID
- 파일 시스템
프로세스가 올바른 플래그를 사용하여 호출 setns()
하면 clone()
"가짜" 세계관을 사용하여 새 네임스페이스가 생성됩니다.
이제 다시 병합하려는 경우 문제가 발생할 수 있습니다.
간단하기 때문에 "프로세스 ID" 네임스페이스를 사용하겠습니다.
새 PID 네임스페이스를 생성하면 네임스페이스의 첫 번째 프로세스가 PID 1을 얻습니다. 두 개의 새로운 네임스페이스가 있는 경우 PID 1이 있다고 생각하는 두 개의 프로세스가 있는 것입니다. 병합하려는 경우 충돌이 발생하며 그 중 하나만 PID 1을 유지할 수 있습니다.변화실행 중인 프로세스의 PID가 예상치 못한 것입니다. 이로 인해 의도하지 않은 결과가 발생할 수 있습니다.
IPC와 유사합니다. 두 개의 독립적인 공유 메모리 블록이 각각의 네임스페이스 내에서 동일한 주소를 가질 수 있습니다. 이를 병합하려고 하면 메모리 손상이 발생합니다(한 세그먼트의 주소를 변경하더라도).프로세스여전히 이전 주소를 유지합니다.)
따라서 두 개의 기존 네임스페이스를 병합하는 것은 위험합니다.
패치의 기능 docker
은예방하다컨테이너가 시작되면 새 네임스페이스가 생성됩니다. 이는 두 개의 기존 컨테이너를 병합하는 것과는 다릅니다. 컨테이너가 시작될 때 발생합니다.
답변2
내가 아는 한, 서로 다른 프로세스 네임스페이스를 결합할 수 있는 방법은 없습니다. setns
PID 네임스페이스의 프로세스는 다른 네임스페이스의 하위 프로세스만 생성하도록 허용되며, 해당 다른 네임스페이스는 프로세스 네임스페이스의 하위 항목이어야 하므로 이것이 도움이 될 것이라고 생각하지 않습니다.
그러나 시나리오에서는 두 네임스페이스가 밀접하게 관련된 트리에 있는 것으로 나타납니다. 따라서 공통 조상으로부터 시작하여 이 작업을 수행할 수 있습니다.
Docker에 대해 언급한 스레드는 네임스페이스 병합에 대해 이야기하지 않습니다. 하위 네임스페이스를 생성하지 않는 것에 관한 것입니다(따라서 여전히 하나의 큰 네임스페이스임).