Jednym z podejść może być użycie przestrzeni nazw PID:
Uruchom system z init=/some/cmdparametrem jądra jako, w którym /some/cmdforksuje proces w nowej przestrzeni nazw ( CLONE_NEWPID) i uruchamia się /sbin/initw nim (będzie miał PID 1 w tej nowej przestrzeni nazw i pid 2 w głównej przestrzeni nazw), a następnie w rodzicu, wykonaj polecenie „ program".
Prawdopodobnie będziesz chciał mieć sposób kontrolowania swojego programu w taki czy inny sposób (na przykład gniazdo TCP lub ABSTRACT Unix).
Prawdopodobnie będziesz chciał zablokować swój program w pamięci i zamknąć większość odniesień do systemu plików, aby na niczym nie polegał.
Ten proces nie będzie widoczny z reszty systemu. Reszta systemu będzie działać tak jak w kontenerze.
Jeśli ten proces umrze, jądro wpadnie w panikę, co daje dodatkową gwarancję.
Niewygodnym efektem ubocznym jest jednak to, że nie zobaczymy wątków jądra na wyjściu ps.
Jako dowód koncepcji (używając tej sztuczki, aby uruchomić kopię systemu na maszynie wirtualnej qemu):
Utwórz /tmp/initpodobny:
#! /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"
(potrzebujesz unsharez najnowszej wersji util-linux (2.14)). Powyżej używamy socatjako „program”, który po prostu odpowiada na połączeniach TCP na porcie 1234 z wyjściem ps -efH.
Następnie uruchom maszynę wirtualną jako:
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'
Następnie widzimy:
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