Good to Know Database

Raspbian Wheezy: Linux Kernel 3.18 unter Ubuntu 14.04 kompilieren und auf dem Raspberry Pi installieren


Das Kompilieren des Linux Kernels dauert auf dem Raspberry Pi mehrere Stunden. Daher bietet es sich an, den Linux Kernel auf einem performanteren System zu kompilieren. Die folgende Anleitung beschreibt wie Sie den Linux Kernel 3.18 auf einem Dual Core System mit Ubuntu 14.04 kompilieren und anschließend auf dem Raspberry Pi installieren können. Sollten Sie dennoch den Kernel auf dem Raspberry Pi kompilieren wollen, lesen Sie bitte die Anleitung Raspbian Wheezy: Linux Kernel 3.18 kompilieren und installieren.

Tools installieren

Bevor Sie den Kernel kompilieren können, müssen Sie ein paar Programme installieren welche dazu benötigt werden.

georg@ubuntu1404:~$ sudo apt-get update
georg@ubuntu1404:~$ sudo apt-get install gcc-arm-linux-gnueabi make git-core ncurses-dev

Kernel-Quellen herunterladen

Erstellen Sie zuerst ein neues Verzeichnis und wechseln in dieses.

georg@ubuntu1404:~$ mkdir ~/raspberrypi
georg@ubuntu1404:~$ cd ~/raspberrypi

Laden Sie jetzt die Kernelsourcen herunter und entpacken das heruntergeladene Archiv.

georg@ubuntu1404:~/raspberrypi$ wget https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar.gz -O linux-rpi-3.18.y.tar.gz
georg@ubuntu1404:~/raspberrypi$ tar xfz linux-rpi-3.18.y.tar.gz

Kernel-Konfiguration exportieren

Jetzt benötigen Sie die Konfiguration des Kernels welcher auf Ihrem Raspberry Pi eingesetzt wird. Diese können Sie auf Ihrem Raspberry Pi mit dem folgenden Befehl exportieren.

pi@raspberrypi ~ $ sudo zcat /proc/config.gz > config

Kopieren Sie die erstellte Datei config auf Ihr Ubuntu System. Hierfür können Sie wie in diesem Beispiel scp verwenden.

pi@raspberrypi ~ $ scp config georg@ubuntu1204.home.lan:/home/georg

Auf Ihrem Ubuntu System verschieben Sie jetzt die übertragene Kernel-Konfiguration in das Verzeichnis mit dem Kernel-Quellcode und benennen die Datei gleichzeitig in .config um.

georg@ubuntu1404:~/raspberrypi$ cp ~/config ~/raspberrypi/linux-rpi-3.18.y/.config

Wechseln Sie jetzt in das Verzeichnis mit dem Kernel-Quellcode.

georg@ubuntu1404:~/raspberrypi$ cd linux-rpi-3.18.y/

Aktualisieren Sie jetzt die Kernelkonfiguration mit dem folgenden Befehl.

georg@ubuntu1404:~/raspberrypi/linux-rpi-3.18.y$ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf --oldconfig Kconfig
*
* Restart config...
*
*
* System Type
*
MMU-based Paged Memory Management Support (MMU) [Y/n/?] y
ARM system type
  1. Allow multiple platforms to be selected (ARCH_MULTIPLATFORM)
  2. ARM Ltd. Integrator family (ARCH_INTEGRATOR)
  3. ARM Ltd. RealView family (ARCH_REALVIEW)
  4. ARM Ltd. Versatile family (ARCH_VERSATILE)
  5. Atmel AT91 (ARCH_AT91)
> 6. Broadcom BCM2708 family (ARCH_BCM2708)
  7. Cirrus Logic CLPS711x/EP721x/EP731x-based (ARCH_CLPS711X)
  8. Cortina Systems Gemini (ARCH_GEMINI)
  9. EBSA-110 (ARCH_EBSA110)
  10. EP93xx-based (ARCH_EP93XX)
  11. FootBridge (ARCH_FOOTBRIDGE)
  12. Hilscher NetX based (ARCH_NETX)
  13. IOP13xx-based (ARCH_IOP13XX)
  14. IOP32x-based (ARCH_IOP32X)
  15. IOP33x-based (ARCH_IOP33X)
  16. IXP4xx-based (ARCH_IXP4XX)
  17. Marvell Dove (ARCH_DOVE)
  18. Marvell MV78xx0 (ARCH_MV78XX0)
  19. Marvell Orion (ARCH_ORION5X)
  20. Marvell PXA168/910/MMP2 (ARCH_MMP)
  21. Micrel/Kendin KS8695 (ARCH_KS8695)
  22. Nuvoton W90X900 CPU (ARCH_W90X900)
  23. NXP LPC32XX (ARCH_LPC32XX)
  24. PXA2xx/PXA3xx-based (ARCH_PXA)
  25. Qualcomm MSM (non-multiplatform) (ARCH_MSM)
  26. Renesas ARM SoCs (non-multiplatform) (ARCH_SHMOBILE_LEGACY)
  27. RiscPC (ARCH_RPC)
  28. SA1100-based (ARCH_SA1100)
  29. Samsung S3C24XX SoCs (ARCH_S3C24XX)
  30. Samsung S3C64XX (ARCH_S3C64XX)
  31. TI DaVinci (ARCH_DAVINCI)
  32. TI OMAP1 (ARCH_OMAP1)
  33. Broadcom BCM2709 family (ARCH_BCM2709) (NEW)
