Banana Pi 64 je jednopločni računar sličan Raspberry Pi-u, ali sa nekoliko Ethernet portova, što omogućava da se pretvori u ruter baziran na Linux distribuciji opšte namene.
Da, već postoji Openwrt, ali on ima svoje probleme, svoj GUI i CLI; Postoji Mikrotik, ali opet ima svoj GUI/CLI, a Wireguard ne radi iz kutije... Općenito, želim ruter sa fleksibilnim postavkama, a da ostanem u okviru standardnog Linuxa koji radiš sa svakim danom.
U članku pod nazivima BPI, R64, single-board, mislit ću na istu stvar - samu Banana Pi R64 single-board.
Odabir slike. Preuzmite putem eMMC-a
Prva vještina koju trebate steći kada radite SBC generalno, a posebno sa R64, ovo znači naučiti kako da učitate operativni sistem u njega i da budete u mogućnosti da komunicirate sa njim, jer R64 nema port za monitor (HDMI, na primer). Kada je sve otpalo - Wifi,Eternet,Bluetooth,USB itd.. Tu je UART preko čijeg interfejsa uvek možete videti šta je pošlo po zlu, a takođe i pokrenuti par komandi sa konzole ako je potrebno.
Algoritam za povezivanje na R64 preko USB-UART-a:
trčimo u prodavnicu radio dijelova po USB-UART kabel (PL2303, Serial-to-USB)
povežite jedan USB kraj na računar, a drugi, UART, na R64, sa tri od četiri žice, kao na slici ispod
pokrenuti u konzoli računara sudo minicom
Nakon toga, u većini slučajeva će se pojaviti konzola sa jednom pločom = uspjeh.
Možete vidjeti više detalja ovdje.
Zatim, najlakši način je da učitate operativni sistem sa SD kartice: preuzmite do link sliku i ispunite je:
Ubacimo karticu u R64 SD slot, uključimo je i posmatramo kako se povezana konzola učitava prvo uboot, a zatim standardno Linux učitavanje.
Alternativna opcija pokretanja je korištenje kartice od 64Gb koja je već ugrađena u R8, nazvana eMMC. Prema uputama na wikiju, kopiramo sliku na uređaj
/dev/mmcblk0 na BPI, restartujte, uklonite SD karticu, ponovo uključite BPI... i ne radi. Kako ići naprijed-nazad Boot select ne trudi se.
Činjenica je da barem za BPI morate postaviti posebnu zastavicu da biste mogli pokrenuti s internog fleš diska:
Proizvođač R64 (Kina) objavio je ovu binarnu datoteku ovdje. Šta radi nije poznato (nema izvornih kodova), ali ni bez njega neće raditi.
Općenito, nakon toga, slike počinju da se učitavaju iz eMMC-a. Ako želite to shvatiti i kreirati slike od nule, onda za oba slučaja (SD/eMMC) trebate napisati još nekoliko fajlova (preloader za SD karticu, ATF, u-boot) samo da biste došli do učitavanja kernela. Ova tema je i dalje se razvija, ali nama je glavno da radi i da je u redu.
Sada preuzimam preko eMMC-a, da budem iskren, ne koristim ga, dovoljna je SD kartica, ali sam dosta vremena potrošio na to da je proradim, pa neka bude u članku.
Odabir operativnog sistema. Armbian
Prvi zadatak aplikacije je pokretanje VPN-a, naravno Wireguarda. Odmah je otkriveno da na strani kernela nije sastavljen i da nema zaglavlja. Ponovo sam napravio kernel i, kao što je moja navika sa x86, sastavio sam kernel modul koristeći DKMS. Međutim, brzina izgradnje čak i malih komunalnih programa na arm64 me je neugodno iznenadila. A onda je bio potreban još jedan modul kernela, itd. Općenito, ispada da je sve što se tiče kernela najbolje sklopiti na toplom x86 laptopu, zatim prenijeti na R64 jednostavnim kopiranjem, ponovo pokrenuti i testirati.
Druga stvar je dio korisničkog prostora. U mom slučaju odabira Debiana, sve za arm64 arhitekturu je već na packages.debian.org i nema potrebe da se bilo što obnavlja.
Da ne bi proizveo još jedan bicikl, I portedArmbijski na BPI R64.
Ili bolje rečeno, ovo: dio korisničkog prostora je Armbian, a kernel je preuzet iz spremišta Frank-A. Najnovija slika se može preuzeti ovdje.
Sve aktivnosti na razvoju softverskog dijela R64 se odvijaju na forum. Općenito govoreći, sam proizvođač nastoji popularizirati ruter za Openwrt, ali zahvaljujući aktivnosti programera Franka iz Njemačke, sve karakteristike brzo završe u kernelu za Debian. Iznenađujuće, Frank je aktivan u svim temama foruma.
Organizacija radnog prostora: žice
Odvojeno, želeo bih da vam kažem kako, tokom razvoja/testiranja, postavite SBC (ne samo BPI) na sto kako ne biste vodili Ethernet kabl do njega sa Internet izvora preko cele sobe/kancelarije. Činjenica je da, s jedne strane, trebate obezbijediti dio hardvera sa internetom, ali s druge strane može se pokvariti sve u tom hardveru, a prije svega Wifi.
Prvo sam odlučio da kupim jeftinu USB-Wifi „zviždaljku“, uključim je u jedini port na BPI i zaboravim na žice. Da bih to učinio, kupio sam jeftin TP-LINK TL-WN725N USB 2.0, ali vrlo brzo je postalo jasno da neće poletjeti: da bi zvižduk radio, potreban vam je upravljački program kernela, kojeg, naravno, nije bilo (kasnije sam sastavio potreban drajver RTL8XXXU, ali je i dalje nepraktičan). A Ethernet kabl je neko vreme pokvario izgled sobe.
Kao rezultat toga, uspio sam da se riješim kabla uz pomoć Tenda MW3 (Wifi mesh sistem): jednostavno sam stavio jednu kocku ispod stola i povezao BPI sa LAN portom potonjeg metar dugim Ethernet kablom. Uspjeh.
Wireguard, RKN, Bird
Jedna od stvari za koje želim da koristim Banana PI je da imam besplatan pristup stranicama koje je blokirao RKN, posebno kako bi Telegram i Slack pozivi mogli raditi. Na ovu temu su već predloženi članci na Habréu: puta, два, tri.
Ja sam implementirao upravo ovo rješenje koristeći Ansible: link.
Pretpostavlja se da VPS koristi Ubuntu 18.04. Provjerio sam funkcionalnost na dva hostera u Evropi: Amazon i Digital Ocean.
Dakle, instalirali smo gornji Armbian na R64, dostupan je preko ssh-a pod imenom hm-bananapi-1 i ima pristup internetu. Dosljedno implementiramo Ansible, automatizacijske skripte i pokrećemo samu instalaciju 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
Zatim morate postaviti naš VPN na VPS na isti način:
ansible-playbook ./router.py -l current-vpn
Ovdje je argument uvijek current-vpn, a stvarno VPS ime je konfigurirano u varijabli (u ovom slučaju to je paris-vpn-aws-t2-micro-1):
Oh da, prije svih ovih operacija morate generirati tajne (posebno ključeve Wireguard) u mapu ./secrets, direktorij bi trebao izgledati tako.
Ansible Automatizacija u Pythonu
Možda ćete primijetiti da umjesto u YAML formatu, Ansible komande su kodirane u Python skriptama. Za poređenje, kako omogućiti bird daemon na uobičajen način:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
Pisanje Ansible komandi u Pythonu vam omogućava da ponovo koristite kod i općenito otvara sve mogućnosti jezika opšte namjene. Na primjer, instaliranje bird na R64 i VPS:
Ukupno: telegram radi, linkedin i pornhub također, općenito korisničko iskustvo je ok. Ali sve se može pokvariti, uključujući kineski hardver.
Ažuriranja kernela takođe mogu biti interesantna: na primer, hteo sam da ažuriram kernel 5.4 => 5.6, pa, Wireguard je tu iz kutije, nema potrebe za zakrpama... Rečeno nego urađeno: mukotrpno sam preneo zakrpe sa 5.4 do 5.6, kernel je pokrenut, tunel do VPS-a je pingovan, ali ptica ne može da se poveže sa greškom "BGP Error" ... "Vratio sam se u užasu" (c) na 5.4; Prelazak na 5.6 je odgođen u TODO.
Stoga sam, pored instaliranja rutera i VPS-a, dodao monitoring (na x86 Ubuntu 18.04), koji je instaliran na zasebnom hostu sa sljedećim komponentama:
prometheus, alertmanager, blackbox_exporter - sve u dockeru
Upozorenja se šalju na telegram kanal koristeći metalmatze/alertmanager-bot bot - također u Dockeru
tor za bota, tako da bot može upozoriti situacije kada postoji internet, ali telegram i dalje ne radi, a sam bot ne može da se poveže
primijenjeno upozorenja: NodeVPNTroubles (bez pinga za VPS), BirdVPNTroubles (bez Bird sesije), AntifilterDownloadTroubles (greška učitavanja blokiranih IP adresa), SiteTroubles (zlosretni telegram nije dostupan)
sistemska upozorenja, na primjer, HostGrowingDiskReadLatency (jeftina SD kartica postaje nečitljiva)
Automatsko otkrivanje za Prometheus je konfigurisano u folderu /etc/prometheus/auto_http, što je primer dodavanja hosta u nadgledanje (hostovi se ne nadgledaju podrazumevano):
Uz sve, planirao sam da se povežem na dva provajdera kako bi internet nastavio da radi, čak i ako jedan provajder ima problema sa mrežom, ili zaboravi da plati internet itd, i druge ljudske faktore.
Opisano je najnaprednije korisničko iskustvo na temu multi-wan ovdje za Mwan3 sistem pod Openwrt. Ovo rješenje ima bogatu funkcionalnost, ali njegovo postavljanje i korištenje općenito za višestruki wan je prilično problematično. Samo jedan primjer: ako dođete na neke stranice s dvije IP adrese odjednom, možda im se to neće svidjeti, prestat će raditi => “Internet ne radi.”
Uzimajući u obzir ovo iskustvo, odlučio sam da multihoming još nije prioritet, već samo kvar. Mada, čini se da bi u najnovijim verzijama Linuxa sve trebalo da radi sa jednom komandom kao što je:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
Dakle, da bismo izbjegli jednu tačku kvara, uzimamo 2 BPI-a, povezujemo svaki sa jednim provajderom, povezujemo ih međusobno i uspostavljamo vezu međusobno dinamičkim rutiranjem preko bird/OSPF-a.
Zatim na svakom oglašavamo istu IP adresu ako je usluga dostupna (Internet, DNS). Odnosno, nećemo sami postaviti zadanu rutu, već kroz pticu. Videla sam rešenje ovdje .
Ova funkcionalnost još nije implementirana, podmukli koronavirus je ovdje igrao trik (nije sve stiglo s Aliexpressa; druga internet trgovina, Layta, obećala je isporuku za tjedan dana, ali je prošlo više od mjesec dana; drugi provajder nije imao vremena da produžim kabl pre karantina, uspeo sam da probušim samo rupu u zidu za kabl).
Kako naručiti R64
Sama ploča se nalazi u službenoj prodavnici SinoVoip.
Takođe je bolje naručiti odmah:
Postoji nijansa - cijena dostave je već neko vrijeme postala nedovoljno visoka u službenoj trgovini. Menadžer Judy Huang me je uvjerio da nije bilo greške i da možete odabrati ePacket za 5 dolara, ali sam vidio da za Rusiju postoji samo EMS za >33 dolara. Neprijatno, ali nije kritično. Štaviše, ako odaberete bilo koju drugu zemlju za dostavu (prošao sam sve kontinente), dostava će koštati ~5$. Rusofobi?.. Ali onda sam otkrio da je i za Francusku cijena dostave ~30$ i smirio sam se.
Kao rezultat toga, Judy je ponudila da naruči, ali ne i plati (nagovještaj: stavite manje na karticu da ne bi prošlo automatsko plaćanje); pišite joj i ona će smanjiti cijenu dostave na normalnu. Uspjeh.
pitanja
Još uvijek ne funkcionira sve savršeno.
Produktivnost
Ansible=Python komande se izvršavaju sporo, čak i one u stanju mirovanja, 20-30 sekundi; red veličine duže nego na x86 laptopu. Štaviše, u početku se izvode prilično brzo, ~3 sekunde, a zatim naglo usporavaju. Ovo može biti zbog zagrijavanja CPU-a (prigušenja). Go kodu također treba dosta vremena da radi:
# запрос метрик для прометея из 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
51700
Wifi
Wifi radi, ali na Armbianu prestaje nakon otprilike jednog dana, piše: