BeagleBone Black mit Arch Linux: SSH mittels Ethernet over USB

Einer der größten Vorteile des BeagleBone Black ist, dass man in der Minimalkonfiguration nur ein einziges Kabel benötigt, um das Board mit Strom zu versorgen und gleichzeitig darauf zugreifen zu können. Dies ist möglich, da der BBB eine integrierte USB-to-Ethernet Bridge besitzt. Im Auslieferungszustand beherrscht der BeagleBone Black diese Kommunikationsart out-of-the-box, unter Arch-Linux müssen wir ihn erst dazu überreden.

Ein Kabel, zwei Funktionen: Stromversorgung und Ethernet over USB.

Ein Kabel, zwei Funktionen: Stromversorgung und Ethernet over USB.

BeagleBone Black vorbereiten

Den Ethernet-over-USB-Support aktivieren wir mit dem Befehl:

$ sudo modprobe g_ether

Anschließend sollten wir einen USB-Netzwerkadapter vorfinden:

$ ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether c8:a0:30:ab:9a:58 brd ff:ff:ff:ff:ff:ff
3: usb0: mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether 46:69:06:e2:47:20 brd ff:ff:ff:ff:ff:ff

Soll g_ether bei jedem Systemstart aktiviert werden, legen wir eine neue Datei im Verzeichnis /etc/modules.load.d/ an:

$ sudo nano /etc/modules-load.d/g_ether.conf

und tragen dort einfach g_ether ein.

Anschließend legen wir ein Netctl-Verbindungsprofil an und weisen dem BBB dort eine feste IP-Adresse zu. Ich habe in diesem Beispiel die selbe IP-Adresse verwendet, die auch in der Original-Konfiguration mit Ångström benutzt wird.

$ sudo cp /etc/netctl/examples/ethernet-static /etc/netctl/USB
$ sudo nano /etc/netctl/USB

Description='USB ethernet connection'
Interface=usb0
Connection=ethernet
IP=static
Address=('192.168.7.2/24')

## For IPv6 autoconfiguration
IP6=stateless

ExecUpPost='/usr/bin/ntpd -gq || true'

Die letzte Zeile bewirkt, dass der BBB versucht, über die USB-Verbindung die aktuelle Zeit zu bekommen. Das macht prinzipiell nur Sinn, wenn am sich anderen Ende der Leitung ein Computer mit einem NTP-Server befindet oder der BBB über die Verbindung ins Internet gelangen kann (mehr dazu siehe unten).

Als nächstes richten wir einen DHCP-Server für die USB-Verbindung ein. Jedes Mal, wenn wir unseren BBB an einen Host-Computer anschließen, bekommt dieser dann automatisch eine IP-Adresse zugewiesen.

$ sudo pacman -S dhcp
$ sudo mv /etc/dhcpd.conf /etc/dhcpd.conf.example
$ sudo nano /etc/dhcpd.conf

# USB-Verbindung
option subnet-mask 255.255.255.0;
subnet 192.168.7.0 netmask 255.255.255.0 {
range 192.168.7.1 192.168.7.1;
}

# Andere Verbindungen ignorieren
subnet 192.168.1.0 netmask 255.255.255.0 {
}
subnet 192.168.0.0 netmask 255.255.255.0 {
}

In die Datei /etc/dhcpd.conf tragen wir die Details für den DHCP-Server ein. Es ist eine Minimalkonfiguration, die auch nur einen einzigen Lease vergibt, nämlich 192.168.7.1 (ebenfalls analog zur Original-Konfiguration). Mehr ist auch nicht erforderlich, weil über USB ohnehin nur ein einziges Gerät gleichzeitig verbunden werden kann. Damit andere Adressbereiche nicht versuchen, eine IP-Adresse vom BBB zu bekommen (wenn das Netzwerkkabel eingesteckt ist oder ein USB-WLAN-Adapter verwendet wird), exkludieren wir alle anderen in Betracht kommenden IP-Adressbereiche, mit denen der BBB in Verbindung kommen könnte.

Zum Schluss aktivieren wir den DHCP-Server:

$ sudo systemctl enable dhcpd4.service
$ sudo systemctl start dhcpd4.service

