PID 네임 스페이스를 사용하는 방법이 있습니다.
init=/some/cmd
커널 매개 변수로 시스템을 부팅합니다 . 여기서 /some/cmd
새 네임 스페이스 ( CLONE_NEWPID
) 에서 프로세스를 분기 하고 실행 /sbin/init
합니다 (새 네임 스페이스에서 PID 1을, 루트 네임 스페이스에서 pid 2를 갖습니다). 프로그램".
프로그램을 어떤 방식 으로든 제어하는 방법이 필요할 것입니다 (예 : TCP 또는 ABSTRACT Unix 소켓).
아마도 프로그램을 메모리에 담그고 파일 시스템에 대한 대부분의 참조를 닫아서 아무것도 의존하지 않기를 원할 것입니다.
이 과정은 나머지 시스템에서는 볼 수 없습니다. 나머지 시스템은 사실상 컨테이너처럼 실행됩니다.
해당 프로세스가 종료되면 커널이 패닉 상태가되어 추가 보증이 제공됩니다.
불편한 부작용은의 출력에서 커널 스레드를 볼 수 없다는 것입니다 ps
.
개념 증명 ( 이 트릭 을 사용하여 qemu 가상 머신에서 시스템 사본을 부팅) :
다음 /tmp/init
과 같이 작성하십시오 .
#! /bin/sh -
echo Starting
/usr/local/bin/unshare -fmp -- sh -c '
umount /proc
mount -nt proc p /proc
exec bash <&2' &
ifconfig lo 127.1/8
exec socat tcp-listen:1234,fork,reuseaddr system:"ps -efH; echo still running"
( unshare
최신 버전의 util-linux (2.14)에서 필요합니다). 위 socat
의 출력은 1234 포트의 TCP 연결에 응답하는 "프로그램"으로 사용 하고 ps -efH
있습니다.
그런 다음 VM을 다음과 같이 부팅하십시오.
kvm -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
-m 1024 -fsdev local,id=r,path=/,security_model=none \
-device virtio-9p-pci,fsdev=r,mount_tag=r -nographic -append \
'root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/tmp/init rw'
그런 다음에
Begin: Running /scripts/init-bottom ... done.
Starting
[...]
root@(none):/# ps -efH
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:24 ? 00:00:00 bash
root 4 1 0 14:24 ? 00:00:00 ps -efH
root@(none):/# telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 14:24 ? 00:00:00 [kthreadd]
root 3 2 0 14:24 ? 00:00:00 [ksoftirqd/0]
[...]
root 1 0 2 14:24 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 204 1 0 14:24 ? 00:00:00 /usr/local/bin/unshare -fmp -- sh -c umount /proc mount -nt proc p /proc exec bash <&2
root 206 204 0 14:24 ? 00:00:00 bash
root 212 206 0 14:25 ? 00:00:00 telnet localhost 1234
root 213 1 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 214 213 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 215 214 0 14:25 ? 00:00:00 sh -c ps -efH; echo still running
root 216 215 0 14:25 ? 00:00:00 ps -efH
still running
Connection closed by foreign host.
root@(none):/# QEMU: Terminated