Wie lade ich initrd in den Speicher, um es bei Verwendung von kexec an den Kernel zu übergeben?

5

Da der MIPS-Port von kexecden --initrdParameter nicht unterstützt, suche ich nach Problemumgehungen, um die Funktion zu imitieren. Laut Linux / MIPS-Wiki unterstützen MIPS-Kernel rd_startund rd_sizeKernel-Befehlszeilenargumente zur Angabe des Speicherorts von initrd. Ich frage mich, ob es möglich ist, initrd in den Speicher zu laden und es an die Kernel-Parameter weiterzugeben.

Wenn es möglich ist, wo im Speicher sollte ich die Datei laden und wie lade ich sie? Ich dachte darüber nach, den Kernel und die initrd in eine Datei zu verketten, aber wie erhalte ich die Adresse, kexecunter der der neue Kernel geladen wurde?

Ein bisschen Hintergrundwissen: Ich habe einen WNDR3700- WLAN-Router, auf dem OpenWrt mit einem kexec-Kernel ausgeführt wird. Mein Ziel ist es, einen Vanille OpenWrt-Kernel zu booten, der auf USB gespeichert ist, um Upgrades zu vereinfachen. Das Problem ist (derzeit), dass die USB-Module nicht in den Kernel integriert sind, sondern als ladbare Kernel-Module bereitgestellt werden. Ich kann mit einem eingebetteten initramfs von usb auf einen anderen Kernel booten, aber mit einem initramfs muss ich den Kernel kompilieren, nicht wahr? Könnte ich initramfs / initrd alternativ in eine vorhandene Kernel-Binär- / Elf-Datei (ohne Ramdisk) einbetten und ein erneutes Kompilieren des Kernels vermeiden?

Wenn Sie die USB-Module offensichtlich in den Kernel kompilieren möchten, müssen Sie den Kernel neu kompilieren. Dies ist also keine Option.

Jani
quelle

Antworten:

1

Wenn es möglich ist, wo im Speicher sollte ich die Datei laden und wie lade ich sie?

Auf Linux-Kleingeräten haben Sie Speicherbereiche definiert:

$ cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00020000 00010000 "u-boot"
mtd1: 00102b20 00010000 "kernel"
mtd2: 006cd4e0 00010000 "rootfs"
mtd3: 00510000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 007d0000 00010000 "firmware"

Achten Sie darauf, Ihr Gerät nicht zu vermauern.


quelle
Ist MTD nicht der Flash-Speicher? Ich würde annehmen, dass ich die neue initrd nicht in den Flash laden möchte, wenn ich einen Kernel nur temporär mit der initrd booten möchte. Stattdessen ist eine Stelle im RAM sinnvoller, nicht wahr? cat /proc/mtdsagt folgendes für meinen aktuellen, modifizierten Kernel mit einer eingebauten initrd, die mit kexec gebootet wird: mtd0: 00800000 00010000 "spi0.0"und sonst nichts. Wenn ich mir den /proc/mtdaus dem vorherigen Kernel anschaue, wird natürlich das reale Layout angezeigt.
Jani
Ja, es ist Flash. Ich kann dir nicht sagen, das ist auch neu für mich. Normalerweise müssen Sie die Adresse auch nicht angeben, wenn Sie kexec ausführen.