Host-Betriebssystem vorbereiten

Als erstes müssen wir auf dem designierten Gastrechner die hauseigenen Beaglebone-Treiber installieren, falls das noch nicht geschehen ist. Für Linux benötigt man keine speziellen Treiber, kann sich aber das Leben leichter machen, in dem man die dort ebenfalls angebotenen udev-rules installiert.

Linux

Der BeagleBone Black müsste beim Anhängen in der Liste aller angeschlossenen USB-Geräte zu finden sein. Wonach wir suchen, ist folgender Eintrag:

$ lsusb
Bus 001 Device 015: ID 0525:a4a2 Netchip Technology, Inc. Linux-USB Ethernet/RNDIS Gadget

Wenn das aufscheint, ist das schon die halbe Miete. Außerdem sollten wir einen USB-Ethernet-Adapter in unserer Konfiguration vorfinden:

$ ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 10:fe:ed:05:36:f7 brd ff:ff:ff:ff:ff:ff
7: enp0s20u6: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 1e:cc:a0:32:68:8a brd ff:ff:ff:ff:ff:ff

In meinem Fall heißt der entsprechende Adapter enp0s20u6 (und ich habe keine Ahnung, warum er mit 7 statt mit 3 nummeriert ist). Er kann eben so gut usb0 oder vielleicht auch noch anders heißen.

Netzwerktools wie NetworkManager sollten in der Lage sein, automatisch eine Verbindung zum Netzwerk hinzuzufügen. Wer netctl verwendet, muss ifplugd installieren. Damit wird dem Adapter jedes Mal eine IP-Adresse zugewiesen, wenn das USB-Kabel angesteckt wird. Wer ifplugd verwendet, sollte darauf achten, dass man das USB-Kabel stets in den gleichen Anschluss steckt, da die Benennung des Netzwerkadapters anhand der internen Nummerierung der USB-Anschlüsse erfolgt. Wird das Kabel umgesteckt, so kann es passieren, dass der Anschluss dann z.B. enp0s20u5 heißt.

$ sudo pacman -S ifplugd
$ sudo systemctl enable netctl-ifplugd@enp0s20u6
$ sudo systemctl start netctl-ifplugd@enp0s20u6

Mit ip addr können wir auch die Adresse des Adapters prüfen. Sie sollte 192.168.7.1 lauten, gemäß der Einstellung unseres DHCP-Servers auf dem BBB. Jetzt können wir uns ganz normal mit SSH anmelden:

$ ssh user@192.168.7.2

Windows

Der RNDIS-Adapter wurde gefunden

Der RNDIS-Adapter wurde gefunden

 

Windows sollte beim Einstecken des BBB ein neues Gerät namens Linux USB Ethernet/RNDIS Gadget finden und ordnungsgemäß konfigureren. Es sind keine weiteren Schritte nötig; wir können uns mit PuTTY über 192.168.7.2 anmelden.

Mac OS X

OS X meldet einen neuen Netzwerkanschluss

OS X meldet einen neuen Netzwerkanschluss

 

Mac OS X meldet eine neue, nicht konfigurierte Netzwerkschnittstelle, deren Funktion wir in den Netzwerkeinstellungen überprüfen können. Mein altes MacBook Pro konnte scheinbar keine IP-Adresse vom DHCP-Server beziehen, weshalb ich die IP kurzerhand manuell auf 192.168.7.1 gesetzt habe. Danach klappte die Verbindung einwandfrei.

Nach manueller Zuweisung der IP-Adresse funktioniert die Verbindung

Nach manueller Zuweisung der IP-Adresse funktioniert die Verbindung

SSH-Feintuning

Hat man, wie ich, mehrere BeagleBone Blacks und vergibt auf allen die selbe IP-Adresse für den USB-Port, so wird man schnell auf folgende Fehlermeldung treffen, wenn man mit SSH auf verschiedene Boards nacheinander zugreifen möchte:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
##:##:##:##:##:##:##:##:##:##:##:##:##:##:##:##.
Please contact your system administrator.
Add correct host key in /home/markus/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/markus/.ssh/known_hosts:4
RSA host key for 192.168.7.2 has changed and you have requested strict checking.
Host key verification failed.

