Die Banana Pi 64 ist ein Einplatinencomputer ähnlich dem Raspberry Pi, bietet jedoch mehrere Ethernet-Ports, die es ermöglichen, ihn in einen Router mit einem allgemeinen Linux-Distrubutionsbetriebssystem umzuwandeln.

Ja, es gibt bereits OpenWrt, aber es hat seine eigenen Eigenheiten, sowohl im GUI als auch im CLI; es gibt Mikrotik, aber auch dessen GUI/CLI funktioniert nicht optimal, und Wireguard läuft nicht sofort... Im Grunde möchte man einen Router mit flexiblen Einstellungen, der dennoch innerhalb der Standards von Linux bleibt, mit dem man täglich arbeitet.
In diesem Artikel werde ich unter den Begriffen BPI, R64 und Einplatinencomputer dasselbe verstehen — den eigentlichen Einplatinencomputer Banana Pi R64.
Wahl des Abbilds. Booten von eMMC.
Die erste Fähigkeit, die man beim Arbeiten mit generell und mit R64 im Besonderen erlernen muss, ist das Booten des Betriebssystems, um mit ihm interagieren zu können, da der R64 keinen Anschluss für einen Monitor (z.B. HDMI) hat. Wenn alles ausfällt — das Wifi nicht mehr funktioniert, Ethernet, Bluetooth, USB und andere, gibt es immer noch UART, über dessen Schnittstelle man sehen kann, was schiefgelaufen ist, und gegebenenfalls ein paar Befehle aus der Konsole ausführen kann.
Algorithmus zur Verbindung mit R64 über USB-UART:
- Wir gehen in den Elektronikladen, um ein USB-UART-Kabel (PL2303, Serial-to-USB) zu besorgen.
- Einen USB-Anschluss verbinden wir mit dem Computer, den anderen, UART, mit dem R64, unter Verwendung von drei der vier Drähte, wie im Bild unten.
- Im Terminal des Computers starten wir
sudo minicom
In den meisten Fällen erscheint danach die Konsole des Einplatinencomputers – Erfolg.
Mehr Details finden Sie hier .

