Banana Pi 64 on üheplatvormne arvuti, mis sarnaneb Raspberry Pi-le, kuid millel on mitu Etherneti porti, võimaldades luua sellest marsruuteri üldotstarbelise Linuх'i jaotuse põhjal.

Jah, OpenWrt on juba saadaval, kuid sellel on oma eripärad – oma GUI ja CLI; on olemas Mikrotik, kuid sellel on jälle oma GUI/CLI, ja Wireguard ei tööta kohe välja… Ühesõnaga, soovin marsruuteri, millel on paindlikud seadistused, jäädes samas tavalise Linuxi piiridesse, millega iga päev töötan.
Mõisted BPI, R64 ja üheplatvormne viitavad samale asjale – nimelt Banana Pi R64-le.
Pildi valimine. Laadimine eMMC kaudu.
Esimene oskus, mida tuleb omandada R64-ga töötades, on oskus operatsioonisüsteemi üles laadida ja sellega suhelda, kuna R64-l puudub monitori port (näiteks HDMI). Kui kõik peatub – Wifi, Ethernet, Bluetooth, USB ja muud ei tööta, on olemas UART, mille kaudu saab alati vaadata, mis valesti läks, ja vajadusel käivitada paar käsku konsoolis. Juhised R64-le USB-UART kaudu ühendamiseks:
kiiresti poodi raadiokomponente USB-UART kaabli järele (PL2303, Serial-to-USB)
- ühenda üks USB-ots arvutiga ja teine, UART, R64-ga, kolme juhtmega neljast, nagu pildil allpool.
- konsoolis käivitame
- sudo minicom
Pärast seda ilmub enamasti üheplatvormi konsool = edu.
Rohkem teavet saab vaadata
Edasi, kõige lihtsam on laadida operatsioonisüsteem SD-kaardilt: allalaadime .

