Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspbian-eigener-linux-kernel

Eigenen Linux Kernel für Raspberry Pi in Ubuntu 16.06 x64 VM cross-compilen/kompilieren

Da der aktuelle VXLAN-Test, wie viele Ideen, auch dieses mal wieder ein paar Dinge voraussetzt die bisher wohl niemand gemacht hat, brauchen wir einen neuen Kernel für unseren Pi. :(

  • VirtualBox mit Debian 8.3.0 x64 Ubuntu 16.06 LTS (x64) aufsetzen
    • Da wir eigene Kernel kompilieren wollen, sollten sinnvollerweise mehr CPUs zugeordnet werden (z.B. 2 Stück)
    • Es sollte „bridged networking“ gewählt werden, NAT & Co sind umständlich bzgl. SCP/SSH auf die und von den Pi's
  • Ziel ist es eine CROSS-COMPILER Umgebung zu bauen
    • Die meisten Anleitungen die ich gefunden habe sind bereits älter (2014) und für verschiedene Pi-Modelle nicht mehr aktuell!
  • Erst einmal müssen wir folgende Pakete installieren:
sudo apt-get install git-core
sudo apt-get install gcc-4.7-arm-linux-gnueabi
sudo apt-get install build-essential
sudo apt-get install ncurses-dev
  • Damit wir die Kernel erfolgreich kompilieren können, brauchen wir die /proc/config.gz von dem jeweiligen Raspberry Pi (in meinem Fall Raspberry Pi Model B (Version 1) und Raspberry Pi Model B (Version 3))
  • Falls es diese Datei nicht gibt, was wahrscheinlich ist, folgendes eingeben:
sudo modprobe configs
  • Nun sollte die Datei /proc/config.gz existieren
  • Wichtig ist dass man sich markiert welche config.gz (später dann „.config“) von welchem System kommt (armv6l (Pi B v1) vs armv7l (SMP-fähig, Pi B v3)
  • Nun legen wir uns in unserem HOME-Verzeichnis ein Arbeitsverzeichnis für die folgenden Aufgaben an, initialisieren es mit Git und laden die Tools von GitHub:
mkdir src
cd src/
git init
git clone git://github.com/raspberrypi/tools.git
  • Dieser folgende Schritt erscheint mir überflüssig, da wir im Verlauf danach noch einmal spezieller einen Kernel ziehen, tut aber auch nicht weiter weh - also los!
git clone --depth 1 git://github.com/raspberrypi/linux.git
  • Jetzt geben wir die Version noch einmal vor die wir haben wollen, dies habe ich aus anderen Anleitungen entsprechend dem aktuellen Kernel angepasst
mkdir linux-4.4.y
cd linux-4.4.y/
git init
git fetch git://github.com/raspberrypi/linux.git rpi-4.4.y:refs/remotes/origin/rpi-4.4.y
git checkout refs/remotes/origin/rpi-4.4.y
  • Einmal aufräumen, nur zur Sicherheit (im linux-4.4.y Verzeichnis)
make mrproper
  • In dieses Verzeichnis ~/src/linux-4.4.y extrahiert ihr nun die Pi1 oder Pi3 .config Datei
  • „gzip -d config.gz“, danach ein „mv config .config“ (sichert euch die wahlweise noch einmal weg irgendwo)
  • Wichtige Entscheidung: Welchen Kernel wollt ihr nun: armv6l oder armv7l?
    • Für armv6l:
export KERNEL=kernel
  • Für armv7l:
export KERNEL=kernel7
  • Ich habe erstmal mit dem Pi 3 losgelegt, also ..
export KERNEL=kernel7
  • Unsere alte Konfiguration auf neuen Kernel anpassen lassen / übernehmen:
    • Prüft dass ihr im ~/src/linux-4.4.y Verzeichnis arbeitet!
    • Prüft dass die .config Datei in diesem Verzeichnis liegt die ihr übernehmen wollt
$ make ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- olddefconfig
  • In meinem Fall wollte ich nun das VXLAN-Modul bauen lassen, daher hab ich noch folgendes aufgerufen um das grafisch (ncurses, console) auszuwählen
make ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- menuconfig
  • Navigiert durch menuconfig: Device Drivers → Network device support → Virtual eXtensible Local Area Network und selektiert dieses (wahlweise auch GENEVE, hab aber noch nichts damit geplant)
    • Dem Hinweis dass ihr danach „make“ aufrufen könnt, kommt bitte NICHT nach!
  • Wir rufen „make“ mit einigen Erweiterungen auf
    • -j 2 nutzt die zwei Prozessoren die wir angegeben haben besser aus, ihr könnt hier selbst wählen was euer System verkraftet
    • Der Vorgang dauert in etwa 15-20 Minuten, je nachdem was ihr für ein System einsetzt (Motto: Hubraum ist nur durch mehr Hubraum zu ersetzen!)
make -j 2 ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
  • Nun legen wir ein Verzeichnis an, wo die „modules“ hinsollen z.B. /tmp/modules
mkdir /tmp/modules
  • Die „modules“ lassen wir nun in diesem Verzeichnis (/tmp/modules) ablegen
make ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=/tmp/modules modules_install
  • Neuen Kernel auf unseren Pi kopieren
    • Der Kernel landet dann im Home-Verzeichnis des Benutzers „pi“
scp arch/arm/boot/Image pi@192.168.0.98:
  • Zweites Terminal öffnen, die Module einsammeln und auf den Pi übertragen
cd /tmp
tar czf modules.tar.gz modules/
scp modules.tar.gz pi@192.168.0.98:
  • SSH auf den Pi aufmachen, den Kernel irgendwie sinnvoll umbenennen und für den nächsten Boot hinterlegen
ssh pi@192.168.0.98
pi@pi3:~ $ mv Image kernel_vxlan_4.4.11.y.img
pi@pi3:~ $ sudo cp kernel_vxlan_4.4.11.y.img /boot/
pi@pi3:~ $ tar xvzf modules.tar.gz
... wird entpackt nach modules/ ...
pi@pi3:~ $ sudo cp -r modules/lib/* /lib/
pi@pi3:~ $ sudo vi /boot/config.txt
# Am Ende der Datei einfügen oder den Eintrag ersetzen, vorher "i" drücken für "Insert"
kernel=kernel_vxlan_4.4.11.y.img
# :wq zum Beenden
pi@pi3:~ $ sudo reboot
  • Nach dem Neustart des Pi werden wir von unserem neuen Kernel begrüsst und haben die Möglichkeit VXLAN als Modul zu laden
pi@pi3:~ $ uname -a
Linux pi3 4.4.11-v7+ #1 SMP Sat May 28 18:13:41 CEST 2016 armv7l GNU/Linux
pi@pi3:~ $ sudo modprobe vxlan
pi@pi3:~ $ sudo modprobe bridge
pi@pi3:~ $ lsmod
Module                  Size  Used by
joydev                  9373  0 
evdev                  11567  2 
openvswitch            85373  4 
nf_defrag_ipv6         14822  1 openvswitch
nf_conntrack           79602  1 openvswitch
bnep                   10592  2 
hci_uart               19216  1 
btbcm                   6181  1 hci_uart
bluetooth             336951  22 bnep,btbcm,hci_uart
brcmfmac              186926  0 
brcmutil                5901  1 brcmfmac
cfg80211              437818  1 brcmfmac
cdc_ether               4279  0 
rfkill                 16728  3 cfg80211,bluetooth
r8152                  34768  0 
snd_bcm2835            20452  0 
snd_pcm                77450  1 snd_bcm2835
snd_timer              19590  1 snd_pcm
snd                    53776  3 snd_bcm2835,snd_timer,snd_pcm
bcm2835_gpiomem         3211  0 
bcm2835_wdt             3434  0 
uio_pdrv_genirq         3202  0 
uio                     8416  1 uio_pdrv_genirq
vxlan                  32491  0 
ip6_udp_tunnel          1706  1 vxlan
udp_tunnel              2191  1 vxlan
bridge                 97692  0 
stp                     1643  1 bridge
llc                     3772  2 stp,bridge
ipv6                  352477  28 bridge,nf_defrag_ipv6
  • Wer nun im Nachgang plant einen Kernel für seinen armv6l (Pi B v1/2) zu kompilieren, muss an folgende Dinge denken:
    • .config Datei wegsichern (beinhaltet ja nun die Modifikation mit VXLAN)
    • make mrproper # räumt alles komplierte für armv7l weg
    • export KERNEL=kernel # Um KERNEL=kernel7 zu ersetzen
    • .config-Datei vom „alten“ Pi ziehen und entsprechend hinterlegen
    • rm -rf /tmp/modules
    • Ansonsten einfach die Anleitung wieder befolgen
raspbian-eigener-linux-kernel.txt · Zuletzt geändert: 2016/05/30 15:26 von benny