Salah satu pendekatan bisa menggunakan ruang nama PID:
Boot sistem Anda dengan init=/some/cmd
parameter as kernel, tempat /some/cmd
fork proses di namespace baru ( CLONE_NEWPID
) dan berjalan /sbin/init
di dalamnya (PID 1 akan ada di namespace baru dan pid 2 di namespace root), lalu di induk, jalankan " program".
Anda mungkin menginginkan cara untuk mengontrol program Anda dengan satu atau lain cara (TCP atau soket Unix ABSTRAK misalnya).
Anda mungkin ingin memlocking program Anda di memori dan menutup sebagian besar referensi ke sistem file sehingga tidak bergantung pada apa pun.
Proses itu tidak akan terlihat dari sisa sistem. Sisa dari sistem akan berjalan seperti dalam wadah.
Jika proses itu mati, kernel akan panik yang memberi Anda jaminan ekstra.
Efek samping yang tidak nyaman adalah kita tidak akan melihat utas kernel di keluaran ps
.
Sebagai bukti konsep (menggunakan trik ini untuk mem-boot salinan sistem Anda di mesin virtual qemu):
Buat yang /tmp/init
seperti:
#! /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"
(Anda perlu unshare
dari versi terbaru util-linux (2.14)). Di atas kami menggunakan socat
sebagai "program" yang hanya menjawab pada koneksi TCP pada port 1234 dengan output ps -efH
.
Kemudian boot VM Anda sebagai:
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'
Lalu, kita melihat:
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