Banana Pi 64 er en engangskomputer af typen Raspberry Pi, men med flere Ethernet-porte, hvilket gør det muligt at lave en router baseret på en generel Linux-distribution.

Ja, der findes allerede OpenWrt, men det har sine egne quirks med sin egen GUI og CLI; der er Mikrotik, men det har igen sin egen GUI/CLI, og WireGuard fungerer ikke ud af boksen… Det vil sige, jeg ønsker en router med fleksible indstillinger, men som forbliver inden for rammerne af standard Linux, som man arbejder med hver dag.
I artiklen under navnene BPI, R64, engangskomputer vil jeg henvise til det samme – selve engangskomponenten Banana Pi R64.
Valg af billede. Booting fra eMMC
Den allerførste færdighed, man skal erhverve sig, når man arbejder med generelt og med R64 specifikt, er at lære at indlæse et operativsystem i den og have mulighed for at interagere med den, for R64 har ikke en port til en skærm (HDMI, for eksempel). Når det hele falder fra hinanden – Wifi, Ethernet-netværk, Bluetooth, USB og andet stopper med at fungere, er der UART, gennem hvilket man altid kan se, hvad der gik galt, samt køre et par kommandoer fra konsollen, hvis nødvendigt.
Algoritme til tilslutning til R64 via USB-UART:
- løb til butikken for radiokomponenter for at hente et USB-UART-kabel (PL2303, Serial-to-USB)
- tilslut den ene USB-ende til computeren og den anden, UART, til R64 med tre af de fire ledninger, som på billedet nedenfor
- i computerens konsol kører
sudo minicom
Derefter vil der i de fleste tilfælde komme en konsol fra engangskomponenten = succes.
Du kan se mere detaljeret .