choice[1-33]: 6
*
* Broadcom BCM2708 Implementations
*
Broadcom BCM2708 Development Platform (MACH_BCM2708) [Y/?] y
  BCM2708 Device Tree support (BCM2708_DT) [Y/n/?] y
  BCM2708 gpio support (BCM2708_GPIO) [Y/n/?] y
  Videocore Memory (BCM2708_VCMEM) [Y/n/?] y
  Videocore L2 cache disable (BCM2708_NOL2CACHE) [N/y/?] n
  Bind spidev to SPI0 master (BCM2708_SPIDEV) [Y/n/?] y
*
* Processor Type
*
Support ARM V6 processor (CPU_V6) [Y] y
*
* Processor Features
*
Support Thumb user binaries (ARM_THUMB) [Y/n/?] y
Disable I-Cache (I-bit) (CPU_ICACHE_DISABLE) [N/y/?] n
Disable D-Cache (C-bit) (CPU_DCACHE_DISABLE) [N/y/?] n
Disable branch prediction (CPU_BPREDICT_DISABLE) [N/y/?] n
Enable kuser helpers in vector page (KUSER_HELPERS) [Y/n/?] y
Use non-cacheable memory for DMA (ARM_DMA_MEM_BUFFERABLE) [Y/n/?] y
ARM errata: FSR write bit incorrect on a SWP to read-only memory (ARM_ERRATA_326103) [N/y/?] n
ARM errata: Invalidation of the Instruction Cache operation can fail (ARM_ERRATA_411920) [Y/?] y
ARM errata: Possible cache data corruption with hit-under-miss enabled (ARM_ERRATA_364296) [N/y/?] n
*
* LED Trigger support
*
LED Trigger support (LEDS_TRIGGERS) [Y/?] y
  LED Timer Trigger (LEDS_TRIGGER_TIMER) [Y/n/m/?] y
  LED One-shot Trigger (LEDS_TRIGGER_ONESHOT) [Y/n/m/?] y
  LED Heartbeat Trigger (LEDS_TRIGGER_HEARTBEAT) [Y/n/m/?] y
  LED backlight Trigger (LEDS_TRIGGER_BACKLIGHT) [Y/n/m/?] y
  LED CPU Trigger (LEDS_TRIGGER_CPU) [Y/n/?] y
  LED GPIO Trigger (LEDS_TRIGGER_GPIO) [Y/n/m/?] y
  LED Default ON Trigger (LEDS_TRIGGER_DEFAULT_ON) [Y/n/m/?] y
  *
  * iptables trigger is under Netfilter config (LED target)
  *
  LED Transient Trigger (LEDS_TRIGGER_TRANSIENT) [M/n/y/?] m
  LED Camera Flash/Torch Trigger (LEDS_TRIGGER_CAMERA) [M/n/y/?] m
  LED Input Trigger (LEDS_TRIGGER_INPUT) [N/m/y/?] (NEW)
#
# configuration written to .config
#

Kernel kompilieren

Mit dem nächsten Befehl wird jetzt der Kernel kompiliert. Da ich hier ein Dual Core System verwende habe ich den Parameter -j 3 angegeben um den Vorgang zu beschleunigen. Sollten Sie ein Single Core System verwenden, müssen Sie diesen Parameter entfernen. Bei einem Quad Core System können Sie stattdessen -j 5 angeben.

georg@ubuntu1404:~/raspberrypi/linux-rpi-3.18.y$ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k -j 3

Kernelmodule kompilieren

Nachdem Sie den Kernel kompiliert haben müssen Sie noch die Kernelmodule erstellen. Für diese legen Sie zuerst ein eigenes Verzeichnis an.

georg@ubuntu1404:~/raspberrypi/linux-rpi-3.18.y$ mkdir ./modules

Kompilieren Sie anschließend die Kernelmodule.

georg@ubuntu1404:~/raspberrypi/linux-rpi-3.18.y$ make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=./modules/

Nach dem Kompilieren sollten Sie die temporären Dateien welche beim Kompilieren erstellt wurden löschen.

georg@ubuntu1404:~/raspberrypi/linux-rpi-3.18.y$ rm -rf ./modules/lib/modules/3.18.*/build ./modules/lib/modules/3.18.*/source

Kernel und Kernelmodule installieren

Kehren wir wieder zum Raspberry Pi zurück und löschen hier die Verzeichnisse /lib/modules und /lib/firmware.

pi@raspberrypi ~ $ sudo rm -rf /lib/modules /lib/firmware

Anschließend kopieren Sie die soeben kompilierten Kernelmodule auf Ihren Raspberry Pi. In diesem Beispiel holen wir die benötigten Dateien und Verzeichnisse mit scp direkt vom Ubuntu System auf den Raspberry Pi.

pi@raspberrypi ~ $ sudo scp -r georg@ubuntu1404.home.lan:/home/georg/raspberrypi/linux-rpi-3.18.y/modules/lib /

Als nächstes muss noch der neue Kernel in das Verzeichnis /boot kopiert werden. Auch hier rufen wir die benötigte Datei mit scp vom Ubuntu System ab.

pi@raspberrypi ~ $ sudo scp -r georg@ubuntu1404.home.lan:/home/georg/raspberrypi/linux-rpi-3.18.y/arch/arm/boot/Image /boot/kernel.img

Kernel laden

Da wir jetzt den Kernel und die Kernelmodule ausgetauscht haben sollten Sie das System neu starten damit dieses mit dem neuen Kernel gestartet wird und auch alle Kernelmodule verfügbar sind.

pi@raspberrypi ~ $ sudo shutdown -r now

Sobald Raspbian wieder gestartet ist können Sie mit dem Befehl uname die Kernelversion überprüfen.

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 3.18.6 #1 PREEMPT Sun Feb 8 17:35:35 CET 2015 armv6l GNU/Linux


Dieser Eintrag wurde am 22.03.2015 erstellt und zuletzt am 25.09.2016 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_36_2651.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer