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