pildi ja laadime selle: 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=noxfer
sisesta kaart R64 SD-pessa, lülita sisse ja jälgi ühendatud konsoolist esmalt uboot'i, seejärel standardset Linuxi laadimist.Alternatiivne laadimisvõimalus – juba R64-sse ehitatud 8Gb mälukaardi, mida nimetatakse eMMC, abil. Juhiste kohaselt kirjuta pilt seadmele
Boot valik
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Ärge tõmmake. Asi on selles, et vähemalt BPI jaoks tuleb seadistada spetsiaalne lipp, et saaks korralikult käivitada sisemiselt mälult:
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]
Järgmine samm on kirjutada eellaadija boot-sektori.Järgmine peate kirjutama eellaadija spetsiaalsesse boot-segmenti.
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Tootja R64 (Hiina) on avaldanud selle binaari . Mida see teeb, pole teada (allikaid pole), kuid ilma selleta ei saa see samuti tööle.
Ühesõnaga, pärast seda hakkavad pildid laadima ka eMMC-st. Kui aga soovida süveneda ja luua pilte nullist, siis mõlema juhtumi (SD/eMMC) jaoks tuleb salvestada veel mõned failid (preloader SD-kaardile, ATF, u-boot), et jõuda juba kernelini. See teema on endiselt , kuid meie jaoks on peamine, et see töötab ja on kõik.
Praegu ma eMMC kaudu käivitamist ausalt öeldes ei kasuta, SD-kaardid on piisavad, aga ma olen kulutanud sellele, et see tööle hakkaks, seega las jääb artiklisse.
Operatsioonisüsteemi valik. Armbian
Esimene praktiline ülesanne — käivitada VPN, loomulikult Wireguard. Koheselt selgus, et tuuma poolelt ei ole see kokku pandud ja pea ei ole. Taaskompileerisin tuuma ja, nagu x86 puhul, panin tuumamooduli kokku DKMS-i abil. Siiski valmistus mind üllatama arm64 väikeste utiliitide kokkupaneku kiirus. Edasi tuli veel üks tuumamoodul, jne. Ühesõnaga, välja tuleb, et kõik, mis puututab tuuma, on parem kokku panna soojal-lampal x86 sülearvutis, seejärel lihtsalt kopeerida R64-le, taaskäivitada ja testida.
Teine asi on userspace'i osa. Minu puhul, valides Debian, on kõik arm64 arhitektuuri jaoks juba olemas packages.debian.org ja midagi pole vaja uuesti kokku panna.
Kuna ma ei soovi luua uut jalgratast, siis BPI R64-l.
Tõigemini nii: userspace'i osa — Armbian, ja tuum saadakse Franki repolt Kogu R64 tarkvaraarenduse aktiivsus toimub .
. Üldiselt püüab tootja populariseerida ruuteri Openwrt all, kuid tänu Saksamaa arendaja Franki aktiivsusele jõuavad kõik funktsioonid kiiresti Debian'i tuuma. Üllatav, kuid Frank on aktiivne igas foorumi haru. Töökeskkonna korraldamine: kaablid
Eraldi tahan rääkida, kuidas arendamise/testimise käigus paigutada SBC (mitte ainult BPI) laua peale nii, et ei peaks Interneti allikast kogu toa/ruumi kaudu Ethernet-kaabli tõmbama. Asi on selles, et ühelt poolt tuleb seadmele internetti tagada, samas aga võib selles samas seadmes kõik katki minna ja eelkõige Wifi.
Отдельно хочу рассказать, как во время разработки/тестирования разместить SBC (не только BPI) на столе так, чтоб не вести Ethernet-кабель к нему от источника интернета через всю комнату/офис. Дело в том, что с одной стороны нужно обеспечить железке интернет, а с другой стороны в этой самой железке может все ломаться, и в первую очередь Wifi.
Esialgu otsustasin osta odava USB-Wifi "pingviini", ühendada see BPI ainusesse porti ja unustada kaablid. Selleks ostsin odava TP-LINK TL-WN725N USB 2.0, kuid varsti selgus, et see ei tööta: pingviini jaoks oli vajalik tuuma draiver, mida seal loomulikult ei olnud (hiljem kogusin vajaliku RTL8XXXU draiveri, kuid siiski ei olnud see praktiline). Ja Etherneti kaabel rikkus toa välimust mõneks ajaks.
Lõpuks sain kaablitest lahti Tenda MW3 (Wifi mesh-süsteem) abil: lihtsalt paigaldasin ühe kuubiku laua alla ja meetrise Etherneti kaabliga ühendasin BPI viimase LAN-porti. Edu.
Wireguard, RKN, Bird
Üks minu soove selle Banana PI kasutamise jaoks on saada vaba ligipääs RKN-i blokeeritud saitidele, eelkõige, et Telegram ja Slack kõned töötaksid. Sellel teemal on juba kirjutatud artikleid Habr-s: , , .
Selle konkreetse lahenduse rakendamise tegin Ansible'i abil: .
Eeldatakse, et VPS töötab Ubuntu 18.04 all. Tõestasin toimivust kahel Euroopa hostimisplatvormil: Amazon ja Digital Ocean.
Nii et installisime ülaltoodud Armbiani R64-le, see on saadaval ssh all nimega hm-bananapi-1 ja on internetti ühendatud. Järk-järgult rakendame ansible, automatiseerimis skripte ja käivitame installatsiooni R64-l:
# зависимости для 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-1Seejärel tuleb sarnaselt VPS-is meie VPN-i deployida:
ansible-playbook .\/router.py -l current-vpnSiin on argument alati current-vpn, kuid VPS nimi seadistatakse muutuja kaudu (antud juhul on see 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-1Ahjaa, enne neid toiminguid tuleb genererida saladused (eriti Wireguardi võtmed) kausta .\/secrets, kataloog peaks välja nägema .
Ansible automatiseerimine Pythonis
Võib märkida, et YAML formaadi asemel on Ansible'i käsud kodeeritud Python skriptidesse. Võrdluseks, kuidas tavapärasel viisil käivitada bird deemon:
- name: start bird
systemd:
name: bird
state: started
enabled: yesja kuidas sama asi Pythonis:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Ansible'i käskude salvestamine Python koodina võimaldab koodi uuesti kasutada ja avab kindlasti kõik üldotstarbelise keele võimalused. Näiteks birdi installimine R64 ja VPS:
install_bird("router\/bird.conf.j2")
install_bird("vpn\/bird.conf.j2")vaata funktsiooni koodi .
See funktsioon, mille nimi on pybook rakendatud Dokumentatsiooni pybooki kohta pole veel, hiljem parandatakse see puudus.
Mida arvab selle kohta.
Monitooring. Prometheus
Kokkuvõtteks: telegramm töötab, linkedin ja pornhub ka, üldiselt kasutajakogemus – okei. Aga kõik võib katki minna ja Hiina riistvara ka.
Kernete värskendused on ka huvitavad: näiteks tahtsin värskendada kernet 5.4 => 5.6, noh, seal on ju Wireguard kasti sees, ei pea patchima… Öeldud-tehtud: hoolikalt kandsin patchid 5.4 pealt 5.6 peale, kerned käivitusid, tunnel VPS-ni pingitakse, aga bird ei saa ühendust veaga "BGP Error"… "Hirmuga tagasilangemine" (c) 5.4-le; üleminek 5.6-le lükatud TODO-sse.
Seetõttu lisasin roteri ja VPS-i paigaldamisele monitooringu (x86 Ubuntu 18.04 peal), mis installitakse eraldi hostile järgmiste komponentidega:
- prometheus, alertmanager, blackbox_exporter – kõik dockeris
- alerte saadetakse telegrammikanalisse botiga metalmatze/alertmanager-bot – samuti dockeris
- tor botile, et bot saaks teavitada olukordadest, kui internet on olemas, aga telegramm ei tööta ja bot ei saa ühendust
- rakenduslikud : NodeVPNTroubles (pole pingit VPS-iga), BirdVPNTroubles (pole Bird sessiooni), AntifilterDownloadTroubles (vea laadimine blokeeritud IP-aadressidega), SiteTroubles (karm телеграм не доступен)
- süsteemi alerte, näiteks, HostGrowingDiskReadLatency (odav SD-kaart lõpetab lugemise)
Monitooringu installimise näide:
ansible-playbook ./monitoring.py -l monitoring-preprodPrometheuse Auto Discovery on seadistatud katalooge /etc/prometheus/auto_http, näide hosti lisamisest monitooringusse (vaikimisi ei jälgita hoste):
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 pakkujat, 2 BPI, anycast failover
Kõigele lisaks plaanisin ühendada kaks teenusepakkujat, et internet jätkuks, isegi kui ühel pakkujal on võrguga probleeme, või kui on unustatud interneti eest maksta jne, ja muud inimfaktorid.
Kõige arenenum kasutajakogemus multi-wan teemal on kirjeldatud süsteemi Mwan3 all Openwrt. Selle lahenduse funktsionaalsus on rikkalik, kuid seadistamine ja kasutamine on multi-wan puhul üsna vaevaline. Ainult ühe näitena: kui minna mõnele veebilehele korraga kahest IP-aadressist, siis võib see neile mitte meeldida, nad lõpetavad töötamise => "internet ei tööta".
Arvestades seda kogemust, otsustasin, et multihoming ei ole hetkel prioriteet, vaid ainult failover. Kuigi tundub, et viimastes linuxi versioonides peaks kõik töötama ühe käsuga, nagu:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Nii et, et ei tekiks ühtegi tõrkepunkti, võtame kaks BPI-d, igaühe ühendame ühe teenusepakkujaga, need omavahel ühendame ja teeme dünaamilise marsruutimise bird/OSPF kaudu.
Edasi, anname igal juhul teada sama IP-aadressi juhul, kui teenus on saadaval (interneti, DNS). See tähendab, et me ei sea vaikimisi marsruuti ise, vaid teeme seda birdi kaudu. Lahendust vaatasin .
Seda funktsionaalsust pole ma veel rakendanud, salakaval koronaviirus segas asja (kõik ei jõudnud aliexpressist; teine internetipood, Layta, lubas ühe nädalaga kohale toimetada, aga nüüd on juba üle kuu aega möödas; teine teenusepakkuja ei jõudnud kaablit enne karantiini vedada, jõudis vaid seina augu puurida).
Kuidas tellida R64
Ise plaat ametlikust poest .
Samuti on parem kohe tellida:
- + teata Euroopa või Ameerika Ühendriikide pistiku standardist
- soojuse äravool: radiaatorid/ventilaatorid; sest nii CPU kui ka lüliti kiip kuumeneb
- antenni wifi jaoks,
On üks nüanss — alates mingist ajast on ametlikus poes saatmiskulu muutunud ebamugavalt kõrgeks. Halduse töötaja Judy Huang kinnitas mulle, et viga pole, ja võin valida ePacketi $5 eest, kuid ma nägin, et Venemaale on saadaval ainult EMS >33$ eest. Ebameeldiv, aga mitte kriitiline. Lisaks, kui valida mis tahes muu riik (katsusin kõik kontinendid), on saatmine ~5$. Venemaa vastased?.. Aga siis leidsin, et ka Prantsusmaale on saatmiskulu umbes 30$, ja rahunesin.
Kokkuvõttes pakkus Judy tellimust teha, kuid mitte maksta (hint: laadida kaardile vähem, et automaatne makse ei läheks); kirjutage talle, ja ta alandab saatmiskulu normaalseks. Õnnestus.
Probleemid
Kaugel pole kõik veel ideaalne.
Tõhusus
Ansible=Python käsud kestavad aeglaselt, isegi tühjad, 20-30 sekundit; oluliselt kauem kui x86 sülearvutil. Esialgu saavad need päris kiiresti tehtud, ~3 sekundit, seejärel aeglustuvad järsult. Võib-olla juhtub see kuumeneva CPU tõttu (throttling). Go-kood töötab samuti kaua:
# запрос метрик для прометея из 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 töötab, kuid Armbianis lakkab ta kuskil tunni jooksul toimimast, kirjutab:
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
...A restart only helps. We need to investigate further .
Ethernet
Ethernet works, but after about a day, the packets (DHCP) from R64 stop coming.
Restarting the interface helps:
ifdown br0; sleep 30; ifup br0The driver is new, it hasn't been accepted into the kernel yet, I hope the Chinese developer Landen Chao .
Allikas: habr.com
