====== 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