Du bist hier:Start»CyanogenMod»USB-Tethering

USB-Tethering mit CyanogenMod bzw. Android

28.03.2015

Tethering bezeichnet die Verbindung eines Smartphones mit einem Computer. Bei USB-Tethering wird eine Netzwerkverbindung zwischen Computer und Smartphone über ein USB-Kabel hergestellt.

USB-Verbindung zwischen Laptop und Smartphone

USB-Verbindung zwischen Laptop und Smartphone

In CyanogenMod Version 11 ist diese Funktion unter Einstellungen - Drahtlos & Netzwerke - Mehr... - Tethering & mobiler Hotspot - USB-Tethering zu finden ...

USB-Tethering in den normalen Einstellungen

USB-Tethering in den normalen Einstellungen

oder über die Schnelleinstellungen, die vom oberen Rand des Smartphones heruntergezogen werden können:

USB-Tethering in den Schnelleinstellungen

USB-Tethering in den Schnelleinstellungen

Automatisierung von USB-Tethering unter Linux

Unter dem Betriebssystem Linux lassen sich automatisch Programme starten, sobald ein USB-Gerät an den Compter gesteckt beziehungsweise abgezogen wird. Dadurch ist es nicht mehr notwendig diese Taste auf dem Smartphone zu drücken. Die Einstellung auf dem Linux-Computer befindet sich im Verzeichnis /etc/udev/rules.d/. Dort kann z.B. eine Datei 99-galaxy.rules für das Smartphone Samsung Galaxy S3 angelegt werden:

# as user root
sudo bash

cat > /etc/udev/rules.d/99-galaxy.rules <<EOF
SUBSYSTEM=="usb", ACTION=="add",    ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL_ID}=="6864", RUN+="/home/user/android/scripts/galaxy.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL_ID}=="6864", RUN+="/home/user/android/scripts/galaxy_remove.sh"

SUBSYSTEM=="usb", ACTION=="add",    ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL_ID}=="6860", RUN+="/home/user/android/scripts/galaxy.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL_ID}=="6860", RUN+="/home/user/android/scripts/galaxy_remove.sh

EOF

Die Hersteller- und Modell-Bezeichner (Vendor-ID und Model-ID), die oben eingetragen sind, können durch den Befehl lsusb ermittelt werden.

lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
Bus 002 Device 028: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II]

Es können wie im oberen Beispiel auch mehrere USB-Modell-Bezeichner in die udev-Datei eingetragen werden. Der Userspace Device Daemon (udevd) startet jetzt beim Anstecken des entsprechenden Smartphones an den Computer das oben aufgeführte Skript "galaxy.sh". Ein Neustart des udevd ist nicht notwendig.

#!/bin/bash
# galaxy.sh

# check for running process
if [ "$(pgrep sudo_mount.sh | wc -l)" != "0" ];then
  exit
fi

# display notification message to the user
export DISPLAY=:0
date >> /dev/shm/galaxy.txt
su user -c "notify-send 'Samsung Galaxy S3 found'"
su user -c "/home/user/android/scripts/mount.sh &"

Dabei wird dem Benutzer "user" eine Benachrichtung gegeben, dass das Smartphone angesteckt und erkannt wurde. Anschließend wird ein mount-Skript aufgerufen. Bei einem anderen Benutzernamen muss "user" gegen den richtigen Benutzernamen ausgetauscht werden (whoami). Schließlich wird in der letzten Zeile ein mount-Skript im Hintergrund aufgerufen. Das ist notwendig, damit udev und das mount-Skript mount.sh entkoppelt sind. Mounten bedeutet, dass das Dateisystem des Smartphones am Computer "eingehangen" und somit wie ein normales Verzeichnis zugreifbar gemacht werden soll.

#!/bin/bash
# mount.sh
sudo /home/user/android/scripts/sudo_mount.sh </dev/null > /dev/shm/mount_$(date +"%F_%H-%M-%S").txt 2>&1 &

Das Skript sudo_mount.sh muss in die Datei /etc/sudoers eingetragen werden, damit das Skript mit Root-Rechten laufen kann.

echo "user ALL=(root) NOPASSWD:/home/user/android/scripts/sudo_mount.sh" >> /etc/sudoers

Und jetzt schließlich das wichtigste Skript: sudo_mount.sh. Die Erläuterungen zu dem Skript und ein Bild für das Szenario folgen unter dem Quellcode. Das Shell-Skript benötigt das Programm Android Debug Bridge (adb) - es muss vorher installiert werden.

