Banana Pi 64 je jednodeskový počítač typu Raspberry Pi, ale s několika ethernetovými porty, což umožňuje vytvořit z něj router na základě distribuce Linuxu pro obecné použití.

Ano, už existuje OpenWrt, ale má své vlastní zvláštnosti, jak v GUI, tak v CLI; existuje Mikrotik, ale ten má opět své vlastní GUI/CLI a Wireguard nefunguje hned po instalaci... Celkově toužím po routeru s flexibilním nastavením, přičemž zůstanu v rámci standardního Linuxu, se kterým pracuji každý den.
V článku pod názvy BPI, R64, jednodeskový počítač budu mít na mysli to samé — vlastně samotný jednodeskový počítač Banana Pi R64.
Výběr obrazu. Spuštění pomocí eMMC.
Nejprve je třeba se naučit, jak nahrát operační systém do R64, protože R64 nemá port pro monitor (například HDMI). Když se vše zhroutí — přestane fungovat Wi-Fi, ethernet, Bluetooth, USB a další, je zde UART, přes který se vždy můžete podívat, co se pokazilo, a také spustit pár příkazů z konzole, pokud je to potřeba. celkově a u R64 zvlášť.
Algoritmus připojení k R64 přes USB-UART:
- běžíme do obchodu s elektronikou pro USB-UART kabel (PL2303, Serial-to-USB).
- připojíme jeden USB konec k počítači a druhý, UART, k R64, třemi dráty ze čtyř, jak je na obrázku níže.
- v konzole počítače spustíme
sudo minicom
Poté se ve většině případů objeví konzole jednodeskového počítače = úspěch.
Více informací můžete nalézt na .

