Nachdem ich durch eine Antwort auf meine frühere Frage an initramfs verwiesen wurde (danke!), Habe ich daran gearbeitet, initramfs zum Laufen zu bringen. Ich kann jetzt den Kernel booten und zu einer Shell-Eingabeaufforderung wechseln, wo ich Busybox-Befehle ausführen kann, was großartig ist.
Hier stecke ich fest - es gibt (mindestens) zwei Methoden zum Generieren von initramfs-Bildern:
- Durch Übergeben des Kernels einen Pfad zu einer vorkomprimierten Verzeichnishierarchie, die komprimiert werden soll
- Durch Übergeben des Kernels den Namen einer Datei, in der die einzuschließenden Dateien aufgelistet sind.
Die zweite Methode schien etwas sauberer zu sein, also habe ich sie benutzt.
Nur als Referenz, hier ist meine bisherige Dateiliste:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox /home/brandon/rascal-initramfs/bin/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init /home/brandon/rascal-initramfs/init.sh 755 0 0
Leider habe ich erfahren, dass Busybox eine lange Liste von Links benötigt, um als Aliase für all seine verschiedenen Befehle zu dienen. Gibt es eine Möglichkeit, die Liste aller dieser Befehle zu generieren, damit ich sie meiner Dateiliste hinzufügen kann?
Alternativ könnte ich mithilfe der vorgefertigten Verzeichnishierarchie zu Methode 1 wechseln, bin mir jedoch nicht sicher, wie die / dev-Knoten in diesem Fall erstellt werden sollen.
Beide Wege scheinen chaotisch. Gibt es dafür eine elegante Lösung?
Antworten:
Es ist nicht der Kernel, der die initramfs generiert , sondern cpio . Was Sie also wirklich suchen, ist eine Möglichkeit, ein CPIO-Archiv zu erstellen, das Geräte, symbolische Links usw. enthält.
Ihre Methode 2 verwendet
usr/gen_init_cpio
im Kernel-Quellbaum das CPIO-Archiv während des Kernel-Builds. Dies ist in der Tat eine gute Möglichkeit, ein cpio-Archiv zu erstellen, ohne zuerst das lokale Dateisystem füllen zu müssen (für die Erstellung aller Geräte müsste root sein oder fakeroot oder ein FUSE-Dateisystem verwenden, von dem ich nicht sicher bin, ob es bereits geschrieben wurde).Alles, was Sie vermissen, ist das Generieren der Eingabedatei
gen_init_cpio
als Erstellungsschritt. ZB in der Schale:Wenn Sie die symbolischen Links zur Busybox widerspiegeln möchten, die in Ihrem Build-Baum vorhanden sind, haben Sie folgende Möglichkeiten (ich nehme an, Sie bauen auf Linux):
Hier ist eine Möglichkeit, alle Ihre symbolischen Links zu kopieren:
Bei Busybox verfügt Ihr Build-Baum möglicherweise nicht über die Symlinks. Stattdessen möchten Sie für jedes Dienstprogramm, in dem Sie kompiliert haben, einen erstellen. Der einfachste Weg, den ich mir vorstellen kann, besteht darin, in Ihrem Busybox-Build-Baum nach
.*.o.cmd
Dateien zu suchen : eine pro generiertem Befehl.quelle
Die ersten Zeilen des Initscript in meinen Initramfs sind einfach:
Erstellt die Symlinks für Sie. Es dauert auf meinem 500-MHz-Board nur unermesslich wenig Zeit, möglicherweise länger bei sehr geringer Hardware, aber wahrscheinlich überschaubar. Spart eine Reihe von Problemen, bei denen Sie daran denken, beim Aktualisieren von BB die richtigen Links zu erstellen ...
quelle
Wenn Sie sich in der Busybox-Shell (Asche) befinden, müssen Sie sich keine Gedanken über Aliase machen, da diese standardmäßig als Befehle IIRC ausgeführt werden. Wie auch immer,
busybox --help
gibt eine Liste der unterstützten Befehle. In meinem Fall sind sie:Bei der ersten Methode erstellen Sie per
mknod(1)
Befehl. Zum Beispiel:quelle
busybox --help
wahrscheinlich nur zubusybox: cannot execute binary file
... Die meisten eingebetteten Entwicklungen werden übergreifend kompiliert. Wir wissen, dass Pingswept für Arm kompiliert wird, und er kompiliert wahrscheinlich auf i386 oder amd64.