Erstellen eines Kernel-Images (.img) einschließlich einer Ramdisk

12

Ich habe meinen Linux-Kernel (3.0.1) für meinen Raspberry Pi mit den folgenden Schritten erstellt:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

Meine Frage ist, wie kann ich kernel.img erstellen? Ich denke, es enthält zImage + Ramdisk, aber wie kann ich das bauen?

Kann mich jemand anleiten, Ramdisk zu erstellen und diese beiden in die Datei kernel.img zu packen? Ich möchte diesen Kernel auf meinem Raspberry Pi booten.

Shantanu Banerjee
quelle
Dies ist eine großartige Frage, von der ich überrascht bin, dass sie noch nicht gestellt wurde.
Jivings
Warum benutzt du Kernel 3.0.1? Wird dieser Vanillekern vor kernel.orgOrt gefunden?
Krzysztof Adamski
Ja, ich habe dies von kernel.org
Shantanu Banerjee
Ich habe eine neue Frage zu qemu hinzugefügt und Raspberry Pi-2 - Kernel mit Busybox in initramfs crosscompiled: raspberrypi.stackexchange.com/questions/56302/...
42n4

Antworten:

8

kernel.img Datei

Bei Verwendung eines Linux-Kernels wird die kernel.imgDatei lediglich umbenannt linux/arch/arm/boot/Image. Es sollte auch möglich sein (oder es war zumindest möglich, als ich das letzte Mal nachgesehen habe), eine komprimierte Version dieser Datei zu verwenden - zImage. Es kann integrierte initramfs(Ramdisk) enthalten, ist aber nicht erforderlich. Beispielsweise enthält die Bestandsdatei kernel.imgkeine initramfswhile- Dateien kernel_emergency.img.

Hinweis: Die offizielle Anleitung zum Kompilieren des Kernels im eLinux-Wiki empfiehlt , dass Sie ein imagetool-uncompressed.pyTool zum Vorbereiten der kernel.imgDatei verwenden. Es war in den frühen Tagen von RaspberyPi notwendig, aber heutzutage kann Bootloader regelmäßig Imageund problemlos arbeitenzImage Dateien Dateien .

Kernelquellenproblem

Was sehr wichtig ist, ist, dass Sie beim Erstellen des Kernels für RaspberryPi nicht einfach eine beliebige Version davon verwenden können. Es funktioniert nur eine spezielle Version, die auf RaspberryPi portiert ist. Leider ist die aktuelle Upstream-Version (vor kernel.orgOrt gefunden) nicht mit RaspberryPi kompatibel. Auch versatil_configist es nicht gut für RaspberryPi, Sie sollten bcmrpi_defconfigstattdessen verwenden (auf RaspberryPi-kompatiblen Kernel-Quellen gefunden) oder bcmrpi_emergency_defconfigwenn Sie planen, Buildin zu verwenden initramfs.

Kernel-Bauanleitung