Dále je nejjednodušší nahrát operační systém z SD karty: stáhněte si to podle obraz a nahrajte jej:
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 ji, a pozorujeme na připojené konzoli, jak se spouští nejprve uboot, poté standardní spuštění Linuxu.
Alternativní způsob spuštění — pomocí již vestavěné karty R64 velikosti 8 Gb, nazývané eMMC. Podle pokynů na wiki zapíšeme obraz na zařízení.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select nežmýkej.
Faktem je, že alespoň pro BPI je třeba nastavit speciální příznak, aby bylo možné bootovat z interní paměti:
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]Dále je třeba do speciální bootovací části zapsat preloader.
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Výrobce R64 (Čína) vydal tento binární soubor . Co přesně dělá, není známo (zdrojové kódy nejsou), ale bez něj to také nefunguje.
Obecně po tom začínají obrazy bootovat i z eMMC. Pokud byste si chtěli poradit a vytvářet obrazy od nuly, je také nutné zapsat ještě několik souborů (preloader pro SD kartu, ATF, u-boot), jen aby se dostali k načtení jádra. Tohle téma je stále , ale pro nás je hlavní, že to funguje a to je vše.
Momentálně pro eMMC boot doslova nepoužívám, SD karty stačí, ale strávil jsem poměrně dost času, abych to dostal do funkčního stavu, takže ať je to v článku.
Výběr operačního systému. Armbian
První praktický úkol — spustit VPN, samozřejmě Wireguard. Hned jsem zjistil, že není sestaven z jádra a nejsou k dispozici hlavičky. Přepracoval jsem jádro a ze zvyku z x86 jsem sestavil modul jádra pomocí DKMS. Nicméně rychlost sestavování na arm64, i pro malé utility, mě nepříjemně překvapila. A pak bylo potřeba ještě další jádro modulu, atd. Celkově vychází, že všechno, co souvisí s jádrem, je lepší sestavit na teplém vintage notebooku x86 a poté jednoduše zkopírovat na R64, restartovat a testovat.
Druhá věc — uživatelská část. V mém případě výběru Debianu je vše pro architekturu arm64 již dostupné na packages.debian.org a nic znovu sestavovat nemusím.
Abych nevytvářel další kolo, já na BPI R64.
Přesněji řečeno: uživatelská část — Armbian, a jádro se získává z repozitáře -a. Nejnovější obraz si můžete stáhnout .
Veškerá aktivita na vývoji softwarové části R64 probíhá na . Vlastně výrobce se snaží zpopularizovat router pod Openwrt, ale díky aktivitě vývojáře Frank-a z Německa všechny funkce rychle končí v jádru pro Debian. Je překvapující, že Frank je aktivní v každé větvi fóra.
Organizace pracovního prostoru: kabely
Samostatně chci říct, jak během vývoje/testování umístit SBC (nejen BPI) na stůl tak, aby nebylo nutné vést Ethernetový kabel k němu od zdroje internetu napříč celou místností/kanceláří. Je to proto, že na jedné straně je potřeba zajistit zařízení internet, a na druhé straně může v tomto zařízení všechno selhávat, a především Wifi.
Nejprve jsem se rozhodl pořídit levný USB-Wifi „stick“, zapojit ho do jediného portu na BPI a zapomenout na kabely. K tomu jsem zakoupil levný TP-LINK TL-WN725N USB 2.0, ale velmi brzy bylo jasné, že to nebude fungovat: k provozu sticku potřeboval ovladač jádra, který tam samozřejmě nebyl (později jsem zkompiloval potřebný ovladač RTL8XXXU, ale stále to není praktické). A Ethernetový kabel kazil vzhled pokoje nějakou dobu.
Nakonec se mi podařilo se kabelu zbavit pomocí Tenda MW3 (Wifi mesh systém): jednoduše jsem umístil jeden blok pod stolem a metrovým Ethernetovým kabelem připojil BPI k LAN portu posledního. Úspěch.
Wireguard, RKN, Bird
Jedním z cílů, pro které používám Banana PI, je mít volný přístup na stránky, které jsou blokované RKN, konkrétně, aby fungoval Telegram a volání v Slacku. Na toto téma již byly navrženy články na Habru: , , .
Nasazení právě takového řešení jsem realizoval pomocí Ansible: .
Předpokládá se, že VPS běží pod Ubuntu 18.04. Funkčnost jsem ověřil na dvou hostitelích v Evropě: Amazon a Digital Ocean.
Takže jsme nainstalovali výše uvedený Armbian na R64, je dostupný přes ssh pod názvem hm-bananapi-1 a má přístup na internet. Postupně nasazujeme ansible, automatizační skripty a zahajujeme instalaci 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-1Dále je potřeba podobně nasadit na VPS naši VPN:
ansible-playbook .\/router.py -l current-vpnZde je argument vždy current-vpn, a vlastně název VPS se nastavuje v proměnné (v tomto případě 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 ano, před všemi těmito operacemi je potřeba vygenerovat tajemství (konkrétně klíče Wireguard) do složky .\/secrets, adresář by měl vypadat .
Automatizace Ansible v Pythonu
Můžeme si všimnout, že místo formátu YAML jsou příkazy Ansible zakódovány ve skriptech Python. Pro srovnání, jak obvyklým způsobem spustit démon bird:
- name: start bird
systemd:
name: bird
state: started
enabled: yesa jak to samé přes Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Zapisování příkazů Ansible kódem v Pythonu umožňuje opětovné použití kódu, a vůbec jsou otevřeny všechny možnosti jazyka obecného účelu. Například instalace bird na R64 a VPS:
install_bird("router\/bird.conf.j2")
install_bird("vpn\/bird.conf.j2")podívat se na kód funkce .
Tato funkce nazvaná pybook byla implementována Dokumentace k pybooku zatím není, později tento nedostatek opravím.
Co si myslí o tom.
Monitoring. Prometheus
Celkově: Telegram funguje, LinkedIn a Pornhub také, uživatelská zkušenost je v pořádku. Ale všechno se může rozpadnout a čínské zařízení také.
Aktualizace jádra mohou být také zajímavé: například jsem chtěl aktualizovat jádro z 5.4 na 5.6, je tam přece Wireguard v základu, nemusím patchovat… Řekl jsem, udělal jsem: cílevědomě jsem přenášel patche z 5.4 do 5.6, jádro se rozjelo, tunel na VPS pinguje, ale bird se nemůže připojit s chybou "BGP Error"… "V hrůze jsem se vrátil zpět" (c) na 5.4; přesun na 5.6 jsem odložil na TODO.
Proto jsem kromě instalace routeru a VPS přidal monitoring (na x86 Ubuntu 18.04), který se instaluje na samostatný host s následujícími komponenty:
- prometheus, alertmanager, blackbox_exporter — všechno v dockeru
- Upozornění se posílají do telegramového kanálu pomocí bota metalmatze/alertmanager-bot — také v dockeru
- tor pro bota, aby bot mohl upozorňovat na situace, když internet je, ale Telegram přesto nefunguje, a sám bot se nemůže připojit
- aplikovní : NodeVPNTroubles (žádný ping na VPS), BirdVPNTroubles (žádná relace Bird), AntifilterDownloadTroubles (chyba při stahování blokovaných IP adres), SiteTroubles (nedostupný prokletý Telegram)
- systémová upozornění, například HostGrowingDiskReadLatency (levná SD karta přestává číst)
Příklad instalace monitoringu:
ansible-playbook ./monitoring.py -l monitoring-preprodAuto Discovery pro Prometheus je nastaveno na složku /etc/prometheus/auto_http, příklad přidání hosta do monitoringu (ve výchozím nastavení se hosté 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 poskytovatelé, 2 BPI, anycast failover
Kromě všeho jsem naplánoval připojení k dvěma poskytovatelům, aby internet pokračoval v práci, i když u jednoho poskytovatele jsou síťové problémy, nebo zapomněli zaplatit za internet atd., a další lidský faktor.
Nejvyspělejší uživatelská zkušenost na téma multi-wan je popsána pro systém Mwan3 pod OpenWRT. Toto řešení má bohatou funkčnost, ale nastavení a provoz pro multi-wan je obecně dost obtížné. Například: pokud navštěvujete některé stránky současně se dvěma IP adresami, nemusí se jim to líbit, přestanou fungovat => "internet nefunguje".
Po zhodnocení této zkušenosti jsem se rozhodl, že multihoming zatím není prioritou, pouze failover. I když se zdá, že v posledních verzích Linuxu by to vše mělo fungovat jedním příkazem ve formátu:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Takže, abychom neměli jediný bod selhání, vezmeme 2 BPI, každý připojíme k jednomu poskytovateli, spojíme je mezi sebou a spojení uděláme dynamickým routováním pomocí bird/OSPF.
Dále na každém oznámíme stejnou IP adresu, pokud je služba dostupná (internet, DNS). To znamená, že trasu nastavíme ne sami, ale prostřednictvím bird. Řešení jsem odpozoroval .
Tuto funkci jsem zatím neimplementoval, zrádný koronavirus zde také zasáhl (neslo už všechno z AliExpress; další internetový obchod, Layta, slíbil dodání za týden, ale už to trvá déle než měsíc; druhý poskytovatel nestihl natáhnout kabel před karanténou, stihl jen vyvrtat díru ve zdi pro kabel).
Jak objednat R64
Samotná deska v oficiálním obchodě .
Také je lepší hned objednat:
- + sdělit standard konektoru EU nebo USA
- chladič: radiátory/větráky; protože se zahřívá jak CPU, tak čip switche
- anténu pro wifi,
Je tu nuance - cena dopravy se od nějakého momentu stala nepřiměřeně vysokou v oficiálním obchodě. Manažerka Judy Huang mě přesvědčovala, že chyba není, a mohu zvolit ePacket za 5 USD, ale viděl jsem, že pro Rusko je dostupná pouze EMS za >33 USD. Nepříjemné, ale ne kritické. Přičemž pokud vyberu jakoukoli jinou zemi pro dopravu (prošel jsem všechny kontinenty), doprava bude za ~5 USD. Rusofobové?.. Ale pak jsem zjistil, že pro Francii je cena dopravy také ~30 USD, a uklidnil jsem se.
Nakonec Judy navrhla udělat objednávku, ale neplatit (hint: vložit na kartu méně, aby automaticky neprošla platba); napsat jí a ona sníží cenu dopravy na přijatelnou. Úspěch.
Problémy
Zatím všechno nefunguje ideálně.
Výkon
Příkazy Ansible=Python se vykonávají pomalu, i prázdné, po 20-30 sekundách; v pořádku delší dobu než na notebooku x86. Přičemž na začátku se vykonávají dost rychle, ~3 sekundy, pak se náhle zpomalují. Možná to je způsobeno přehříváním CPU (throttling). Kód napsaný v Go také běží dlouho:
# запрос метрик для прометея из 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 Armbianu po přibližně dni přestane, 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
...Pomáhá pouze restart. Je třeba pokračovat .
Ethernet
Ethernet funguje, ale po ~24 hodinách přestávají přicházet pakety (DHCP) od R64.
Pomáhá restartování rozhraní:
ifdown br0; sleep 30; ifup br0Ovladač je nový, do jádra ještě nebyl přijat, doufám, že Číňan Landen Chao .
Zdroj: habr.com
