Nicht jede Hardware wird unter Linux von Haus aus unterstützt. Bei neuen Geräten sind die erforderlichen Kernel-Module (Treiber) noch nicht im Kernel enthalten. Wenn man den Quelltext des gewünschten Treibers im Internet findet, kann man sich die Kernel-Module jedoch selbst erstellen.
Für neue Kernel-Module sind mehrere Voraussetzungen zu erfüllen: Sie benötigen den Quellcode des Kernels, einige Entwicklungs-Tools, wie den Compiler gcc, und natürlich den Quellcode des Treibers. Programmierkenntnisse sind dafür nicht erforderlich, lediglich der souveräne Umgang mit der Kommandozeile.
Update 06.01.2019: Der Raspberry Pi 3 ist inzwischen schnell genug, um ein Kernel-Modul direkt auf dem Gerät zu erstellen. Ein zusätzliches Tool erleichtert außerdem den Download der Kernel-Quellen. Die nötigen Schritte lassen sich damit reduzieren. Außerdem gibt es eine neue Version des mt76x0-Treibers, der für neuere Kernel-Versionen angepasst ist. Bei diesem entfällt die Konfiguration über die Datei /etc/Wireless/RT2870STA.dat. Die Konfiguration ist jetzt im Treiber selbst enthalten.
Eine gute Nachricht für alle Eigentümer der genannten Hardware: Ab Kernel-Version 4.19 ist der mt76x0-Treiber im Linux-Standard-Kernel enthalten. Es wird jedoch noch einige Zeit dauern, bis diese Version in den Linux-Distributionen ankommt. Ubuntu 18.04 beispielsweise verwendet die Kernel-Version 4.15 bei Raspbian ist es 4.14 (Stand Januar 2019).
Update 04.04.2016: Ich habe den Treiber-Quellcode bei Github aktualisiert und Änderungen aus verschiedenen Quellen einfließen lassen. Das erzeugte Kernel-Modul heißt jetzt mt7610u_sta.ko. Die Konfigurationsdatei /etc/Wireless/RT2870STA.dat wird jetzt auch unter neueren Kerneln korrekt eingelesen. Hier ist jetzt „WirelessMode=13“ konfiguriert. Nach meinen Tests funktionieren damit jetzt 2,4 und 5 GHz. Bei 5 GHz wird jedoch die erwartete Geschwindigkeit nicht erreicht (siehe „Netzwerkleistung mit iperf messen“)
Erstellung von Kernel-Modulen am Beispiel mt76x0 (Ralink/Mediatek)
Ich erläutere das Verfahren am Beispiel des Kernel Moduls für den WLAN-USB-Stick TP-Link AC900. Wie sich das Kernel-Modul dafür unter und für Ubuntu erstellen lässt, habe ich im Artikel TP-Link Archer T2U AC600 unter Linux nutzen beschrieben.
Im Prinzip funktioniert es so oder ähnlich für jeden Treiber, dessen Quellcode verfügbar ist.
Der Beispiel-Treiber eignet sich (theoretisch) für folgende Hardware:
USB_DEVICE (0x148F:0x7610) MT7610U
USB_DEVICE (0x13B1:0x003E) Linksys AE6000
USB_DEVICE (0x0E8D:0x7610) Sabrent NTWLAC
USB_DEVICE (0x7392:0xa711) Edimax 7711mac
USB_DEVICE (0x7392:0xb711) Edimax / Elecom
USB_DEVICE (0x148f:0x761a) TP-Link TL-WDN5200
USB_DEVICE (0x148f:0x760a) TP-Link unknown
USB_DEVICE (0x0b05:0x17d1) Asus USB-AC51
USB_DEVICE (0x0b05:0x17db) Asus USB-AC50
USB_DEVICE (0x0df6:0x0075) Sitecom WLA-3100
USB_DEVICE (0x2019:0xab31) Planex GW-450D
USB_DEVICE (0x2001:0x3d02) D‑LINK DWA-171 rev B1
USB_DEVICE (0x0586:0x3425) Zyxel NWD6505
USB_DEVICE (0x07b8:0x7610) AboCom AU7212
USB_DEVICE (0x04bb:0x0951) I‑O DATA WN-AC433UK
USB_DEVICE (0x057c:0x8502) AVM FRITZ!WLAN USB Stick AC 430 (not working)
USB_DEVICE (0x293c:0x5702) Comcast Xfinity KXW02AAA
USB_DEVICE (0x20f4:0x806b) TRENDnet TEW-806UBH
USB_DEVICE (0x7392:0xc711) Devolo Wifi ac Stick
USB_DEVICE (0x0df6:0x0079) Sitecom Europe B.V. ac Stick
USB_DEVICE (0x2357:0x0105) TP-LINK Archer T1U
Die Funktion ist bei jedem der genannten USB-Wifi-Adapter garantiert. Ich selbst habe nur den WLAN-Adapter TP-Link TL-WDN5200 T2U ausprobiert (USB-ID 0x148f:0x761a). Der AVM FRITZ!WLAN USB Stick AC 430 verwendet den gleichen Chipsatz, funktioniert jedoch mit diesem Treiber nicht und auch sonst mit keinem bekannten Treiber. Die Ursache dafür ist bisher nicht bekannt.
Variante 1: Module auf dem Raspberry Pi kompilieren
Ich gehe davon aus, dass auf dem Raspberry Pi die aktuelle Version von Raspian installiert ist. Zurzeit (Januar 2019) ist das Raspian Stretch mit Kernel 4.14.
Sie benötigen zuerst den Quellcode des laufenden Kernels. Aller erforderlichen Schritte führen Sie in einem Terminalfenster durch.
Aktualisieren Sie das System mit
sudo apt update -y sudo apt upgrade -y
Optional lässt sich der Kernel auf die aktuellste Version bringen. Dazu verwenden Sie im Terminalfenster die Befehlszeile
sudo rpi-update
Starten Sie den Raspberry Pi danach neu. Installieren Sie vier erforderliche Pakete:
sudo apt install git bc bison flex libproc-processtable-perl
Führen Sie folgende vier Befehlszeilen im Home-Verzeichnis /home/pi aus:
cd ~ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source sudo chmod +x /usr/bin/rpi-source /usr/bin/rpi-source -q --tag-update rpi-source
Der zum laufenden Kernel passende Kernel-Quellcode liegt jetzt beispielsweise im Ordner „/home/pi/linux-36612d5d7a88672a3e7dd6cb458dbbbca0d75efe“. Der Hash-Wert entspicht dem vom Script in „Variante 2“ ermittelten Wert für den Kernel-Hash. Es gibt außerdem den Symlink „/home/pi/linux“ der auf den Ordner mit den Kernel-Quellen verweist.
rpi-source hat die Kernel-Quellen bereits für die Verrwendung vorbereitet. Das ist daran zu erkennen, dass die Dateien „.config“ und „Module.symvers“ vorhanden sind. Es gibt außerdem die Symlinks „/lib/modules/4.14.79-v7+/build“ und „/lib/modules/4.14.79-v7+/source“, die jeweils auf das Verzeichnis „/home/pi/linux“ verweisen.
Treiber-Quellcode herunterladen und kompilieren: Erstellen Sie ein Arbeitsverzeichnis, laden Sie den Quellcode des Treibers herunter und kompilieren Sie ihn:
mkdir ~/src cd ~/src git clone https://github.com/Myria-de/mt7610u.git cd mt7610u ARCH=arm make -j4
Bitte beachten Sie, dass diese Arbeiten ohne root-Rechte durchgeführt werden, also ohne vorangestelltes „sudo“. Das ist sicherer, falls ein Build-Script versuchen sollte, Systemdateien zu ersetzen.
Das Kernel-Modul „mt7610u.ko“ liegt danach im Ordner „/home/pi/src/mt7610u“. Installieren Sie die Firmware-Datei „mt7610u.bin“ und laden Sie das Modul mit diesen zwei Befehlszeilen:
sudo ARCH=arm make installfw sudo insmod mt7610u.ko
Verbinden Sie den WLAN-Stick mit dem Raspberry Pi. Mit dem Befehl
dmesg
sehen Sie sich die Log-Ausgaben an. Es erscheinen Einträge, die auf die korrekte Funktion des Gerätes hinweise. Auch ein paar Fehlermeldungen sind dabei, die sind aber unkritisch.
Wenn alles zufriedenstellend läuft installieren Sie das neue Kernel-Modul mit
sudo ARCH=arm make install
Starten Sie den Raspberry Pi neu. Das Modul „mt7610u.ko“ wird jetzt automatisch geladen.
Die WLAN-Verbindung lässt sich über das Netzwerk-Icon in der Leiste am oberen Bildschirmrand herstellen.
Variante 2: Cross-Compile-Script zum Erstellen der Kernel-Module verwenden
Kernel-Module für den Raspberry Pi lassen sich auch auf einem anderen Linux-PC erstellen. Am einfachsten ist es, Ubuntu 14.04 oder 18.04 (nur 64-Bit) zu verwenden. Die Entwicklung ist auch in einer virtuellen Maschine möglich, etwa in Virtualbox. Alle nötigen Downloads und Schritte habe ich in einem Script zusammengefasst. Das Script eignet sich für den Raspberry Pi 2/3 (armv71).
Beim Cross-kompilieren ist ein gewisser Aufwand nötig, denn der etwa bei Ubuntu installierte Compiler kann standardmäßig keine Programme oder Treiber für die ARM-Platform des Raspberry Pi erzeugen. Es ist daher zusätzlich Software nötig. Dafür läuft der Build-Vorgang auf einen durchschnittlichen PC unter Linux aber deutlich schneller ab, als direkt auf dem Raspberry Pi.
Ich erläutere das Verfahren am Beispiel des Kernel Moduls für den WLAN-USB-Stick TP-Link AC900. Wie sich das Kernel-Modul dafür unter und für Ubuntu erstellen lässt, habe ich im Artikel TP-Link Archer T2U AC600 unter Linux nutzen beschrieben.
Im Prinzip funktioniert es so oder ähnlich für jeden Treiber, dessen Quellcode verfügbar ist.
Kernel und GCC-Version ermitteln: Kernel-Quellcode und gcc-Version sollten für das verwendete Script zur Version des auf dem Raspberry Pi laufenden Linux-Kernels passen. Informationen dazu finden Sie über die beiden Befehlszeilen
cat /proc/version gcc --version
Die erste Zeile gibt beispielsweise folgendes aus:
Linux version 4.14.79-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng‑1.22.0–88-g8460611)) #1159 SMP Sun Nov 4 17:50:20 GMT 2018
Die Kernel-Version ist hier „4.14.79-v7+“. Außerdem sehen Sie, dass der Kernel mit dem Compiler GCC Version 4.9.3 und crosstool-NG crosstool-ng‑1.22.0–88-g8460611 erstellt wurde. Die Ausgabe von „gcc –version“ lautet beispielsweise „gcc‑7.3.0“, was dann nicht zum installierten Kernel passen würde.
Die Ausgabe „crosstool-NG“ weist darauf hin, dass der Kernel nicht auf einem Raspberry Pi kompiliert wurde. Stattdessen kam eine Crosscompile-Umgebung zum Einsatz, die sich auf jedem beliebigen Linux-PC einrichten lässt.
Welcher Kernel genau installiert ist, lässt sich über die Datei „/usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz“ ermitteln. Darin steht ein Firmware-Hash-Wert aus dem sich der Kernel-Hash und damit die Download-URL bei https://github.com/raspberrypi/linux.git für diesen Kernel ergibt.
SSH-Verbindung testen: Stellen Sie sicher, dass Sie Ihren Raspberry Pi über ssh erreichen können:
ssh pi@192.168.0.17
Ersetzen Sie die IP-Nummer durch die IP Ihres Raspberry Pi. Bestätigen Sie den Schlüssel mit yes und geben Sie das Passwort ein. Prüfen Sie bei der Gelegenheit, ob die Datei „/proc/config.gz“ vorhanden ist:
zcat /proc/config.gz
Wenn Sie die Fehlermeldungen „gzip: /proc/config.gz: No such file or directory“ erhalten. Starten Sie
sudo modprobe configs
Danach ist „/proc/config.gz“ vorhanden. Beenden Sie die SSH-Verbindung mit exit.
Script vorbereiten: Laden Sie „raspi_crosstools.sh“ herunter (siehe unten auf dieser Seite) und speichern beziehungsweise entpacken Sie die Datei in Ihr Home-Verzeichnis auf dem (Ubuntu-)PC. Machen Sie die Datei mit folgendem Befehl ausführbar:
chmod 755 raspi_crosstools.sh
Öffnen Sie raspi_crosstools.sh in einem Editor. Passen Sie den Abschnitt unterhalb von „Konfiguration“ an. Tragen Sie hinter die Variablen den Benutzernamen („RASPI_USER=“), das Passwort („RASPI_PWD=“) und die IP-Adresse ein („RASPI_IP=“).
Der hinter „USE_THREADS=“ eingetragene Wert „-j4“ bestimmt die Anzahl der Threads, die der Compiler verwenden soll. Bei einem Intel Core i7 können Sie auch „-j8“ eintragen. Das Compilieren geht dann schneller. Bei langsameren CPUs lassen Sie den Wert leer
Starten Sie das Script dann mit
./raspi_crosstools.sh
So arbeitet das Script: Das Bash-Script prüft zunächst, ob die nötigen Entwicklerpakete auf dem Linux-System installiert sind und installiert sie bei Bedarf. Danach haben Sie die Wahl, ob Sie eine minimale (schneller) oder volle (langsamer) Kompilation des Kernels wünschen. In der Regel sollte eigentlich eine minimale Konfiguration des Kernels genügen. Als Cross-Compiler kommt die gleiche Version zum Einsatz, die die Entwickler des Raspbian-Kernels verwendet haben (https://github.com/raspberrypi/tools).
Das Problem dabei: Sie benötigen die Datei „Module.symvers“ von github.com/raspberrypi/firmware. Als ich das Script geschrieben habe, lag hier für den Kernel 4.1.6‑v7+ noch eine veraltete Version. In diesem Fall müssen Sie „Voll“ wählen. Dabei wird die Datei „Module.symvers“ neu erstellt. Das ist also der sicherere Weg. Mit der falschen „Module.symvers“ verweigert der Kernel des Raspberry Pi später das Modul zu laden. Es erscheint dann eine Fehlermeldung wie „mt7650u_sta: disagrees about version of symbol module_layout“.
Im nächsten Schritt ermittelt das Script, welcher Kernel auf dem Raspberry Pi installiert ist und lädt dann den Quellcode des Kernels herunter. Außerdem werden die Tools für den Cross-Compiler und die Quellen des Treibers heruntergeladen. Alle Dateien landen im Verzeichnis „~/raspi_cross“.
Kernel-Modul auf dem Raspberry Pi installieren: Der Kernel und die Module werden dann kompiliert. Nach Abschluss kopiert das Script das Modul und zwei Bash-Scripte in das Home-Verzeichnis „/home/pi“ auf den Raspberry Pi. Machen Sie „install_driver.sh“ und „un-install_driver.sh“ jeweils mit chmod 755 ausführbar. Mit
sudo ./install_driver.sh
installieren Sie das Modul und mit sudo ./un-install_driver.sh entfernen Sie es wieder. Mit dmesg prüfen Sie, ob der Kernel das Modul korrekt geladen hat.
Script anpassen: Wenn Sie ein anderes Kernel-Modul für den Raspberry Pi erstellen möchten, sind einige Anpassungen im Script nötig. Ändern Sie die Download-Adresse unter dem Kommentar „Treiber herunterladen“ und die Anweisungen unter „Kernel-Modul compilieren“. Passen Sie außerdem den Abschnitt „Dateien auf den Raspi kopieren“ an.
Hinweise: Das Script fragt nicht ab, ober Kernel oder Modul bereits zuvor compiliert wurden. Es startet immer mit einer frischen Konfiguration („make clean“). So ist es sicherer aber es kostet mehr Zeit. Wenn Sie das nicht wünschen, kommentieren Sie beispielsweise den Block unter „Kernel vorbereiten/compilieren“ aus. Dann wird nur das Modul neu erstellt.
Sollte nach einem Update einer neuer Kernel auf dem Raspberry Pi installiert werden, müssen Sie den kompletten Vorgang wiederholen. In diesem Fall löschen Sie das Verzeichnis „raspi_cross“ und starten wieder das Script raspi_crosstools.sh. Es lädt dann die aktuellen, beziehungsweise passenden, Kernel-Quellen herunter und erzeugt ein neues Kernel-Modul.
WLAN auf dem Raspberry Pi manuell einrichten (optional)
Prüfen Sie nach erfolgter Modulinstallation auf dem Raspberry Pi mit dem Befehl ap addr in einem Terminalfenster, ob das Netzwerkgerät vorhanden ist. Im der Ausgabe sollte das Gerät wlan0 oder ra0 auftauchen (je nach Treiber). Suchen Sie nach WLAN-Netzwerken mit folgender Befehlszeile:
sudo iwlist wlan0 scan
Tauchen hier Netzwerke mit der Angabe etwa von „Frequency:5.22 GHz“ auf, funktioniert auch 5 GHz.
Die WLAN-Konfiguration erfolgt am einfachsten und zuverlässigsten auf der Kommandozeile in einem Terminalfenster. Ändern sie zunächst mit sudo nano /etc/network/interfaces die Konfiguration der Netzwerk-Geräte. Die Datei kann danach so aussehen:
auto lo iface lo inet loopback iface eth0 inet manual allow-hotplug wlan0 iface ra0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Verwenden Sie den Befehl
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
Hier tragen Sie zusätzlich beispielsweise folgendes ein:
network={ ssid="Meine_SSID" psk="1234567890" key_mgmt=WPA-PSK }
Die Angaben hinter „ssid=“ und „psk=“ ändern Sie passend für Ihr Netzwerk.
Starten Sie den Raspberry Pi neu (sudo reboot). Die Verbindung zum WLAN-Netzwerk erfolgt jetzt automatisch.
Crosscompile-Script für Raspberry-Pi-Module
Und hier das Script. Fahren Sie mit der Maus in den Script-Block und klicken Sie auf das erste Icon, um das Script im Textmodus zu sehen. Oder laden Sie das Script raspi_crosstools.sh als ZIP-Datei herunter.
#!/bin/bash
#########################
## Konfiguration ##
#########################
#
# IP-Adresse, Benutzername und Passwort des Raspberry Pi
# Das Gerät muss über ssh erreichbar sein
# Testen Sie das zuerst mit ssh pi@IP-Adresse
#
RASPI_USER=pi
RASPI_PWD=geheim
RASPI_IP=192.168.178.XX
# beispielsweise 192.168.0.17
# USE_THREADS= #langsame/ältere CPUs
# Beschleunigt das Compilieren bei Multicore-CPUs deutlich
USE_THREADS=-j4 # schnelle/neuere CPUs oder -j8 (mehr threads, schneller)
#
#DRIVERDIR=mt7610u-linksys-ae6000-wifi-fixes
# Kernel 4.1
#DRIVERDIR=mt7610u_wifi_sta_v3002_dpo_20130916
#DRIVERFILE=mt7610u_sta.ko
#DRIVERNAME=mt7610u_sta
#GITCLONE=" -b raspberry https://github.com/Myria-de/$DRIVERDIR.git"
#NEWCONFIG=0
#Kernel 4.14
DRIVERDIR=mt7610u
DRIVERFILE=mt7610u.ko
DRIVERNAME=mt7610u
NEWCONFIG=1
GITCLONE=" -b raspberry https://github.com/Myria-de/$DRIVERDIR.git"
#GCCDIR="/home/te/raspi_cross/tools/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"
#GCCDIR="/home/te/raspi_cross/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/#bin/arm-linux-gnueabihf- bcm2709_defconfig"
#########################
## Konfiguration Ende ##
#########################
KERNEL_HASH=
FIRMWARE_HASH=
HOMEDIR=`pwd`
WORKDIR=$HOMEDIR/raspi_cross
DRIVERBIN=$WORKDIR/$DRIVERDIR/$DRIVERFILE
# Pfad zum 64-Bit-Cross-Compiler, 32 Bit wird nicht unterstützt
export PATH=$WORKDIR/tools/arm-bcm2708/arm-linux-gnueabihf/bin:$PATH
if [ `getconf LONG_BIT` = "64" ]
then
HOSTARCH=64
else
HOSTARCH=32
fi
if [ $HOSTARCH = 32 ]
then
echo
echo "Das Script funktioniert nur unter einem 64-Bit-System"
echo "Abbruch."
echo
exit 1
fi
#####################################
## Dateien auf den Raspi kopieren ###
#####################################
put_file_to_raspi() {
#cd $WORKDIR/$DRIVERDIR/os/linux
if [ -e $DRIVERBIN ]
then
echo Kopiere Datei auf den Raspberry Pi
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put $DRIVERBIN; bye"
cd $WORKDIR/$DRIVERDIR
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put RT2870STA.dat; bye"
else
echo Fehler. Nicht gefunden: $DRIVERBIN
exit 1
fi
cd $WORKDIR
cat<<EOF>${WORKDIR}/un-install_driver.sh
#!/bin/bash
[ \$UID -ne 0 ] && {
echo "Fehler: Das Script benötigt root-Rechte."
echo "Aufruf mit mit sudo $0"
exit 1
}
OSVERSION=\`uname -r\`
echo Entlade Modul $DRIVERFILE
rmmod $DRIVERNAME
echo Lösche Modul /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
rm /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
echo Lösche Konfiguration /etc/Wireless/RT2870STA/RT2870STA.dat
rm /etc/Wireless/RT2870STA/RT2870STA.dat
echo Aktualisiere Module...
depmod -a
echo Sie können das Verzeichnis /etc/Wireless jetzt komplett löschen
echo Fertig!
EOF
cat<<EOF>${WORKDIR}/install_driver.sh
#!/bin/bash
[ \$UID -ne 0 ] && {
echo "Fehler: Das Script benötigt root-Rechte."
echo "Aufruf mit mit sudo \$0"
exit 1
}
OSVERSION=\`uname -r\`
NEWCONFIG=$NEWCONFIG
mkdir -p /etc/Wireless/RT2870STA
mkdir -p /lib/modules/\$OSVERSION/extra
echo Kopiere Modul nach /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
cp $DRIVERFILE /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
if [ \$NEWCONFIG = 0 ]
then
echo Kopiere Konfigration nach /etc/Wireless/RT2870STA/RT2870STA.dat
cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
fi
echo Aktualisiere Module...
depmod -a
echo lade Modul $DRIVERFILE
modprobe $DRIVERNAME
echo Fertig!
EOF
chmod 755 install_driver.sh
chmod 755 un-install_driver.sh
# Datei uebertragen
echo Kopiere Datei install_driver.sh auf $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put install_driver.sh; bye"
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put un-install_driver.sh; bye"
}
# Konfigurations-Dateien vom Raspberry Pi holen
get_files_from_raspi() {
cd $WORKDIR
# Alte Dateien löschen
if [ -e changelog.Debian.gz ]
then
rm changelog.Debian.gz
fi
if [ -e config.gz ]
then
rm config.gz
fi
if [ -e Module.symvers ]
then
rm Module.symvers
fi
echo Download changelog.Debian.gz vom Raspberry Pi $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "get -e /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz; bye"
FIRMWARE_HASH=$(zgrep "* firmware as of" changelog.Debian.gz | head -1 | awk '{ print $5 }')
echo Firmware-Hash: $FIRMWARE_HASH
#
# hier bei Bedarf einen eigenen Hash-Wert eintragen
# wenn nicht der Standard-Kernel, wie in raspberrypi-bootloader/changelog.Debian.gz
# abgelegt, zum Einsatz kommmt.
# die Hash-Werte sind unter https://github.com/raspberrypi/firmware/commits/ zu finden
# Beispielsweise "kernel: Bump to 4.1.15" unter
# https://github.com/raspberrypi/firmware/commit/22d8c910f4c53118f9cf85c038d7d8e307efc110
#
#4.1.15
#FIRMWARE_HASH=c22d8c910f4c53118f9cf85c038d7d8e307efc110
#4.1.20
#FIRMWARE_HASH=37f187cd887f67235f3b84e0a2cd67807196c70f
#7f30737678023b5becaf0e2e012665f71b886a7d
#c37f187cd887f67235f3b84e0a2cd67807196c70f
#FIRMWARE_HASH=4bf906cdd221c4f6815d0da7dda0cd59d25d945b
#3.18.13
#FIRMWARE_HASH=9354845ea5a961f267bcf440f92c9bd21be29b35
#git hash
#3.18.11
#8362c08dfc8dd9e54745b3f1e5e4ff0a1fb30614
echo Hole $FIRMWARE_HASH/
KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
echo Kernel-Hash ist: $KERNEL_HASH
echo Download config.gz vom Raspberry Pi $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "get -e /proc/config.gz; bye"
# Version des Kernels ermittlen (für PI/PI2)
STR=$(zgrep "CONFIG_LOCALVERSION" config.gz | head -1)
LOCALVERSION=${STR#*=} #string part after =
LOCALVERSION="${LOCALVERSION//\"}" #remove quotes
if [ "$LOCALVERSION" == "-v7" ]
then
echo "Raspberry PI 2 gefunden (armv71)"
RASPI_MODEL=armv71
else
echo "Raspberry PI gefunden (armv61)"
RASPI_MODEL=armv61
fi
# hier sollte die Datei Module.symvers für den aktuellen Kernel liegen
if [ $RASPI_MODEL = armv71 ]
then
echo Download Module7.symvers
wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module7.symvers -O Module.symvers
else
echo Download Module.symvers
wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module.symvers -O Module.symvers
fi
if [ ! -e changelog.Debian.gz ]
then
echo "Fehler: changelog.Debian.gz nicht gefunden"
return 0
fi
if [ ! -e config.gz ]
then
echo "Fehler: config.gz nicht gefunden"
return 0
fi
return 1
}
##############################
## Das Script startet hier ###
##############################
echo "Prüfe Voraussetzungen..."
if [ ! -d /usr/share/build-essential ]
then
sudo apt-get update
sudo apt-get build-essential
echo "OK" > prep_ok
fi
#git ?
if [ -z $(which git) ]
then
echo "Installiere git"
sudo apt-get -y install git
fi
# dialog?
if [ -z $(which dialog) ]
then
echo "Installiere dialog"
sudo apt-get -y install dialog
fi
# lftp?
if [ -z $(which lftp) ]
then
echo "Installiere lftp"
sudo apt-get -y install lftp
fi
if [ -z ${RASPI_IP} ]
then
MSG="Die IP-Adresse des Raspberry Pi ist nicht konfiguriert.\n"\
"Bitte öffnen Sie dieses Script zuerste in einem Editor"\
" und passen Sie die Konfiguration an.\n"\
"Abbruch!"
dialog --title "Konfiguration" --msgbox "${MSG}" 10 50
exit 1
fi
MSG="Dises Script erstellt ein Kernel Modul für den Raspberry Pi.\n"\
"Als Beispiel wird ein Modul für den USB-WLAN-Stick TP-Link AC900 erstellt."\
" Passen Sie zuerst im Script den Abschitt Konfiguration an."\
" Wenn das noch nicht erledigt ist, gehen Sie auf 'Abbrechen'\n"\
"Bei 'Weiter' lädt das Script den zu Ihrem Raspberry Pi passenden Kernel,"\
"einige Tools und den Treiber-Quellcode herunter. Das kann einige Zeit dauern..."
dialog --title "Module erstellen" --yes-label "Weiter" --no-label "Abbrechen" --yesno "${MSG}" 13 60
if [ "$?" != "0" ]
then
echo "Abbruch!"
exit 0
fi
MSG="Für die Kernel-Module ist die Datei 'Module.symvers' nötig.\n"\
"Die Datei ist auf 'raw.github.com/raspberrypi/firmware' verfügbar."\
" Wenn die Datei heruntergeladen werden soll, wählen Sie 'Minimal'.\n"\
"Manchmal liegt hier aber nicht die aktuelle Datei."\
" Dann schlägt das Laden des Moduls auf dem Rapberry Pi fehl."\
" In diesem Fall müssen Sie Kernel und Module komplett erstellen, wobei die Datei erzeugt wird."\
" Das dauert länger, sollte aber in jedem Fall ein passendes Modul erzeugen."
dialog --title "Modus wählen" --yes-label "Minimal" --no-label "Voll" --yesno "${MSG}" 15 60
if [ "$?" != "0" ]
then
MODE=full
else
MODE=min
fi
if [ ! -d $WORKDIR ]
then
mkdir $WORKDIR
fi
cd $WORKDIR
# Konfigurations-Dateien vom Raspberry Pi holen
get_files_from_raspi
if [ ! -e config.gz ]
then
MSG="config.gz nicht auf dem Rapberry Pi gefunden\n"\
"oder es konnte keine SSH-Verbindung hergestellt werden.\n"\
"Testen Sie ssh pi@$RASPI_IP.\n"\
"Führen Sie aßerdem auf dem Gerät zuerst 'sudo modeprobe configs' aus.\n"\
"Prüfen Sie, ob zcat /proc/config.gz den Inhalt der Datei ausgibt.\n"\
"Abbruch!"
dialog --title "config.gz" --msgbox "${MSG}" 10 50
exit 1
fi
echo Kernel-Hash: $KERNEL_HASH
if [ ! -d $WORKDIR/kernel ]
then
echo "Lade Kernel herunter"
git clone https://github.com/raspberrypi/linux.git kernel
echo Checkout Kernel ${KERNEL_HASH}
cd $WORKDIR/kernel
git checkout $KERNEL_HASH
fi
cd $WORKDIR
if [ ! -e kernel/.config ]
then
echo Kopiere .config
gunzip -c config.gz > kernel/.config
fi
if [ ! -d $WORKDIR/tools ]
then
echo "Lade Tools herunter"
git clone https://github.com/raspberrypi/tools
fi
#########################
# Treiber herunterladen #
#########################
if [ ! -d $WORKDIR/$DRIVERDIR ]
then
echo "Lade Treiber herunter"
git clone $GITCLONE
#git clone -b raspberry https://github.com/Myria-de/$DRIVERDIR.git
fi
# Crosscompile-Umgebung vorbereiten
if [ $HOSTARCH = 64 ]
then
export CCPREFIX=arm-linux-gnueabihf- bcm2709_defconfig
else
# nicht mehr unterstützt
export CCPREFIX=$WORKDIR/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
fi
echo
echo "Verwende Compiler $CCPREFIX"
echo
export ARCH=arm
export CROSS_COMPILE=${CCPREFIX}
export KERNEL_SRC=$WORKDIR/kernel
echo "Erstelle Kernel..."
cd $WORKDIR/kernel
if [ -e $WORKDIR/config.gz ]
then
if [ ! -e $WORKDIR/config.gz ]
then
zcat $WORKDIR/config.gz > $WORKDIR/kernel/.config
fi
else
echo $WORKDIR/config.gz ist nicht vorhanden. Abbruch.
exit 1
fi
if [ -e $WORKDIR/Module.symvers ]
then
cp $WORKDIR/Module.symvers $WORKDIR/kernel/Module.symvers
else
echo $WORKDIR/Module.symvers ist nicht vorhanden. Abbruch.
exit 1
fi
####################################
## Kernel vorbereiten/compilieren ##
####################################
if [ $MODE = "min" ]
then
make oldconfig
make prepare
make scripts
else
make clean
make oldconfig
make prepare
make $USE_THREADS
fi
##############################
## Kernel-Modul compilieren ##
##############################
echo Erstelle Treiber
cd $WORKDIR/$DRIVERDIR
make clean
make $USE_THREADS
if [ -e $DRIVERBIN ]
then
put_file_to_raspi
else
echo
echo $DRIVERBIN
echo ist nicht vorhanden.
echo Die Compilation ist fehlgeschlagen.
echo Bitte prüfen Sie Ihre Konfiguration.
fi
echo
echo Fertig!
echo
echo Zusammenfassung/Summary
echo Firmware-Hash: $FIRMWARE_HASH
echo Kernel-Hash: $KERNEL_HASH
echo Raspberry-Modell:$RASPI_MODEL
echo Modul: $DRIVERFILE
Netzwerkleistung mit iperf messen
Zuverlässigkeit und Geschwindigkeit Ihres Netzwerkes ermitteln Sie mit Tool iperf. Installieren Sie es auf dem Raspberry Pi und einem anderen PC im Netzwerk in einem Terminalfenster mit
sudo apt-get install iperf
Starten Sie auf dem Raspberry Pi
iperf -s
Das Tool lauscht nun auf dem TCP-Port 5001. Starten Sie auf einem anderen PC den Test mit dieser Befehlszeile:
iperf -c Server-IP -d
Ersetzen Sie Server-IP durch die tatsächliche IP-Adresse des Servers. Iperf sendet und empfängt nun zehn Sekunden lang Daten und zeigt anschließend das Ergebnis im Terminal. Der Parameter „-d“ testet simultan den Datendurchsatz in beiden Richtungen. In der Auswertung zeigt der erste Wert die Verbindung vom Client zum Server (Uplink), der zweite den Durchsatz vom Server zum Client.
Die Bedienung von Iperf wird durch das grafische Frontend Jperf erleichtert. Es zeigt die Messergebnisse in einem Diagramm und vermittelt so einen besseren Eindruck von der Transferrate. Jperf benötigt eine Java-Laufzeitumgebung. Installieren Sie diese beispielsweise unter Ubuntu mit folgender Befehlszeile:
sudo apt install default-jre
Laden Sie Jperf über https://www.pcwelt.de/1735757 herunter. Entpacken Sie das ZIP-Archiv und wechseln Sie im Terminalfenster mit cd in das Verzeichnis, in das Sie Jperf entpackt haben. Starten Sie das Tool mit
sh jperf.sh
Wählen Sie die Option „Server“, und klicken Sie auf „Run Iperf!“. Auf einem anderen PC im Netzwerk richten Sie Jperf ebenfalls ein. Hier wählen Sie die Option „Client“ und geben dahinter die IP-Adresse des Servers ein. Hinter „Output Format“ stellen Sie „MBits“ ein. Klicken Sie auf „Run Iperf!“. Das Tool zeigt Ihnen die Text-Ausgabe von iperf an und stellt die Daten in einem Diagramm dar.
Die folgenden Messungen stammen aus einen 2,4- und 5 GHz-WLAN (802.11n), also nicht aus einem Netzwerk mit 802.11ac-Router (zurzeit ist keiner verfügbar).
Schreibe einen Kommentar