Banana Pi 64 je jednoplatový počítač podobný Raspberry Pi, ale s viacerými ethernetovými portami, čo umožňuje vytvoriť z neho router na báze univerzálneho distribučného systému Linux.

Áno, už existuje OpenWrt, ale má svoje vlastné problémy, svoj GUI a CLI; je tu Mikrotik, ale ten má opäť svoje GUI/CLI, a Wireguard nefunguje hneď na začiatku... Celkovo chcem router s flexibilnými nastaveniami, pričom ostanem v rámci štandardného Linuxu, s ktorým pracujem každý deň.
V článku pod názvami BPI, R64, jednoplatník budem mať na mysli to isté — priamo samotný jednoplatník Banana Pi R64.
Výber obrazu. Načítanie cez eMMC
Najskôr potrebný zručnosť, ktorú treba získať pri práci s vo všeobecnosti a s R64 konkrétne, je naučiť sa nahrať do neho operačný systém a mať možnosť s ním interagovať, keďže R64 nemá port pre monitor (napr. HDMI). Keď všetko zhasne — Wifi, ethernetová sieť, Bluetooth, USB a ďalšie prestanú fungovať, je tu UART, cez ktorý sa vždy dá skontrolovať, čo sa pokazilo, ako aj spustiť niekoľko príkazov z konzoly, ak je to potrebné.
Algoritmus pripojenia k R64 cez USB-UART:
- bežíme do obchodu s elektronickými súčiastkami pre kábel USB-UART (PL2303, Serial-to-USB)
- pripojíme jeden USB koniec k počítaču a druhý, UART, k R64, tromi káblami zo štyroch, ako na obrázku nižšie
- v konzole počítača spustíme
sudo minicom
Po tomto sa vo väčšine prípadov objaví konzola jednoplatníka = úspech.
Podrobnejšie si môžete pozrieť .

