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 x64Ubuntu 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: 2024/06/09 10:29 von 127.0.0.1