Ein Ansatz könnte darin bestehen, PID-Namespaces zu verwenden:
Starten Sie Ihr System mit einem init=/some/cmd
as-Kernel-Parameter, in dem /some/cmd
ein Prozess in einem neuen Namespace ( CLONE_NEWPID
) gegabelt und ausgeführt /sbin/init
wird (PID 1 in diesem neuen Namespace und PID 2 im Root-Namespace). Führen Sie dann im übergeordneten Namespace Ihren " Programm".
Sie möchten wahrscheinlich eine Möglichkeit, Ihr Programm auf die eine oder andere Weise zu steuern (z. B. TCP- oder ABSTRACT Unix-Socket).
Wahrscheinlich möchten Sie Ihr Programm im Speicher speichern und die meisten Verweise auf das Dateisystem schließen, damit es auf nichts angewiesen ist.
Dieser Prozess wird vom Rest des Systems nicht gesehen. Der Rest des Systems läuft praktisch wie in einem Container.
Wenn dieser Prozess abbricht, gerät der Kernel in Panik, was Ihnen eine zusätzliche Garantie gibt.
Ein unangenehmer Nebeneffekt ist jedoch, dass wir die Kernel-Threads in der Ausgabe von nicht sehen ps
.
Als Proof of Concept (mit diesem Trick können Sie eine Kopie Ihres Systems in einer virtuellen qemu-Maschine starten):
Erstellen Sie ein /tmp/init
Like:
#! /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"
(Sie benötigen unshare
eine neuere Version von util-linux (2.14)). Oben verwenden wir socat
als "Programm", das nur auf TCP-Verbindungen an Port 1234 mit der Ausgabe von antwortet ps -efH
.
Starten Sie dann Ihre VM wie folgt:
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'
Dann sehen wir:
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