Ďalej je najjednoduchšie nahrávať operačný systém z SD karty: stiahneme cez obraz a nahráme ho:
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=noxfervložíme kartu do SD slotu R64, zapneme ho a sledujeme cez pripojenú konzolu naštartovanie najprv uboot, potom štandardné spustenie Linuxu.
Alternatívna možnosť spustenia — pomocou už zabudovanej v R64 karty s veľkosťou 8Gb, nazývanej eMMC. Podľa pokynov v wiki prepisujeme obraz na zariadenie
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select nedotýkaj sa.
Ide o to, že aspoň pre BPI je potrebné nastaviť špeciálny flag, aby bolo možné bootovať z vnútornej pamäte:
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]Ďalej treba zapísať preloader do špeciálneho bootovacieho oddielu
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Výrobca R64 (Čína) zverejnil tento binárny súbor . Čo robí, nie je známe (zdrojové kódy nie sú), ale bez neho to tiež nefunguje.
V podstate sa po tomto obrazy začnú načítať aj z eMMC. Ak by ste chceli rozobrať a vytvárať obrazy od nuly, museli by ste zapísať ešte niekoľko súborov (preloader pre SD kartu, ATF, u-boot), len aby ste sa dostali k načítaniu kernelu. Téma je stále aktuálna, , ale pre nás je hlavné, že to funguje a to je fajn.
Teraz načítanie z eMMC, úprimne, nepoužívam, SD karty sú dostatočné, ale strávil som dosť veľa času tým, aby to fungovalo, preto to nechajme v článku.
Výber operačného systému. Armbian
Prvá aplikovaná úloha — spustiť VPN, samozrejme Wireguard. Hneď sa zistilo, že z pohľadu kernelu nie je zostavený, a hlavičky chýbajú. Zostavil som kernel a, podľa zvyku s x86, zostavil som modul kernelu pomocou DKMS. Avšak rýchlosť zostavenia na arm64 aj malých utilít ma nepríjemne prekvapila. A potom potreboval ďalší modul kernelu, atď. V podstate, všetko, čo súvisí s kernelom, je lepšie zostaviť na teplom, lampovom notebooku x86, potom jednoduchým kopírovaním preniesť na R64, reštartovať a testovať.
Iná vec — userspace časť. V mojom prípade výber Debian, všetko pre architektúru arm64 už existuje na packages.debian.org a nič nemusím prekompilovať.
Aby som nevytváral ďalší bicykel, na BPI R64.
Skôr takto: userspace časť — Armbian, a kernel sa berie z repozitára -a. Najčerstvejší obraz si môžete stiahnuť .
Celá aktivita na vývoji softvérovej časti R64 sa vedie na . V oboch prípadoch sa výrobca snaží popularizovať router pod Openwrt, ale vďaka aktivite vývojára Franka z Nemecka sa všetky funkcie rýchlo objavujú v kerneli pre Debian. Je prekvapujúce, ale Frank je aktívny v každej vetve fóra.
Organizácia pracovného priestoru: káble
Chcem osobitne povedať, ako počas vývoja/testovania umiestniť SBC (nielen BPI) na stole tak, aby nebolo potrebné viesť Ethernet kábel k nemu od zdroja internetu cez celú izbu/kanceláriu. Je to preto, že na jednej strane je potrebné zabezpečiť železu internet, a na druhej strane sa môže v tejto železe všetko pokaziť, a predovšetkým Wifi.
Na začiatku som sa rozhodol kúpiť lacný USB-Wifi "dongle", zasunúť ho do jediného portu na BPI a zabudnúť na káble. Na to som zakúpil cenovo dostupný TP-LINK TL-WN725N USB 2.0, ale veľmi rýchlo sa ukázalo, že to nevyjde: na prevádzku dongla je potrebný ovládač jadra, ktorý tam, samozrejme, nebol (neskôr som vytvoril potrebný ovládač RTL8XXXU, ale aj tak je to nepraktické). Ethernetový kábel kazil vzhľad miestnosti nejaký čas.
Nakoniec sa mi podarilo zbaviť sa kábla s pomocou Tenda MW3 (Wifi mesh-systém): jednoducho som umiestnil jeden kociek pod stôl a metrovým Ethernetovým káblom pripojil BPI k LAN-portu posledného. Úspech.
Wireguard, RKN, Bird
Jedna z vecí, prečo používam Banana PI — mať voľný prístup na stránky, ktoré zablokoval RKN, konkrétne, aby fungoval Telegram a hovory v Slacku. Na túto tému už boli navrhnuté články na Habre: , , .
Nasadenie práve takého riešenia som realizoval pomocou Ansible: .
Predpokladá sa, že VPS funguje pod Ubuntu 18.04. Funkčnosť som overil na dvoch hostiteľoch v Európe: Amazon a Digital Ocean.
Takže sme nainštalovali vyššie uvedený Armbian na R64, je dostupný cez ssh pod menom hm-bananapi-1 a má prístup na internet. Postupne nasadzujeme ansible, skripty automatizácie a spúšťame inštaláciu vlastne na 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-1Ďalej musíme analogicky nasadiť na VPS náš VPN:
ansible-playbook .\/router.py -l current-vpnTu je argument vždy current-vpn, a vlastné meno VPS sa nastavuje v premennej (v tomto prípade je to 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 áno, pred všetkými týmito operáciami je potrebné vygenerovať tajomstvá (najmä kľúče Wireguard) do adresára .\/secrets, adresár by mal vyzerať .
Automatizácia Ansible v Pythone
Je vidno, že namiesto formátu YAML sú príkazy Ansible zakódované v skriptoch Pythonu. Na porovnanie, ako bežným spôsobom spustiť demon bird:
- name: start bird
systemd:
name: bird
state: started
enabled: yesa ako to isté cez Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Zápis príkazov Ansible kódom v Pythone umožňuje opätovné použitie kódu, a celkovo sú otvorené všetky možnosti jazyka všeobecného určenia. Napríklad, inštalácia bird na R64 a VPS:
install_bird("router\/bird.conf.j2")
install_bird("vpn\/bird.conf.j2")pozrieť si kód funkcie .
Táto funkcia s názvom pybook bola implementovaná . Dokumentácia k pybook zatiaľ nie je, neskôr tento nedostatok opravím.
Čo si myslí o tom.
Monitorovanie. Prometheus
Súhrn: telegram funguje, linkedin a pornhub tiež, celkovo užívateľská skúsenosť — ok. Ale všetko sa môže pokaziť, a čínske zariadenia tiež.
Aktualizácie jadra bývajú tiež zaujímavé: napríklad som chcel aktualizovať jadro z 5.4 na 5.6, nuž, veď tam je Wireguard vonku, netreba patchovať… Povedané, urobené: s veľkou pozornosťou som preniesol patche z 5.4 na 5.6, jadro sa spustilo, tunel do VPS pingne, ale bird sa nemôže pripojiť s chybou "BGP Error"… "V hrôze som sa vrátil späť" (c) na 5.4; prechod na 5.6 som odložil do TODO.
Preto som v doplnku k inštalácii routera a VPS pridal monitorovanie (na x86 Ubuntu 18.04), ktoré je nainštalované na osobitnom hoste s nasledujúcimi komponentmi:
- prometheus, alertmanager, blackbox_exporter — všetko v dockeri
- alerte sú zasielané do telegramového kanála pomocou bota metalmatze/alertmanager-bot — tiež v dockeri
- tor pre bota, aby mohol bot alertovať situácie, keď je internet, ale telegram stále nefunguje, a samotný bot sa nemôže pripojiť
- aplikované : NodeVPNTroubles (žiadny ping do VPS), BirdVPNTroubles (žiadna relácia Bird), AntifilterDownloadTroubles (chyba pri sťahovaní zakázaných IP adries), SiteTroubles (nedostupný nešťastný telegram)
- systémové alerte, napríklad HostGrowingDiskReadLatency (lacná SD karta prestáva čítať)
Príklad inštalácie monitorovania:
ansible-playbook ./monitoring.py -l monitoring-preprodAuto Discovery pre promethea je nastavené na zložku /etc/prometheus/auto_http, príklad pridania hosta do monitorovania (podľa predvoleného nastavenia sa hostia nesledujú):
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 provideri, 2 BPI, anycast failover
Okrem všetkého plánujem pripojiť sa k dvom providerom, aby internet pokračoval v prevádzke, aj keď má jeden provider problémy so sieťou, alebo zabudli zaplatiť za internet atď., a iný ľudský faktor.
Najpokročilejšia užívateľská skúsenosť na tému multi-wan je popísaná pre systém Mwan3 pod Openwrt. Toto riešenie má bohatú funkcionalitu, ale nastavenie a prevádzka sú pre multi-wan dosť zložitou záležitosťou. Iba jeden príklad: ak sa pripojujete na niektoré stránky súčasne z dvoch IP adries, môže im to vadiť, prestanú fungovať => "internet nefunguje".
Zohľadňujúc túto skúsenosť som sa rozhodol, že multihoming momentálne nie je prioritou, iba failover. Hoci sa zdá, že v posledných verziách linuxu by to malo fungovať jedným príkazom typu:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Takže, aby sme nemali jednotný bod zlyhania, vezmeme 2 BPI, každý pripojíme k jednému poskytovateľovi, prepojíme ich navzájom a spojenie medzi nimi urobíme dynamickým smerovaním cez bird/OSPF.
Ďalej na každom oznámime rovnakú IP adresu v prípade, že je služba dostupná (internet, DNS). To znamená, že predpokladáme defaultný smer nie sami, ale prostredníctvom bird. Riešenie som pozoroval. .
Túto funkciu som ešte nerealizoval, zradný koronavírus tu tiež zamiešal karty (nie všetko prišlo z aliexpressu; ďalší internetový obchod, Layta, sľuboval doručiť za týždeň, ale už uplynul viac než mesiac; druhý poskytovateľ nestihol natiahnuť kábel pred karanténou, stihol iba vyvŕtať dieru do steny pre kábel).
Ako objednať R64
Samotná doska v oficiálnom obchode .
Je tiež lepšie ihneď objednať:
- + oznámiť štandard zásuvky EÚ alebo USA
- chladenie: chladiče/ventilátory; pretože sa zahrieva aj CPU, aj čip switcha
- anténu pre wifi,
Je tu nuansa — cena doručenia sa od nejakého času stala neprimerane vysokou v oficiálnom obchode. Manažérka Judy Huang ma presviedčala, že chyba nie je, a môžem si vybrať ePacket za 5 dolárov, ale videl som, že pre Rusko je k dispozícii iba EMS za >33$. Nepríjemné, ale nie kritické. Na druhej strane, ak vyberiem akúkoľvek inú krajinu na doručenie (prešiel som všetky kontinenty), doručenie bude za ~5$. Rusofóbovia?.. Ale potom som zistil, že cena doručenia do Francúzska je tiež ~30$, a upokojil som sa.
Nakoniec Judy navrhla urobiť objednávku, ale nezaplatiť (hint: vložiť na kartu menej, aby automaticky platba neprešla); napísať jej a ona zníži cenu doručenia na prijateľnú. Úspech.
Problémy
Nie všetko zatiaľ funguje ideálne.
Výkon
Príkazy Ansible=Python sa vykonávajú pomaly, aj prázdne, po 20-30 sekúnd; o poriadok pomalšie, než na notebooku x86. Na začiatku sa vykonávajú dosť rýchlo, ~3 sekundy, potom sa náhle spomalia. Môže to byť spôsobené zahrievajúcim sa CPU (throttling). Kód na Go tiež beží pomaly:
# запрос метрик для прометея из 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 funguje, ale na Armbian zhruba po dni prestane, píše:
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
...Pomoc je len reštart. Je potrebné pokračovať .
Ethernet
Ethernet funguje, ale po ~dni prestanú prichádzať pakety (DHCP) z R64.
Pomôže reštart rozhrania:
ifdown br0; sleep 30; ifup br0Ovládač je nový, do jadra zatiaľ nebol pridaný, dúfam, že Číňan Landen Chao .
Zdroj: habr.com
