Bir yaklaşım PID ad alanlarını kullanmak olabilir:
Sisteminizi, yeni bir ad alanında ( ) bir işlem çatalla (ve bu işlemde çalıştırır) init=/some/cmd
, çekirdek /some/cmd
ad parametresiyle önyükleyin (bu yeni ad alanında PID 1 ve kök ad alanında pid 2 olacaktır), ardından üst öğede " Program".CLONE_NEWPID
/sbin/init
Muhtemelen programınızı şu veya bu şekilde kontrol etmenin bir yolunu isteyeceksiniz (örneğin, TCP veya ABSTRACT Unix soketi).
Muhtemelen programınızı bellekte kilitlemek ve dosya sistemine yapılan çoğu referansı kapatmak, böylece hiçbir şeye güvenmemek istersiniz.
Bu süreç sistemin geri kalanından görülmeyecek. Sistemin geri kalanı aslında bir kapta olduğu gibi çalışacaktır.
Bu işlem sona ererse, çekirdek size ekstra bir garanti veren panikleyecektir.
Rahatsız edici bir yan etki, çıktısında çekirdek ipliklerini görmeyeceğimizdir ps
.
Bir kavram kanıtı olarak ( sisteminizin bir kopyasını qemu sanal makinesinde önyüklemek için bu hileyi kullanarak ):
Bir /tmp/init
beğenme oluşturun :
#! /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'un (2.14) son sürümlerinden birine ihtiyacınız var ). Yukarıda socat
, 1234 numaralı bağlantı noktasındaki TCP bağlantılarının çıkışıyla yanıt veren "program" olarak kullanıyoruz ps -efH
.
Ardından VM'nizi şu şekilde başlatın:
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'
Sonra görüyoruz:
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