Was Sie tun möchten, wird mindestens einmal auf nahezu jedem allgemein konfigurierten Linux-System ausgeführt. Die meisten verwenden das Tool, das von busybox
aufgerufen wird switch_root
:
Was switch_root
tut , ist alle Dateien aus löscht rootfs (um den Speicher freizugeben) und dann chroot
in ein neues Dateisystem und exec einen neuen Init - Prozess aus dem neuen Dateisystem.
Dies geschieht während der Systeminitialisierung. Wenn ein Linux-System gestartet wird, bringt der Kernel das System schrittweise hoch. Zuerst wird der Kernel von einem anderen System - wie einem Bootloader oder der Firmware - im Speicher ausgeführt, und an diesem Punkt bleibt der Kernel nur für sich selbst - ohne wirklichen Bezugsrahmen für das System, auf dem er sich befindet es wurde gerade ausgeführt.
Dies ist das, wofür das initramfs
Image normalerweise an seinen Speicherplatz angehängt wird (aber möglicherweise auch direkt in den Kernel kompiliert wird) . Die initramfs ist ein echter Linux - Root (komplett w / /dev
und /proc
und was-habe-Sie) Dateisystem - Image - es ist das erste Root - Dateisystem jemals von einem Linux - Kernel montiert. Es enthält ein Root-Dateisystemarchiv, das alle systemspezifischen Module / Konfigurationsdateien enthält, die erforderlich sind, um den Kernel auf die Beine zu stellen - um ihn zu booten.
Wie auch immer, der Kernel stellt das Archiv als rootfs bereit (im Grunde genommen ein tmpfs ) und unternimmt dann alles Notwendige, um einen anderen/
zu finden und diesen darüber zu mounten. Dies geschieht jedes Mal, wenn Sie Ihr System starten. Es kann es wieder tun, ohne auf unnötige Hacks wie unionfs oder aufs zurückgreifen zu müssen - beides führt wahrscheinlich zu allen Arten von implementierungsspezifischen Komplikationen und Konfigurationsdetails (ganz zu schweigen von Instabilität) .
In der oben zitierten switch_root
Beschreibung werden Sie wahrscheinlich feststellen, dass der Ausdruck alle Dateien aus rootfs löscht . Offensichtlich wäre dies kein wünschenswertes Verhalten beim Wechsel von einem festplattenbasierten Rootfs. Dies geschieht jedoch nur so, wenn switch_root
der Speicher für das RAM-basierte Dateisystem freigegeben wird - und dies ist völlig unnötig. Hier noch etwas aus dem zuvor zitierten Artikel:
Das folgende Shell-Skriptfragment zeigt, wie switch_root verwendet wird:
# First, find and mount the new filesystem.
mkdir /newroot
mount /dev/whatever /newroot
# Unmount everything else you've attached to rootfs. (Moving the filesystems
# into newroot is something useful to do with them.)
mount --move /sys /newroot/sys
mount --move /proc /newroot/proc
mount --move /dev /newroot/dev
# Now switch to the new filesystem, and run /sbin/init out of it. Don't
# forget the "exec" here, because you want the new init program to inherit
# PID 1.
exec switch_root /newroot /sbin/init
Wie Sie oben sehen können, die Handhabung der /dev
, /proc
und die /sys
damit verbundenen Probleme lassen sich sehr einfach erreicht. Wenn Sie eine der mount --move
d-Halterungen überlagern würden, müssten Sie sich übrigens nicht nur mit mtab
und mount
auch mit allen anderen Komplikationen befassen, die Ihr Schichtsystem mit sich bringt. Es ist einfacher, genau so vorzugehen, wie Sie es in der Frage beschrieben haben - hängen Sie root von einem anderen Ort aus ein.
Sie müssen im Grunde alles tun, was in einer typischen Initramfs-Konfiguration passiert, und sehr wenig anderes - (was nicht dazu gedacht ist, Debian- oder Redhats Initramfs-Images zu enthalten - beide sind weit überentwickelt) . Das einzige wirkliche Problem, auf das Sie stoßen könnten, ist, wie Sie PID1 dazu bringen, diesem Beispiel zu folgen. Wenn Sie den Init Ihres Systems auf verwaisten Rootfs festsitzen lassen, kann es bald zu sehr seltsamen Dingen auf Ihrem System kommen. Der naheliegende Weg, dies zu handhaben, besteht darin, sich ab initramfs vorzubereiten. Stellen Sie einfach sicher, dass der init
Prozess Ihrer Festplatte exec
später auf einen anderen vorbereitet wird, wenn Sie die Roots wechseln möchten. Wenn Sie eine verwenden, systemd
init
wird diese Komplikation bereits für Sie behandelt:
systemctl --help
...
switch-root ROOT [INIT] Change to a different root file system
...
Wenn Sie eine systemd
-basierte verwenden init
, sollten Sie die Einheitendateien untersuchen /usr/lib/systemd/system/initrd*
, um eine Vorstellung davon zu erhalten, wie die häufig geskriptete systemd
Switch-Root-Situation im Stil eines Skripts aussieht.
Ein anderer Weg zu gehen , um es zu imitieren sein könnte busybox
‚s switch_root
in initramfs - aber das Teil zu verlassen, wo Sie alle anfänglichen root Dateien löschen. Arch Linux-Systeme, die mit systemd
in initramfs konfiguriert wurden, tun dies. Auf diesen stellt sich das initramfs-Stammverzeichnis vor dem Ausführen des Switch-Stammverzeichnisses in /newroot
's ein /run/initramfs
und ist das, worauf das System beim Herunterfahren zurückgreift, um Sleep / Suspend und ähnliches sauber zu handhaben. Das ist vielleicht der beste Weg für Ihren Fall - nur ein winziges, ram-beständiges Root-System, von dem Sie für Ihre verschiedenen individuell verwurzelten Anwendungen Ping-Pong-fähig sind.