SSH merkt sich aus Sicherheitsgründen die RSA-Keys der angesteuerten Geräte, bezogen auf die IP-Adresse. Hängt an dieser IP-Adresse dann ein anderes Gerät (was SSH anhand des damit einher gehenden veränderten RSA-Keys feststellt), schlägt es Alarm und verweigert die Verbindungsaufnahme aus Sicherheitsgründen – es könnte sich um den Versuch eines Man-in-the-Middle – Angriffs handeln. Es gibt wenig, was wir dagegen tun können (und sollten).

Möglichkeit 1: auf dem Host-Betriebssystem entfernen wir jedes Mal den den entsprechenden Eintrag aus der known_hosts – Datei von SSH:

$ ssh-keygen -R 192.168.7.2
# Host 192.168.7.2 found: line 4 type RSA
/home/markus/.ssh/known_hosts updated.
Original contents retained as /home/markus/.ssh/known_hosts.old

Anschließend können wir uns wieder verbinden. Daraus können wir uns ein kleines Shell-Script basteln, um jedes Mal vor einer Verbindung mit dem BeagleBone Black den Eintrag aus known_hosts entfernen zu lassen:

$ nano ~/BBB_root.sh && chmod +x ~/BBB_root.sh

ssh-keygen -R 192.168.7.2
ssh root@192.168.7.2

Merke: das sudo-Kommando ist hier nirgendwo erforderlich, weil SSH auf einer per-Benutzer-Basis arbeitet.
Wir müssen beim Anmelden dann jedes Mal aufs Neue bestätigen, dass wir dem Gerät vertrauen:

$ ssh root@192.168.7.2
The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.
ECDSA key fingerprint is ##:##:##:##:##:##:##:##:##:##:##:##:##:##:##:##.
Are you sure you want to continue connecting (yes/no)?

Eine zweite, vielleicht etwas elegantere Möglichkeit, diesen Fehler zu umgehen, wäre, den USB-Ports je Board unterschiedliche IP-Adressen zuzuweisen, also 192.168.7.3, 192.168.7.4 usw. Das ist allerdings mit dem Nachteil verbunden, dass wir jedes Mal erst die Adresse des angeschlossenen Boards ermitteln müssen, erspart uns aber das Herumwurschteln in der SSH-Konfiguration.

Wirklich optimal ist keine der genannten Lösungen. Aber der Aufwand ist gerechtfertigt, wenn man bedenkt, dass SSH das alles zu unserem Schutz tut.

Über die USB-Verbindung ins Internet kommen?

Wenn man schon über das USB-Kabel ins Netzwerk kommt, kann man dann vielleicht auch direkt die Internetverbindung des Host-PCs mitbenutzen?

Ja, das geht. Wie, beschreibe ich hier.

Mehrere BeagleBone Blacks in einem gemeinsamen USB-Netzwerk?

Wer sich mit diesem Artikel befasst und mehrere BeagleBone Blacks untereinander verbinden möchte, fragt sich vielleicht, ob es nicht möglich ist, einfach komplett auf das Ethernet-Kabel zu verzichten und über einen USB-Hub ein gemeinsames USB-Netzwerk mit einem USB-Host-Rechner aufzubauen. Dabei könnte auch ein BBB die Rolle des Host-Rechners übernehmen.

Das funktioniert jedoch nicht direkt. Für jeden angeschlossenen BBB wird auf dem Host-Rechner nämlich ein neuer Ethernet-Adapter angelegt. Damit sind die Boards nicht im selben Netzwerk und können untereinander auch nicht kommunizieren. Vielleicht ist es durchaus möglich, die verschiedenen Adapter mittels Bridging zusammen zu schließen. Probiert habe ich das jedoch nicht und ich denke, dass das aus Performance-Gründen auch suboptimal ist, weil alle Daten immer über den Host laufen müssen, um von einem Board zum anderen zu gelangen. Ich bevorzuge in jedem Fall eine native Lösung mit „echtem“ Ethernet über einen Netzwerk-Switch.

GD Star Rating
loading…

Dieser Blogeintrag wurde 4865 mal gelesen.

Kategorien: Allgemein, Computer, Hardware, Linux, Macintosh, Single Board Computer und Windows.