Ich möchte Linux auf einem eingebetteten Gerät (Mips) ausführen, für das einige sehr strenge Einschränkungen gelten:
- nur 16 MB Speicher
- kein kabelgebundenes Ethernet (nur WLAN)
Gute Nachrichten:
- Ich habe einen funktionierenden Bootloader (u-boot)
- Ich habe auch einen funktionierenden Kernel (Version 3.10.14 #2 PREEMPT)
- und ich habe ein funktionierendes Root-Dateisystem (Linux kann gestartet werden und ich kann mich anmelden)
Jetzt besteht das Problem darin, dass ich keinen Platz mehr habe, um Benutzeranwendungen auf dieser Hardware auszuführen. Deshalb möchte ich auf NFS umsteigen.
Hier bin ich mir über die Vorgehensweise nicht sicher.
Der Bootvorgang wird, wie erwähnt, von U-Boot durchgeführt. U-Boot kann das WLAN jedoch nicht initialisieren, daher benötige ich zu diesem Zweck ein kleines Linux-Betriebssystem.
Hauptidee
- U-Boot lädt den Kernel und startet ihn
- Der Kernel enthält Treiber für den WLAN-Chip und mountet das Root-FS
- rootfs enthält die notwendigen Dateien für die Verbindung zum AP (Passwörter, SSID usw.)
- Sobald die Verbindung steht, mountet NFS das Remote-FS in /opt oder so
Ist es irgendwie möglich, das Root-Dateisystem (/) durch das auf NFS liegende zu ersetzen? (Trotz der Tatsache, dass die WLAN-Konfiguration, die zum Herstellen der Verbindung erforderlich war, auf dieser Partition gespeichert ist)
Aktualisieren
Ich habe erfolgreich NFS-Clientprogramme für MIPS kompiliert und das Gerät ist nun in der Lage, das neue Root-FS über NFS in ein Verzeichnis zu mounten, allerdingsPivot-Wurzelschlägt fehl:
# mount -o nolock IPADDRESS:/srv/fs /tmp/nfs
# ls /tmp/nfs
bin
etc
...
# ls /tmp
nfs
old
# pivot_root /tmp/nfs /tmp/old
pivot_root: Invalid argument
# pivot_root
BusyBox v1.29.0.git (2018-06-23 20:08:52 CEST) multi-call binary.
Usage: pivot_root NEW_ROOT PUT_OLD
Move the current root file system to PUT_OLD and make NEW_ROOT the new root file system
Antwort1
Ja – und Sie machen im Grunde dasselbe wie ein initramfs auf Linux-PCs. Das initramfs startet wie ein normales Root-Dateisystem auf einem In-Memory- /
Rootfs; dann mountet es das echte Root-Dateisystem irgendwo unter /mnt oder /real.
(Dies wird tatsächlich häufig verwendet, um NFS-Root auf Servern zu implementieren, in Situationen, in denen die integrierte NFS-Unterstützung des Kernels nicht ausreicht – beispielsweise wenn Kerberos benötigt wird.)
Der wichtige Schritt ist die Verwendung derpivot_root()Systemaufruf zum Tauschen des aktuellen Root-Verzeichnisses mit dem neu gemounteten. Nach dem Aufruf bleibt das ursprüngliche Root-Verzeichnis zwar noch gemountet, aber nicht mehr bei / – der Aufruf verschiebt das Mounten in ein Unterverzeichnis des „neuen“ Root-Verzeichnisses.
Da ist auch ein
pivot_root
Programmin Busybox (sowie in util-linux), das verwendet werden kann, wenn Ihr Init-Prozess ein Shellscript ist (was häufig der Fall ist). Die verlinkte Manualpage von util-linux enthält Beispiele für die Verwendung.Alternativ, gemäßLinuskann es genügen, einfachchroot()in das neu gemountete Stammverzeichnis – das heißt, wenn Sie keinen Zugriff mehr auf das ursprüngliche Stammverzeichnis benötigen. Auch
chroot
hierfür gibt es ein Befehlszeilentool.
Hinweis: Sie müssen nichtbrauchenum dies zu erreichen, müssen Sie ein Initramfs erstellen und verwenden. Dabei ist es den Funktionen egal, ob sie von einem Initrd-Image oder einem echten Rootfs aufgerufen werden.
Da ein „normales“ initramfs jedoch von einem temporären, im Arbeitsspeicher entpackten Dateisystem ausgeführt wird, ist es für Tools wie üblich üblich, switch_root
alle initramfs-Dateien direkt vor dem Wechsel zum neuen Stamm zu löschen. Wenn Sie jedoch direkt von einem Dateisystem auf der Festplatte booten, ist dies wahrscheinlichnichtwas Sie wollen, also verwenden Sie auf keinen Fall switch_root
nur das Werkzeug pivot_root
.