Banana Pi 64 je jednodeskový počítač podobný Raspberry Pi, ale s několika ethernetovými porty, což z něj dělá univerzální distribuční směrovač Linuxu.

Ano, existuje OpenWRT, ale má své vlastní zvláštnosti, vlastní GUI a CLI; existuje Mikrotik, ale ten má opět vlastní GUI/CLI a Wireguard Z krabice to nefunguje... V podstatě chci router s flexibilním nastavením, a přitom zůstat v rámci standardního Linuxu, se kterým denně pracuji.
V článku pod názvy BPI, R64, jednodeska budu mít na mysli to samé - samotnou jednodesku Banana Pi R64.
Výběr obrázku. Stáhnout přes eMMC
Úplně první dovednost, kterou si osvojíte při práci obecně a u R64 zvlášť to znamená naučit se, jak do něj nahrát OS a umět s ním komunikovat, protože R64 nemá port pro monitor (například HDMI). Když vše spadlo - přestala fungovat Wifi, ethernetová síť, Bluetooth, USB atd. je tu UART, přes jehož rozhraní vždy vidíte, co se pokazilo, a případně i spustit pár příkazů z konzole.
Algoritmus připojení k R64 přes USB-UART:
- běžte do obchodu s rádiovými součástkami pro kabel USB-UART (PL2303, Serial-to-USB)
- připojíme jeden konec USB k počítači a druhý, UART, k R64, třemi ze čtyř vodičů, jako na obrázku níže
- ve spuštění konzoly počítače
sudo minicom
Poté se ve většině případů objeví jednodesková konzole = úspěch.
Další podrobnosti lze vidět .