Dernæst er det nemmest at indlæse operativsystemet fra SD-kortet: download det fra billedet og overfør det:
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=noxferindsæt kortet i SD-slots R64, tænd det og observer bootprocessen via den tilsluttede konsol, først bootloaderen, derefter standard boot af Linux.
Et alternativ til booting - ved hjælp af det allerede indbyggede eMMC-kort på 8 Gb. I henhold til instruktionen i wiki overfører vi billedet til enheden.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select ikke rør.
Det er nemlig sådan, at man i det mindste for BPI skal sætte et specielt flag for at kunne boote fra den interne flash:
root@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nBoot configuration bytes [PARTITION_CONFIG: 0x00]\nroot@bpi-r64:~# .\/mmc bootpart enable 1 1 \/dev\/mmcblk1\nroot@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nBoot configuration bytes [PARTITION_CONFIG: 0x48]Dernæst skal vi skrive preloaderen til den specielle boot-partition.
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Producenten R64 (Kina) har udgivet denne binærfil . Hvad den gør, er ukendt (der er ingen kilder), men uden den fungerer det heller ikke.
Generelt set begynder billederne at boote fra eMMC efter dette. Hvis man ønsker at forstå og skabe billeder fra bunden, skal man for begge tilfælde (SD/eMMC) også skrive flere filer (preloader til SD-kortet, ATF, u-boot), bare for at komme til at boote kernerne. Dette emne er stadig , men for os er det vigtigste, at det virker, og det er fint.
Jeg bruger ærligt talt ikke eMMC-boot nu, SD-kort er tilstrækkelige, men jeg brugte en del tid på at få det til at fungere, så lad det være i artiklen.
Valg af operativsystem. Armbian
Den første praktiske opgave er at starte VPN, naturligvis Wireguard. Det blev straks klart, at den ikke var bygget ind i kernen, og der var ingen headers. Jeg kompilerede kernen og, som sædvanligt med x86, byggede jeg kerne-modulet ved hjælp af DKMS. Dog blev jeg dårligt overrasket over bygge-hastigheden på arm64, selv for mindre værktøjer. Og så krævedes endnu et kerne-modul, osv. Generelt viser det sig, at alt, der har med kernen at gøre, er bedre at bygge på en varm, hyggelig x86-bærbar, og derefter flytte det enkelt til R64, genstarte og teste.
Det andet er brugerrumsdelen. I mit tilfælde med Debian-valget er alt for arm64-arkitekturen allerede tilgængeligt på packages.debian.org, så der er ingen grund til at genkompilere.
For ikke at skabe endnu en cykel, jeg på BPI R64.
Eller rettere sagt: brugerrumsdelen er Armbian, mens kernen hentes fra repository -s. Den nyeste version kan downloades .
Al aktivitet omkring udviklingen af software til R64 foregår på . Generelt set forsøger producenten at popularisere routeren under Openwrt, men takket være Frank, udviklerne fra Tyskland, findes alle funktioner hurtigt i kernen for Debian. Overraskende nok er Frank aktiv i hver sektion af forumet.
Organisering af arbejdspladsen: ledninger
Jeg vil gerne fortælle, hvordan man under udvikling/testing placerer SBC (ikke kun BPI) på skrivebordet, så man ikke behøver at føre Ethernet-kablet til det fra kilden til internettet gennem hele rummet/kontoret. Problemet er, at man på den ene side skal sikre, at maskinen har internet, og på den anden side kan alt gå galt i denne maskine, især Wifi.
Først besluttede jeg at købe en billig USB-Wifi "dongle", stikke den i den eneste port på BPI og glemme kablerne. Jeg købte en budgetvenlig TP-LINK TL-WN725N USB 2.0, men meget hurtigt blev det klart, at det ikke ville fungere: der kræves en kernel-driver for at donglen kan arbejde, og selvfølgelig var den ikke til stede (senere samlede jeg den nødvendige RTL8XXXU-driver, men det er stadig upraktisk). Ethernet-kablet ødelagde udsigten i værelset i et stykke tid.
Til sidst lykkedes det mig at slippe af med kablet ved hjælp af Tenda MW3 (Wifi mesh-system): jeg placerede blot en kube under bordet og tilsluttede BPI til LAN-porten på den sidste med et meter langt Ethernet-kabel. Succes.
Wireguard, RKN, Bird
En af de ting, jeg bruger Banana PI til, er at have fri adgang til hjemmesider, der er blokeret af RKN, især for at Telegram og opkald i Slack kan fungere. Der har allerede været foreslået artikler om dette emne på Habr: , , .
Implementeringen af denne løsning blev jeg gjort muligt ved hjælp af Ansible: .
Det antages, at VPS kører under Ubuntu 18.04. Jeg har testet funktionaliteten på to udbydere i Europa: Amazon og Digital Ocean.
Så vi har installeret den ovenfor nævnte Armbian på R64, den er tilgængelig via ssh under navnet hm-bananapi-1 og har internetadgang. Vi installerer Ansible sekventielt, automatiseringsscriptet og starter installationen på 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-1Dernæst skal vi på tilsvarende måde deployere vores VPN på VPS:
ansible-playbook ./router.py -l current-vpnHer er argumentet altid current-vpn, mens selve navnet på VPS'en indstilles i variablen (i dette tilfælde 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-1Åh, ja, før alle disse operationer skal hemmelighederne (herunder Wireguard-nøglerne) genereres i mappen ./secrets, mappen skal se således ud .
Ansible-automatisering på Python
Det er værd at bemærke, at i stedet for YAML-formatet er Ansible-kommandoer kodet i Python-scripts. Til sammenligning, hvordan man normalt starter bird-dæmonen:
- name: start bird
systemd:
name: bird
state: started
enabled: yesog hvordan det samme gøres via Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")At skrive Ansible-kommandoer i Python-kode giver mulighed for genbrug af koden, og der er generelt åbnet op for alle mulighederne i et generelt programmeringssprog. For eksempel, installation af bird på R64 og VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")se koden til funktionen .
Denne funktion kaldet pybook er implementeret Der er endnu ingen dokumentation for pybook, jeg retter denne fejl senere.
Hvad mener du om dette?
Overvågning. Prometheus
Alt i alt: Telegram fungerer, LinkedIn og Pornhub også, generelt er brugeroplevelsen god. Men alting kan gå i stykker, og de kinesiske enheder også.
Opdateringer af kernen kan også være interessante: for eksempel ønskede jeg at opdatere kernen fra 5.4 til 5.6, for der er jo Wireguard out of the box, ingen patching nødvendigt... Det blev gjort: jeg flyttede omhyggeligt patches fra 5.4 til 5.6, kernen startede, tunnelen til VPS pinger, men Bird kan ikke oprette forbindelse med fejlen "BGP Error"... "I rædsel rullede jeg tilbage" (c) til 5.4; overgangen til 5.6 er sat på TODO-liste.
Derfor, ud over installationen af routeren og VPS, tilføjede jeg overvågning (på x86 Ubuntu 18.04), som installeres på en separat vært med følgende komponenter:
- prometheus, alertmanager, blackbox_exporter - alt i Docker
- alarmer sendes til Telegram-kanalen ved hjælp af botten metalmatze/alertmanager-bot - også i Docker
- tor for botten, så botten kan sende alarmer om situationer, hvor internettet er tilgængeligt, men Telegram stadig ikke fungerer, og selve botten ikke kan oprette forbindelse
- applikations : NodeVPNTroubles (ingen ping til VPS), BirdVPNTroubles (ingen Bird-session), AntifilterDownloadTroubles (fejl ved download af blokkerede IP-adresser), SiteTroubles (den forbandede Telegram er utilgængelig)
- systemalarmer, for eksempel HostGrowingDiskReadLatency (billigt SD-kort stopper med at blive læst)
Eksempel på opsætning af overvågning:
ansible-playbook ./monitoring.py -l monitoring-preprodAuto Discovery for Prometheus er indstillet på mappen /etc/prometheus/auto_http, eksempel på at tilføje vært til overvågning (som standard overvåges værter ikke):
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 leverandører, 2 BPI, anycast failover
Derudover planlægger jeg at tilslutte mig to udbydere, så internettet kan fortsætte med at fungere, selv hvis en udbyder har netværksproblemer, eller har glemt at betale for internettet osv., og den menneskelige faktor.
Den mest avancerede brugeroplevelse om multi-wan er beskrevet til systemet Mwan3 under OpenWrt. Denne løsning har rigt funktionalitet, men opsætning og drift af multi-wan er generelt ret besværligt. Et eksempel: hvis man kommer ind på nogle websites med to IP-adresser på én gang, kan de ikke bryde sig om det, og de stopper med at fungere => "internettet virker ikke".
Givet denne erfaring har jeg besluttet, at multihoming ikke er en prioritet for nu, kun failover. Dog ser det ud til, at i de seneste versioner af linux burde det fungere med en enkelt kommando som:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Så for at undgå et enkelt fejllæsspunkt, tager vi 2 BPI, tilslutter hver til en udbyder, forbinder dem med hinanden og laver forbindelsen mellem dem med dynamisk routing via bird/OSPF.
Desuden annoncerer vi den samme IP-adresse på hver, hvis tjenesten er tilgængelig (internet, DNS). Det vil sige, at vi ikke selv angiver standardruten, men via bird. Jeg fik denne løsning ved. .
Jeg har ikke implementeret denne funktion endnu; den snedige coronavirus har også spillet ind (alt er ikke ankommet fra AliExpress; en anden online butik, Layta, lovede levering inden for en uge, men det er nu mere end en måned siden; den anden udbyder nåede ikke at trække kablet før karantænen, han fik kun borret hul i væggen til kablet).
Hvordan man bestiller R64
Selve kortet i den officielle butik .
Det er også bedst at bestille med det samme:
- + oplys standardstikket EU eller USA
- kølelegeme: radiatorer/vifter; fordi både CPU'en bliver varm, og switch-chippen
- en antenne til wifi,
Der er et problem - fragtprisen er blevet uforholdsmæssigt høj i den officielle butik i et stykke tid. Manageren Judy Huang overbeviste mig om, at der ikke var nogen fejl, og man kunne vælge ePacket til $5, men jeg så, at der for Rusland kun var EMS til >33$. Ubehageligt, men ikke kritisk. Desuden, hvis man vælger et hvilket som helst andet land til levering (jeg har prøvet alle kontinenter), vil levering koste ~5$. Russofober? ... Men jeg fandt senere ud af, at fragten til Frankrig også koster ca. 30$, og blev roligere.
Til sidst foreslog Judy at lave bestillingen, men ikke betale (hint: at lægge mindre på kortet, så betalingen ikke går igennem automatisk); skrive til hende, og hun vil sænke fragten til en rimelig pris. Succes.
Issues
Ikke alt fungerer perfekt endnu.
Ydeevne
Ansible=Python-kommandoer udføres langsomt, selv tomme, i 20-30 sekunder; meget længere end på x86-laptoppet. De udføres først hurtigt, ~3 sekunder, hvorefter de pludselig bliver langsommere. Måske sker dette på grund af den overophedende CPU (throttling). Koden i Go kører også langsomt:
# запрос метрик для прометея из 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 fungerer, men på Armbian stopper det efter cirka en dag, og skriver:
sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Message 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Message 50 (seq 4) timeout
...Kun en genstart hjælper. Vi skal videre .
Ethernet
Ethernet fungerer, men efter ~et døgn stopper pakkerne (DHCP) fra R64 med at komme.
Genstart af interfacet hjælper:
ifdown br0; sleep 30; ifup br0Driveren er ny, den er endnu ikke blevet accepteret i kernen, håber at kineseren Landen Chao .
Kilde: habr.com