#!/bin/bash
# sudo_mount.sh

running=$(pgrep mount.sh | wc -l)
if [ "$running" != "2" ];then
  echo "exitting $running"
  exit
fi

mount | grep -q /home/user/mnt
if [ $? -eq 0 ];then
  fusermount -u /home/user/mnt
  exit
fi

echo "killing adb server and start as root"
adb kill-server
adb start-server

echo "get root on the smartphone"
adb wait-for-device
adb root

echo "enable USB tethering"
adb wait-for-device
adb shell "setprop sys.usb.config rndis,adb"

echo "configure IP address on smartphone"
adb wait-for-device
adb devices
adb shell "ifconfig rndis0 192.168.42.129 up"

result=$(adb shell "iptables -nvL | grep rndis | wc -l | tr -d '\n'")
if [ "$result" == "0" ];then
  adb shell "iptables -I INPUT -i rndis0 -j ACCEPT"
  adb shell "iptables -I OUTPUT -o rndis0 -j ACCEPT"
fi

adb shell "killall sshd"
adb shell "nohup /system/bin/sshd"

echo "configure IP address on computer"
ifconfig usb0 192.168.42.1 up

sleep 1
echo "now mounting smartphone via sshfs"
sshfs -o allow_other root@192.168.42.129:/ /home/user/mnt/

Zunächst wird geprüft, ob das Mount-Skript bereits läuft. Sollte eins laufen, dann beendet sich das zweite gestartete Mount-Skript. Sollte das Dateisystem des Smartphones bereits an das Dateisystem des Laptops montiert sein, dann wird das Dateisystem abmontiert und das Skript beendet. Bis hierhin werden nur Fehlerfälle behandelt. Anschließend geht es mit dem normalen Ablauf weiter. Die Android Debug Bridge (adb) wird auf dem Laptop und auf dem Smartphone mit Root-Rechten neu gestartet. Mit "adb wait-for-device" wird gewartet, bis die Android Debug Bridge auf dem Smartphone neu gestartet wurde. Mit "adb shell" kann ein Befehl vom Computer aus auf dem Smartphone abgesetzt werden. setprop sys.usb.config rndis,adb schaltet schließlich das USB-Tethering im Smartphone per Kommandozeile ein. Dadurch geht kurzzeitig die USB-Verbindung verloren, so dass wieder gewartet werden muss. Mit ifconfig rndis0 wird auf dem Smartphone eine IP-Adresse für die USB-Schnittstelle gesetzt. Dasselbe passiert etwas weiter unten im Skript auch für die Netzwerk-Schnittstelle usb0 auf dem Computer. Um sicher zu sein, dass die Netzwerkverbindung zwischen Computer und Smartphone funktioniert, werden die Firewall-Einstellungen des Smartphones für die Netzwerk-Schnittstelle rndis0 mit iptables auf "durchlassen" gestellt. Je nach Firewall-Konfiguration des Linux-Computers müssen auch für die usb0-Schittstelle des Computers die iptables-Regeln angepaßt werden. Am Ende des Skripts wird der SSH-Daemon neu gestartet und das Dateisystem des Smartphones über den Befehl sshfs an den Computer gemountet.

Siehe dazu auch meinen Artikel über den SSH-Daemon in CyanogenMod.

Wenn alles funktioniert hat, dann sollte nach Anstecken des Smartphones ein "ping -c 1 -W 1 192.168.42.129" vom Computer zum Smartphone funktionieren. Außerdem sollte der Befehl sshfs das Dateisystem des Smartphones unter dem Verzeichnis /home/user/mnt/ verfügbar gemacht haben. Auch hier gilt wieder: "user" durch den richtigen Benutzernamen ersetzen !

USB-Tethering mit sshfs

USB-Tethering mit sshfs

Beim Abziehen des Smartphones wird "galaxy_remove.sh" aufgerufen. Dieses Skript ist deutlich einfacher, da hier nur kleine Aufräumarbeiten - wie das "Abmontieren" des Dateisystems des Smartphones - durchzuführen sind.

#!/bin/bash
# galaxy_remove.sh

# check for running process
if [ "$(pgrep sudo_mount.sh | wc -l)" != "0" ];then
  exit
fi

export DISPLAY=:0
su user -c "notify-send 'Samsung Galaxy S3 removed'"

fusermount -u /home/user/mnt/
killall adb

Falls noch etwas unklar sein sollte, dann kannst du die Kommentar-Funktion benutzen.

Kommentar schreiben