Dále je nejjednodušší načíst operační systém z SD karty: stáhnout do obrázek 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 R64 SD-slotu, zapneme, pozorujeme načítání ubootu nejprve na připojené konzoli, poté standardní boot Linuxu.
Alternativní možností spouštění je použití 64Gb karty již zabudované v R8, nazývané eMMC. Podle návodu na wiki přepíšeme obrázek do zařízení
/dev/mmcblk0 na BPI, restartujte, vyjměte SD kartu, znovu povolte BPI... a nefunguje to. Jak se tam dostat Boot select nezdržuj se.
Faktem je, že alespoň pro BPI musíte nastavit speciální příznak, abyste mohli zavést systém z interní jednotky flash:
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [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 configuration bytes [PARTITION_CONFIG: 0x48]Dále musíte zapsat preloader na speciální spouštěcí oddíl
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) zveřejnil tento binární soubor . Co dělá, se neví (neexistují zdrojové kódy), ale bez něj to také nepůjde.
Obecně platí, že poté se obrázky začnou načítat z eMMC. Pokud na to chcete přijít a vytvořit obrázky od začátku, pak pro oba případy (SD / eMMC) musíte zapsat několik dalších souborů (preloader pro SD kartu, ATF, u-boot), abyste se dostali k jádru bota. Toto téma je stále , ale pro nás je hlavní, že to funguje a je v pořádku.
Nyní, abych byl upřímný, nepoužívám stahování eMMC, stačí SD karty, ale strávil jsem docela dost času jeho zprovozněním, tak ať je to v článku.
Volba operačního systému. armbian
Prvním praktickým úkolem je samozřejmě spuštění VPN WireguardOkamžitě jsem zjistil, že jádro nebylo správně zkompilováno a nebyly v něm žádné hlavičkové soubory. Jádro jsem znovu sestavil a, jak je u x86 zvykem, sestavil modul jádra pomocí DKMS. Rychlost sestavení na ARM64, a to i u malých utilit, však byla nepříjemně překvapivá. Pak byl potřeba další modul jádra a tak dále. V podstatě se ukázalo, že cokoli souvisejícího s jádrem se nejlépe kompiluje na ošuntělém notebooku s x86, pak se to prostě zkopíruje a vloží do ARM64, restartuje a otestuje.
Část s využitím prostoru je jiná věc. V mém případě je to volba Debian, vše pro architekturu arm64 je již v balíčcích.debian.org a není potřeba nic znovu kompilovat.
Abych nevyráběl další kolo, I na BPI R64.
Nebo spíše: část uživatelského prostoru je Armbian a jádro je převzato z úložiště -A. Nejnovější obrázek lze stáhnout .
Veškerá činnost na vývoji softwarové části R64 probíhá na Obecně řečeno, samotný výrobce se snaží router pro OpenWrt zpopularizovat, ale díky aktivitě vývojáře Franka z Německa se všechny funkce rychle dostanou do jádra. Debian-a. Frank je překvapivě aktivní v každém vlákně fóra.
Organizace pracovního prostoru: dráty
Samostatně vám chci říci, jak umístit SBC (nejen BPI) na stůl během vývoje / testování tak, aby k němu nevedl ethernetový kabel ze zdroje internetu přes celou místnost / kancelář. Fakt je, že na jednu stranu je potřeba do toho železu poskytnout internet a na druhou stranu se v tom železe může všechno rozbít a hlavně Wifi.
Nejprve jsem se rozhodl koupit levnou USB-Wifi „píšťalku“, zapojit ji do jediného portu na BPI a zapomenout na dráty. Za tímto účelem jsem si koupil levný TP-LINK TL-WN725N USB 2.0, ale velmi brzy bylo jasné, že nevzlétne: aby píšťalka fungovala, byl zapotřebí ovladač jádra, který tam samozřejmě nebyl. (později jsem zkompiloval potřebný ovladač RTL8XXXU, ale stále je to nepraktické). A ethernetový kabel na chvíli zkazil výhled na místnost.
Ve výsledku se mi podařilo zbavit se kabelu pomocí Tenda MW3 (Wifi mesh systém): jednoduše jsem jednu kostku umístil pod stůl a BPI připojil metrovým ethernetovým kabelem k LAN portu druhého. Úspěch.
Wireguard, RKN, Pták
Jednou z věcí, na které používám Banana PI, je mít volný přístup zejména na stránky blokované RKN, aby fungoval Telegram a volání na Slack. Články na toto téma již byly na Habré navrženy: , , .
Implementoval jsem nasazení právě takového řešení pomocí Ansible: .
Předpokládá se, že VPS běží pod Ubuntu 18.04. dubna. Funkčnost jsem otestoval u dvou poskytovatelů hostingu v Evropě: Amazon a Digital Ocean.
Nainstalovali jsme tedy výše uvedený Armbian na R64, je dostupný přes ssh pod jménem hm-bananapi-1 a má přístup k internetu. Nasadíme sekvenční ansible, automatizační skripty a spustíme samotnou 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 třeba nasadit naši VPN na VPS stejným způsobem:
ansible-playbook ./router.py -l current-vpnZde je argument vždy current-vpn a samotný název VPS je nakonfigurován 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-1Ano, před všemi těmito operacemi je potřeba vygenerovat tajné kódy (zejména klíče). Wireguard) do složky ./secrets, adresář by měl vypadat takto .
Ansible automatizace v Pythonu
Můžete si všimnout, že namísto formátu YAML jsou příkazy Ansible zakódovány ve skriptech Pythonu. Pro srovnání, jak povolit ptačího démona obvyklým způsobem:
- 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")Psaní příkazů Ansible pomocí kódu Python umožňuje opětovné použití kódu a obecně jsou všechny možnosti univerzálního jazyka otevřené. Například instalace bird na R64 a VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")viz kód funkce .
Tato funkce se nazývá pybook implementováno . Na pybooku zatím není žádná dokumentace, pak tuto závadu opravím.
Co si myslí při této příležitosti.
Sledování. Prometheus
Celkem: telegram funguje, linkedin a pornhub také, obecně je uživatelská zkušenost v pořádku. Ale všechno se může rozbít a čínské kusy železa taky.
Aktualizace jádra mohou být také zajímavé: například jsem chtěl aktualizovat jádro 5.4 => 5.6, no, tam Wireguard Po vybalení z krabice není třeba patchovat... Sotva řečeno, to udělám: Pečlivě jsem převedl patche z 5.4 na 5.6, jádro se nastartovalo, tunel k VPS pingne, ale Bird se nemůže připojit s chybou „BGP Error“... „S hrůzou jsem se vrátil“ (c) na 5.4; přechod na 5.6 byl zadán do TODO.
Proto jsem kromě instalace routeru a VPS přidal i monitoring (na x86 Ubuntu 18.04), který je nainstalován na samostatném hostiteli s následujícími komponentami:
- prometheus, alertmanager, blackbox_exporter - vše v dockeru
- výstrahy jsou odesílány na kanál telegramů pomocí robota metalmatze/alertmanager-bot – také v dockeru
- tor pro robota, aby robot mohl upozornit na situace, kdy je k dispozici internet, ale telegram stále nefunguje a samotný robot se nemůže připojit
- aplikovaný : NodeVPNTroubles (žádný ping na VPS), BirdVPNTroubles (žádná ptačí relace), AntifilterDownloadTroubles (nepodařilo se načíst blokované IP adresy), SiteTroubles (nešťastný telegram není k dispozici)
- systémová upozornění jako HostGrowingDiskReadLatency (levná SD karta se přestane číst)
Příklad nastavení monitorování:
ansible-playbook ./monitoring.py -l monitoring-preprodAutomatické zjišťování pro prometheus je nastaveno na složku /etc/prometheus/auto_http, což je příklad přidání hostitele do monitorování (hostitelé nejsou ve výchozím nastavení monitorováni):
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, převzetí služeb při selhání anycast
Ke všemu jsem plánoval připojení ke dvěma poskytovatelům, aby internet fungoval dál, i kdyby měl jeden poskytovatel problémy se sítí, nebo zapomněl zaplatit internet atd. a další lidský faktor.
Je popsána nejpokročilejší uživatelská zkušenost na téma multi-wan pro systém Mwan3 pod Openwrt. Toto řešení má bohatou funkčnost, ale obecně nastavení a provoz pro multi-wan je poměrně problematické. Jen jeden příklad: když přijdete na nějaké stránky ze dvou IP adres najednou, tak se jim to nemusí líbit, přestanou fungovat => "internet nefunguje."
Vzhledem k této zkušenosti jsem se rozhodl, že multihoming zatím není prioritou, pouze převzetí služeb při selhání. I když se zdá, že v nejnovějších verzích linuxu by vše mělo fungovat s jedním příkazem, jako je:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Abychom se vyhnuli jedinému bodu selhání, vezmeme 2 BPI, každý se připojí k jednomu poskytovateli, propojíme je a vytvoříme vzájemnou komunikaci dynamicky směrovanou přes bird / OSPF.
Dále na každém oznamujeme stejnou IP adresu, pokud je služba dostupná (Internet, DNS). To znamená, že výchozí trasu nepoložíme sami, ale přes ptáka. Řešení špehoval .
Tato funkcionalita zatím není implementována, zákeřný koronavirus pokazil (ne vše přišlo z aliexpressu, další internetový obchod Layta slíbil dodání do týdne a uběhl více než měsíc, druhému poskytovateli se nepodařilo natáhnout kabel před karanténou, podařilo se pouze udělat díru ve zdi pro vyvrtání kabelu).
Jak objednat R64
Samotná deska v oficiálním obchodě .
Je také lepší objednat okamžitě:
- + Informujte o standardu zástrčky EU nebo USA
- chladič: radiátory/ventilátory; protože se zahřívá jak CPU, tak spínací čip
- wifi anténa,
Existuje nuance - cena dodání se od určité doby stala v oficiálním obchodě neadekvátně vysoká. Manažerka Judy Huang mě ujistila, že nedošlo k chybě a můžete si vybrat ePacket za 5 $, ale viděl jsem, že pro Rusko je pouze EMS za > 33 $. Nepříjemné, ale ne kritické. Navíc, pokud si pro doručení vyberete jakoukoli jinou zemi (prošel jsem všechny kontinenty), bude doručení stát ~5 $. Rusofobové?... Ale pak jsem zjistil, že pro Francii je cena dopravy také ~ 30 $, a uklidnil jsem se.
V důsledku toho Judy nabídla, že zadá objednávku, ale nezaplatí (náznak: dát na kartu méně, aby platba neprobíhala automaticky); napište jí a ona sníží cenu dopravy na normální. Úspěch.
Problémy
Ne vše zatím funguje dokonale.
Производительность
Ansible=Příkazy Pythonu jsou prováděny pomalu, dokonce i nečinné, po dobu 20-30 sekund; řádově delší než u notebooku x86. Navíc se nejprve provádějí docela rychle, ~ 3 sekundy, pak se prudce zpomalí. Možná je to způsobeno zahříváním CPU (škrcení). Go kód je také dlouho spuštěný:
# запрос метрик для прометея из 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 asi po dni se zastaví na Armbianu, 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ůže pouze restart. Musíme jít dál .
Ethernet
Ethernet funguje, ale po ~ dni přestanou přicházet pakety (DHCP) z R64.
Restartování rozhraní pomáhá:
ifdown br0; sleep 30; ifup br0Ovladač je nový, kernel ještě nebyl přijat, doufám, že čínský Landen Chao .
Zdroj: www.habr.com