Das einfachste Vorgehen ist, das Betriebssystem von der SD-Karte zu laden: Wir laden herunter unter das Image und schreiben es ein:
unzip -p 2019-08-23-ubuntu-16.04-lite-preview-bpi-r64-sd-emmc.img.zip | pv | sudo dd of=/dev/mmcblk0 bs=10M status=noxferDie Karte in den SD-Slot des R64 einsetzen, einschalten und über die angeschlossene Konsole beobachten, wie zunächst uboot und dann das Standard-Linux bootet.
Eine alternative Methode zum Booten ist über die bereits im R64 eingebaute 8-GB-Karte, die eMMC genannt wird. Laut Anleitung im Wiki das Image auf das Gerät schreiben.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot-Auswahl Nicht bewegen.
Das Problem ist, dass zumindest für BPI ein spezielles Flag gesetzt werden muss, um von dem internen Flash-Speicher booten zu können:
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot-Konfigurationsbytes [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot-Konfigurationsbytes [PARTITION_CONFIG: 0x48]Als Nächstes müssen Sie im speziellen Boot-Bereich den Preloader aufzeichnen.
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Der Hersteller R64 (China) hat dieses Binärfile bereitgestellt. . Was es genau macht, ist unbekannt (Quellcode fehlt), aber ohne es wird es ebenfalls nicht funktionieren.
Im Allgemeinen beginnen nach dieser Maßnahme die Images auch von eMMC zu booten. Wenn Sie jedoch selbstständig arbeiten und Images von Grund auf erstellen möchten, müssen für beide Fälle (SD/eMMC) noch einige Dateien aufgezeichnet werden (Preloader für die SD-Karte, ATF, u-boot), nur um zum Kernel-Start zu gelangen. Dieses Thema ist bis heute aktuell. , aber für uns zählt, dass es funktioniert, und das ist in Ordnung.
Momentan benutze ich ehrlich gesagt das Booten über eMMC nicht, die SD-Karten reichen mir aus, aber ich habe viel Zeit damit verbracht, dass es funktioniert, daher soll es in dem Artikel erwähnt werden.
Wahl des Betriebssystems: Armbian
Die erste praktische Aufgabe bestand darin, ein VPN einzurichten, und zwar natürlich mit Wireguard. Sofort stellte sich heraus, dass es im Kernel nicht kompiliert war und keine Header vorhanden waren. Ich baute den Kernel neu und, aus Gewohnheit mit x86, kompilierte das Kernel-Modul mit DKMS. Allerdings hat mich die Kompilierungsgeschwindigkeit auf arm64, selbst für kleine Utilities, unangenehm überrascht. Und dann war ein weiteres Kernel-Modul notwendig, und so weiter. Insgesamt zeigt sich, dass alles, was mit dem Kernel zu tun hat, besser auf einem warmen, alten x86-Laptop zu kompilieren ist, und es dann einfach auf das R64 zu kopieren, neu zu starten und zu testen.
Anders sieht es mit dem Userspace-Teil aus. In meinem Fall mit der Wahl Debian, sind bereits alle Pakete für die Architektur arm64 auf packages.debian.org verfügbar, sodass nichts neu kompiliert werden muss.
Um ein weiteres Rad nicht neu zu erfinden, habe ich auf BPI R64.
Genauer gesagt: Der Userspace-Teil ist Armbian, während der Kernel aus dem Repository von stammt. Das aktuellste Image kann heruntergeladen werden. .
Die gesamte Aktivität bezüglich der Softwareentwicklung für R64 findet auf statt. Im Übrigen versucht der Hersteller, den Router unter OpenWrt zu popularisieren, aber dank der Aktivitäten des Entwicklers Frank aus Deutschland finden alle Funktionen schnell ihren Weg in den Kernel für Debian. Erstaunlicherweise ist Frank in jedem Thread des Forums aktiv.
Organisieren des Arbeitsplatzes: Kabel
Ich möchte separat erläutern, wie man während der Entwicklung/Testphase einen SBC (nicht nur BPI) so auf dem Tisch platziert, dass kein Ethernet-Kabel von der Internetquelle durch das ganze Zimmer/Büro verlegt werden muss. Einerseits ist es wichtig, der Hardware Internetzugang zu gewähren, andererseits kann bei dieser Hardware alles kaputtgehen, vor allem das Wifi.
Zunächst entschied ich mich, einen günstigen USB-Wifi-Dongle zu kaufen, ihn in den einzigen Port des BPI zu stecken und die Kabel zu vergessen. Dafür erwarb ich den preiswerten TP-LINK TL-WN725N USB 2.0, aber bald stellte sich heraus, dass das nicht funktionieren würde: Der Dongle benötigt einen Kernel-Treiber, der dort natürlich nicht vorhanden war (später konnte ich den benötigten RTL8XXXU-Treiber zusammenstellen, aber das war trotzdem unpraktisch). Zudem beeinträchtigte das Ethernet-Kabel für eine gewisse Zeit das Aussehen des Zimmers.
Letztendlich gelang es mir, das Kabel mit Hilfe des Tenda MW3 (Wifi-Mesh-System) loszuwerden: Ich platzierte einfach einen Würfel unter dem Tisch und verband den BPI mit einem ein Meter langen Ethernet-Kabel mit dem LAN-Port des Mesh-Systems. Erfolg.
Wireguard, RKN, Bird
Eine der Anwendungen, für die ich Banana Pi benutze, ist der ungehinderte Zugang zu von der RKN gesperrten Websites, insbesondere damit Telegram und Anrufe in Slack funktionieren. Zu diesem Thema wurden bereits Artikel auf Habré vorgeschlagen: , , .
Die Umsetzung genau dieser Lösung habe ich mit Ansible realisiert: .
Der VPS läuft unter Ubuntu 18.04. Ich habe die Funktionalität auf zwei Hosting-Anbietern in Europa überprüft: Amazon und Digital Ocean.
Wir haben also das oben genannte Armbian auf R64 installiert, es ist über SSH unter dem Namen hm-bananapi-1 erreichbar und hat Zugang zum Internet. Wir installieren nacheinander Ansible, Automatisierungsskripte und starten die Installation direkt auf R64:
# зависимости для Debian-based дистрибутивов
$ sudo apt install --no-install-recommends python3-pip python3-setuptools python3-wheel git
$ which pip3
/usr/bin/pip3
# ansible с pybook, скриптование на Python
$ pip3 install https://github.com/muravjov/ansible/archive/ansible-2.10.0.dev0-pybook2019.tar.gz
$ export PATH=~/.local/bin:$PATH
$ which ansible-playbook
/home/sa/.local/bin/ansible-playbook
$ git clone https://github.com/muravjov/ansible-bpi-r64.git
$ cd ansible-bpi-r64
$ git submodule update --init
# убеждаемся в доступности hm-bananapi-1
$ ssh hm-bananapi-1 which python3
/usr/bin/python3
# собственно установка
$ ansible-playbook ./router.py -l hm-bananapi-1Nun muss unser VPN ebenfalls analog auf dem VPS bereitgestellt werden:
ansible-playbook ./router.py -l current-vpnHier ist das Argument stets current-vpn, während der Name des VPS in einer Variablen konfiguriert wird (in diesem Fall paris-vpn-aws-t2-micro-1):
$ grep current_vpn group_vars/all
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-1Ach ja, vor all diesen Operationen müssen die Geheimnisse (insbesondere die WireGuard-Keys) im Ordner ./secretsgeneriert werden, das Verzeichnis sollte folgendermaßen aussehen .
Ansible-Automatisierung in Python
Es ist zu erkennen, dass die Ansible-Befehle statt im YAML-Format in Python-Skripten codiert sind. Zum Vergleich, wie man den Dienst bird auf die herkömmliche Weise startet:
- name: start bird
systemd:
name: bird
state: started
enabled: yesund wie man das Gleiche über Python macht:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Die Codierung von Ansible-Befehlen in Python ermöglicht eine Wiederverwendbarkeit des Codes und eröffnet die gesamten Möglichkeiten einer universellen Programmiersprache. Zum Beispiel die Installation von bird auf R64 und VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")den Code der Funktion ansehen .
Dieses Feature mit dem Namen pybook wurde . Eine Dokumentation zu pybook gibt es bisher nicht, das werde ich später nachholen.
Was denkt darüber.
Monitoring. Prometheus
Zusammenfassend: Telegram funktioniert, LinkedIn und Pornhub ebenfalls, insgesamt ist die Benutzererfahrung – in Ordnung. Aber alles kann ausfallen, und chinesische Hardware auch.
Kernel-Updates können auch spannend sein: Zum Beispiel wollte ich das Kernel von 5.4 auf 5.6 aktualisieren, da WireGuard standardmäßig dabei ist und ich nichts patchen muss… Gesagt, getan: Ich habe die Patches von 5.4 auf 5.6 gewissenhaft übertragen, das Kernel läuft, das Tunnel zu VPS kann gepingt werden, aber Bird kann sich nicht verbinden und zeigt den Fehler "BGP Error"… "In Panik bin ich zurück auf 5.4 gegangen" (c) die Migration auf 5.6 habe ich in die TODO-Liste gesetzt.
Deshalb habe ich neben der Installation des Routers und des VPS auch Monitoring hinzugefügt (auf x86 Ubuntu 18.04), das auf einem separaten Host mit den folgenden Komponenten installiert wird:
- prometheus, alertmanager, blackbox_exporter – alles in Docker
- Alarme werden über einen Bot metalmatze/alertmanager-bot in einen Telegram-Kanal gesendet – ebenfalls in Docker
- Tor für den Bot, damit der Bot Situationen melden kann, in denen das Internet funktioniert, aber Telegram trotzdem nicht läuft und der Bot selbst keine Verbindung herstellen kann
- Anwendungs- : NodeVPNTroubles (kein Ping zum VPS), BirdVPNTroubles (keine Bird-Session), AntifilterDownloadTroubles (Fehler beim Herunterladen blockierter IP-Adressen), SiteTroubles (Telegram ist nicht erreichbar)
- Systemalarme, z. B. HostGrowingDiskReadLatency (eine günstige SD-Karte hört auf zu funktionieren)
Beispiel für die Installation von Monitoring:
ansible-playbook ./monitoring.py -l monitoring-preprodDie Auto Discovery für Prometheus ist auf den Ordner /etc/prometheus/auto_http eingestellt. Hier ein Beispiel, wie man einen Host zur Überwachung hinzufügt (standardmäßig werden Hosts nicht überwacht):
bash << 'EOF'
HOSTNAME=hm-bananapi-1
IP_ADDRESS=`ssh -G $HOSTNAME | awk '/^hostname / { print $2 }'`
ssh monitoring-preprod sudo sponge /etc/prometheus/auto_http/$HOSTNAME.json << EOF2
[
{
"targets": ["$IP_ADDRESS:9100"],
"labels": {
"env": "prod",
"hostname": "$HOSTNAME"
}
}
]
EOF2
EOFTODO: 2 Anbieter, 2 BPI, Anycast Failover
Zusätzlich habe ich geplant, mich mit zwei Anbietern zu verbinden, damit das Internet weiterhin funktioniert, selbst wenn ein Anbieter Netzwerkprobleme hat oder vergessen hat, für das Internet zu bezahlen usw. – der klassische menschliche Faktor.
Das fortschrittlichste Benutzererlebnis im Bereich Multi-WAN ist beschrieben für das Mwan3-System unter OpenWrt. Diese Lösung bietet eine Vielzahl an Funktionen, jedoch kann die Einrichtung und Nutzung von Multi-WAN recht kompliziert sein. Nur ein Beispiel: Wenn man von zwei IP-Adressen gleichzeitig auf einige Webseiten zugreift, kann dies zu Problemen führen, da diese eventuell nicht reagieren und die Meldung "Internet funktioniert nicht" erhalten.
Angesichts dieser Erfahrung habe ich entschieden, dass Multihoming vorerst nicht prioritär ist, nur Failover. Allerdings scheint in den neuesten Versionen von Linux alles mit einem Befehl der Art funktionieren zu müssen:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Um einen einzelnen Punkt des Ausfalls zu vermeiden, nehmen wir 2 BPI, verbinden jeden mit einem Anbieter, koppeln sie und richten die Verbindung untereinander über dynamisches Routing mit bird/OSPF ein.
Außerdem kündigen wir auf beiden die gleiche IP-Adresse an, falls der Dienst verfügbar ist (Internet, DNS). Das bedeutet, dass wir die Standardroute nicht selbst einstellen, sondern über bird auswählen werden. Diese Lösung habe ich übernommen. .
Diese Funktionalität habe ich bisher nicht umgesetzt, böser Corona hat hier auch einen Strich durch die Rechnung gemacht (nicht alles ist von AliExpress angekommen; ein weiterer Online-Shop, Layta, hatte versprochen, innerhalb einer Woche zu liefern, aber es sind bereits mehr als einen Monat vergangen; der zweite Anbieter hat es nicht geschafft, das Kabel bis zum Lockdown zu verlegen, er hat nur ein Loch in die Wand für das Kabel gebohrt).
Wie man R64 bestellt
Die Platine im offiziellen Shop .
Es ist auch besser, gleich zu bestellen:
- + informieren Sie über den Steckertyp EU oder USA
- Kühlkörper: Kühler/Ventilatoren; denn auch die CPU erwärmt sich, und der Switch-Chip.
- eine Antenne für WiFi,
Es gibt eine Anmerkung — die Versandkosten sind seit einiger Zeit im offiziellen Shop unangemessen hoch geworden. Die Managerin Judy Huang versicherte mir, dass es keinen Fehler gibt und ich ePacket für 5 $ wählen kann, aber ich habe gesehen, dass es für Russland nur EMS für >33 $ gibt. Unangenehm, aber nicht kritisches. Wenn ich jedoch ein anderes Land für den Versand wähle (habe alle Kontinente durchprobiert), beträgt der Versand etwa 5 $. Sind das Russophobe?.. Doch dann fand ich heraus, dass die Versandkosten für Frankreich ebenfalls etwa 30 $ betragen, und war beruhigt.
Letztendlich bot Judy an, die Bestellung aufzugeben, aber nicht zu bezahlen (hinweis: weniger auf die Karte zu legen, damit die Zahlung nicht automatisch durchgeht); mir zu schreiben, und sie würde die Versandkosten auf ein angemessenes Niveau senken. Erfolgreich.
Probleme
Nicht alles funktioniert bisher perfekt.
Leistung
Ansible-Commands in Python laufen langsam, selbst die leeren, dauern 20-30 Sekunden; das ist deutlich länger als auf meinem x86-Laptop. Zunächst laufen sie recht schnell, etwa 3 Sekunden, verlangsamen sich dann aber plötzlich. Möglicherweise liegt das am überhitzenden CPU (Throttling). Der Go-Code läuft ebenfalls lange:
# запрос метрик для прометея из node_exporter на Go
$ time curl -s http://172.30.1.1:9100/metrics > /dev/null
real 0m6,118s
user 0m0,005s
sys 0m0,009s
# однако температура 51 градус, не так и много
sa@bananapir64:~$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
51700Wifi
Wifi funktioniert, aber auf Armbian hört es nach etwa einem Tag auf zu funktionieren, es steht:
sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Nachricht 38 (seq 3) Zeitüberschreitung
[470314.042508] mt7622_wmac 18000000.wmac: Nachricht 50 (seq 4) Zeitüberschreitung
...Ein Neustart hilft nur vorübergehend. Es muss weiter untersucht werden. .
Ethernet
Ethernet funktioniert, aber nach etwa einem Tag hören die Pakete (DHCP) von R64 auf zu kommen.
Ein Neustart des Interfaces hilft:
ifdown br0; sleep 30; ifup br0Der Treiber ist neu, wurde noch nicht in den Kernel aufgenommen, hoffentlich wird der Chinese Landen Chao .
Quelle: habr.com