Der beste Ort, um Kernel-Quellen für RaspberryPi zu finden, ist auf Foundation Github . Im offiziellen RasbperryPi-Wiki finden Sie auch einige nützliche Erklärungen zum Abrufen und Kompilieren . Hier ist meine kleine vereinfachte Version der beteiligten Schritte (ANMERKUNG: Ich gehe davon aus, dass Sie den Kernel crosscompilieren möchten. Er ist viel schneller und sollte die gleichen Ergebnisse erzielen, aber es ist auch möglich, den Kernel nativ auf RaspberryPi zu erstellen):

  1. Laden Sie die offizielle Toolchain herunter und erstellen Sie Ihre eigenen. Ich gehe davon aus, dass es installiert ist /usr/bin/arm-linux-gnueabi-*. Wenn Sie es an einem anderen Ort haben, sollten Sie die CROSS_COMPILEOption in all Ihren makeBefehlen ändern .

  2. Zum https://github.com/raspberrypi/linux Seite , wo Sie offizielle RapsberryPi Kernel - Quellen finden können. Sie können den Code auf zwei Arten herunterladen:

    • Als komprimierte Datei (um diese Option zu verwenden, müssen Sie das gitDienstprogramm nicht installieren und können dies auch auf RapsberryPi selbst tun): Klicken Sie auf das ZIPSymbol, das sich etwas unterhalb der CodeRegisterkarte oben auf der Site befindet. Dadurch sollten Sie spätere Quelldateien als zipDatei herunterladen können . Du könntest stattdessen git verwenden, aber das (wie im Wiki beschrieben) wird viel mehr Platz und Zeit benötigen. Dekomprimieren Sie dann die Datei, um den Quelltextbaum abzurufen.
    • Verwenden des gitDienstprogramms (dies funktionierte bei RaspberryPi nicht, da es wahrscheinlich nur wenig RAM gibt, sollte aber auf Desktop-Systemen funktionieren. (Beachten Sie das --depth 1Argument, das verhindert, dass Git den gesamten Verlauf der Entwicklung herunterlädt (was riesig ist):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Verwenden Sie die von Foundation bereitgestellte Standardkonfiguration:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Führen Sie make oldconfigeinige Fragen aus und beantworten Sie sie (es sollte in Ordnung sein, in jeder Frage die Eingabetaste zu drücken und die Standardantwort zu belassen):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Kompiliere den Kernel:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Kernel-Module kopieren nach /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Verwenden Sie ImageDatei alskernel.img

  8. Laden Sie alle Module von /tmp/modules/lib/modules/Ihrem Computer in das /lib/modules/Verzeichnis auf Ihrem RaspberryPi-Rootfs hoch.

Initramfs hinzufügen

Dies enthält jedoch keine Anweisungen zum Erstellen initramfs. Da es sich um ein sehr umfassendes Thema handelt (im Grunde muss eine funktionierende Linux-Benutzerumgebung erstellt werden, und es gibt wirklich keine Beschränkung, wie kompliziert dies sein kann), werde ich hier nicht weiter darauf eingehen. Ich werde nur bemerken, initramfsdass es in zwei verschiedenen Formen verwendet werden kann - als Standalone-Form, bei der es sich um eine separate Datei handelt, und als Build-Form, bei der es in die Kernel-Image-Datei integriert ist (wie in kernel_emergency.img). Die zweite Option sollte vom RaspberryPi-Bootloader unterstützt werden, aber es gibt einige Gerüchte dass sie bei der aktuellen Firmware-Version kaputt ist, daher sollten Sie wahrscheinlich die eingebaute Version verwenden.

Der beste Weg, um zu beginnen, ist, initramfs-Inhalt (der für kernel_emergency.img verwendet wird) zu verwenden, indem Sie ihn aus einem anderen Foundation- Github-Repository herunterladen. iniramfsVersuchen Sie dann, Ihren eigenen Kernel zu erstellen, nachdem Sie ihn mit diesem Image booten können . Dazu muss lediglich auf die CONFIG_INITRAMFS_SOURCEKonfigurationsoption für das heruntergeladene Verzeichnis im Kernel verwiesen werden .

Schlussnoten

Also sollten Sie dies in 3 Schritten tun:

  1. Versuchen Sie, einen Kernel ohne initramfsDatei zu erstellen und zu booten .
  2. Versuchen Sie initramfs, Ihrem Kernel fertige Inhalte hinzuzufügen .
  3. Ändern Sie diesen initramfsInhalt entsprechend Ihren Anforderungen.
Krzysztof Adamski
quelle
1
Großartiges Schreiben, aber Sie sollten es nicht verwenden zip. gitÜberträgt die Dateien effizient und Sie können depth=1damit das Herunterladen des Verlaufs verhindern (glaube ich).
Alex Chamberlain
Ja, das stimmt, aber es ist keine gute Idee, dies auf RaspberryPi selbst zu tun. Das Herunterladen von zip funktioniert hingegen hervorragend. Ich werde auch einen kurzen Hinweis über die Verwendung von Git hinzufügen.
Krzysztof Adamski
Das Kompilieren des Kernels auf dem Raspberry Pi ist eine schreckliche Idee für sich.
Alex Chamberlain
@AlexChamberlain: Es ist sehr langsam, aber definitiv möglich (das habe ich selbst gemacht). Es dauert eine Nacht, also ist es nicht wirklich so schlimm. Ansonsten, warum ist es so schrecklich?
Krzysztof Adamski
Wenn ich bcmrpi_emergency_defconfig verwende, würde es initramfs enthalten?
Shantanu Banerjee
0

Wenn Sie auf beiden die gleiche Debian-Version verwenden, können X-Apt, dpkg-cross usw. und die Emdebian-Tools sehr gut funktionieren.

Quelle: Wird zur Entwicklung von c ++ - Apps für eingebettete ARM-Systeme verwendet, auf denen Emdebian ausgeführt wird.

James Bennet
quelle