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 ​ 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
 +</​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