Ich habe ein Tutorial zum Einrichten eines benutzerdefinierten initramfs durchlaufen, in dem Folgendes angegeben ist:
Das einzige, was fehlt, ist / init, die ausführbare Datei im Stammverzeichnis des initramfs, die vom Kernel ausgeführt wird, sobald er geladen ist. Da sys-apps / busybox eine voll funktionsfähige Shell enthält, können Sie Ihre / init-Binärdatei als einfaches Shell-Skript schreiben (anstatt es zu einer in Assembler oder C geschriebenen komplizierten Anwendung zu machen, die Sie kompilieren müssen).
und gibt ein Beispiel für init als Shell-Skript, das mit beginnt #!/bin/busybox sh
Bisher hatte ich den Eindruck, dass init der Hauptprozess ist, der gestartet wird, und dass alle anderen User-Space-Prozesse letztendlich Kinder von init sind. In dem gegebenen Beispiel ist der erste Prozess jedoch tatsächlich der, bin/busybox/ sh
aus dem später init erzeugt wird.
Ist das eine korrekte Interpertation? Wenn ich zum Beispiel zu diesem Zeitpunkt einen verfügbaren Interpreter hätte, könnte ich init als Python-Skript usw. schreiben.
quelle
/
verschwindet nicht in Luft - es wird über montiert (obwohl normalerweise sein Inhalt gelöscht wird, bevor es Speicher spart) . Es ist immer noch da . Tutswitch_root
den Syscallswitchroot
- das ist es, was die Kernel-Entwickler bereitgestellt haben, als sie den Boot-Prozess in Kernel 2.6 geändert haben. Etwas, das initramfs erfordert. Es ist der Kernel, der die Magie ausübt.switchroot
Syscall wäre in der Tat eine Neuigkeit für mich. Hast du eine Quelle dafür? Wenn Sie sich den Quellcode switch_root.c ansehen, scheint es sich um einen ziemlich manuellen Prozess zu handeln, der auch in Documentation / filesystems / ramfs-rootfs-initramfs.txt beschrieben ist. Auch wenn Sie alles löschen und erneut einbinden, ist es an diesem Punkt so gut wie verschwunden, finden Sie nicht auch?pivot_root
Auf der anderen Seite ist ein Syscall. Es wird jedoch nicht verwendetswitch_root
und kann nicht verwendet werden, ohne durch einige Reifen zu springen, und so oder so spielt es für diese Antwort überhaupt keine Rolle, also habe ich es einfach komplett entfernt. Schade, ich dachte, dass Magie und Verschwinden in Luft sehr gut funktioniert ... :-Pswitch_root
- was mir leid tut und ich danke Ihnen, dass Sie es mir gezeigt haben -, aber es verschwindet trotzdem nichts. initramfs root bleibt bestehen und ist immer für alle da - es ist root.find -xdev / -exec rm '{}' ';'
, um Speicherplatz freizugeben ( ), hängen Sie rootfs mit dem neuen root (cd /newmount; mount --move . /; chroot .
) über, hängen Sie stdin / stdout / stderr an das neue / dev / console an und führen Sie das neue init aus.Der Exec-Syscall des Linux-Kernels versteht shebangs nativ
Wenn die ausgeführte Datei mit den magischen Bytes beginnt, weisen
#!
sie den Kernel an, Folgendes zu verwenden#!/bin/sh
:exec
Systemaufruf/bin/sh
Dies ist genau das gleiche, was passiert, wenn Sie ein reguläres Userland-Shell-Skript ausführen mit:
Wenn die Datei begonnen hatte , mit der Magie Bytes
.ELF
statt#!
, würde der Kernel die ELF - Loader wählen , anstatt es zu laufen.Weitere Informationen finden Sie unter: Warum schreiben die Leute den Python-Shebang #! / Usr / bin / env in die erste Zeile eines Python-Skripts? | Paketüberfluss
Wenn Sie dies einmal bedacht haben, wird es leicht, zu akzeptieren, dass
/init
dies alles sein kann, was der Kernel ausführen kann, einschließlich eines Shell-Skripts, und warum/bin/sh
in diesem Fall die erste ausführbare Datei sein wird.Hier ist ein minimal ausführbares Beispiel für diejenigen, die es ausprobieren möchten: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/cbea7cc02c868711109ae1a261d01fd0473eea0b#custom-init
quelle