Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspbian-eigener-linux-kernel

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

raspbian-eigener-linux-kernel [2016/05/30 15:26] (aktuell)
benny angelegt
Zeile 1: Zeile 1:
 +====== 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 <del>Debian 8.3.0 x64</del> 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:
 +<code>
 +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
 +</code>
 +  * 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:
 +<code>
 +sudo modprobe configs
 +</code>
 +    * 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:   
 +<code>
 +mkdir src
 +cd src/
 +git init
 +git clone git://github.com/raspberrypi/tools.git
 +</code>
 +  * 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!
 +<code>
 +git clone --depth 1 git://github.com/raspberrypi/linux.git
 +</code>
 +  * Jetzt geben wir die Version noch einmal vor die wir haben wollen, dies habe ich aus anderen Anleitungen entsprechend dem aktuellen Kernel angepasst
 +<code>
 +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
 +</code>
 +  * Einmal aufräumen, nur zur Sicherheit (im linux-4.4.y Verzeichnis)
 +<code>
 +make mrproper
 +</code>
 +  * 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:
 +<code>export KERNEL=kernel</code>
 +    * Für armv7l:
 +<code>export KERNEL=kernel7</code>
 +  * Ich habe erstmal mit dem Pi 3 losgelegt, also ..
 +<code>
 +export KERNEL=kernel7
 +</code>
 +  * 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
 +<code>
 +$ make ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- olddefconfig
 +</code>
 +  * In meinem Fall wollte ich nun das VXLAN-Modul bauen lassen, daher hab ich noch folgendes aufgerufen um das grafisch (ncurses, console) auszuwählen
 +<code>
 +make ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- menuconfig
 +</code>
 +  * 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!)
 +<code>
 +make -j 2 ARCH=arm CROSS_COMPILE=~/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
 +</code>
 +  * Nun legen wir ein Verzeichnis an, wo die "modules" hinsollen z.B. /tmp/modules
 +<code>
 +mkdir /tmp/modules
 +</code>
 +  * Die "modules" lassen wir nun in diesem Verzeichnis (/tmp/modules) ablegen
 +<code>
 +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
 +</code>
 +  * Neuen Kernel auf unseren Pi kopieren
 +    * Der Kernel landet dann im Home-Verzeichnis des Benutzers "pi"
 +<code>
 +scp arch/arm/boot/Image pi@192.168.0.98:
 +</code>
 +  * Zweites Terminal öffnen, die Module einsammeln und auf den Pi übertragen
 +<code>
 +cd /tmp
 +tar czf modules.tar.gz modules/
 +scp modules.tar.gz pi@192.168.0.98:
 +</code>
 +  * SSH auf den Pi aufmachen, den Kernel irgendwie sinnvoll umbenennen und für den nächsten Boot hinterlegen
 +<code>
 +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
 +</code>
 +  * Nach dem Neustart des Pi werden wir von unserem neuen Kernel begrüsst und haben die Möglichkeit VXLAN als Modul zu laden
 +<code>
 +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 
 +hci_uart               19216 
 +btbcm                   6181  1 hci_uart
 +bluetooth             336951  22 bnep,btbcm,hci_uart
 +brcmfmac              186926 
 +brcmutil                5901  1 brcmfmac
 +cfg80211              437818  1 brcmfmac
 +cdc_ether               4279 
 +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 
 +bcm2835_wdt             3434 
 +uio_pdrv_genirq         3202 
 +uio                     8416  1 uio_pdrv_genirq
 +vxlan                  32491  0 
 +ip6_udp_tunnel          1706  1 vxlan
 +udp_tunnel              2191  1 vxlan
 +bridge                 97692 
 +stp                     1643  1 bridge
 +llc                     3772  2 stp,bridge
 +ipv6                  352477  28 bridge,nf_defrag_ipv6
 +</code>
 +
 +  * 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