Banana Pi 64 je računalnik z eno ploščo, podoben Raspberry Pi, vendar z več ethernetnimi vrati, zaradi česar je distribucijski usmerjevalnik Linuxa za splošne namene.

Da, obstaja Openwrt, vendar ima svoje posebnosti, svoj grafični uporabniški vmesnik in vmesnik ukazne vrstice; obstaja Mikrotik, vendar ima spet svoj grafični uporabniški vmesnik/vmesnik ukazne vrstice in Wireguard Ne deluje takoj po namestitvi ... V bistvu si želim usmerjevalnik s prilagodljivimi nastavitvami, hkrati pa ostajam v okviru standardnega Linuxa, s katerim delam vsak dan.
V članku pod imeni BPI, R64, single-board, bom mislil isto stvar - Banana Pi R64 single-board.
Izbira slike. Prenos prek eMMC
Prva veščina, ki jo pridobimo pri delu na splošno in še posebej pri R64 pomeni, da se morate naučiti, kako vanj naložiti operacijski sistem in biti sposoben komunicirati z njim, ker R64 nima priključka za monitor (HDMI, na primer). Ko je vse padlo - Wifi je prenehal delovati, omrežje Ethernet, Bluetooth, USB itd. obstaja UART, prek katerega vmesnika lahko vedno vidite, kaj je šlo narobe, in po potrebi zaženete nekaj ukazov s konzole.
Algoritem povezave z R64 preko USB-UART:
- pojdite v trgovino z radijskimi deli po kabel USB-UART (PL2303, Serial-to-USB)
- en konec USB povežemo z računalnikom, drugi, UART, pa na R64, s tremi od štirih žic, kot na spodnji sliki
- v teku računalniške konzole
sudo minicom
Po tem se bo v večini primerov pojavila konzola z eno ploščo = uspeh.
Vidite lahko več .

Nato je najlažji način naložiti operacijski sistem s kartice SD: prenesite s sliko in jo naložite:
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=noxfervstavimo kartico v režo R64 SD, jo vklopimo, opazujemo nalaganje najprej uboot na povezani konzoli, nato standardni zagon Linuxa.
Alternativna možnost zagona je uporaba kartice 64 Gb, ki je že vgrajena v R8, imenovane eMMC. Po navodilih na wikiju sliko prepišemo v napravo
/dev/mmcblk0 v BPI, znova zaženite, odstranite kartico SD, ponovno omogočite BPI ... in ne deluje. Kako priti do tja Boot select ne vztrajaj.
Dejstvo je, da morate vsaj za BPI nastaviti posebno zastavico, da se lahko zaženete z notranjega bliskovnega pogona:
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]Nato morate vnaprejšnji nalagalnik napisati na posebno zagonsko particijo
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Proizvajalec R64 (Kitajska) je objavil to dvojiško datoteko . Kaj počne, ni znano (ni izvornih kod), a brez njega tudi ne bo šlo.
Na splošno se po tem slike začnejo nalagati iz eMMC. Če želite to ugotoviti in ustvariti slike iz nič, morate za oba primera (SD / eMMC) napisati še nekaj datotek (prednalagalnik za kartico SD, ATF, u-boot), samo da pridete do jedra škorenj. Ta tema je še vedno , ampak za nas je glavno, da deluje in je v redu.
Zdaj, če sem iskren, ne uporabljam prenosa eMMC, SD kartice so dovolj, vendar sem porabil kar nekaj časa, da je delovalo, tako da naj bo v članku.
Izbira operacijskega sistema. Armbian
Prva praktična naloga je seveda zagon VPN-ja WireguardTakoj sem ugotovil, da jedro ni bilo pravilno prevedeno in da ni bilo nobenih glav. Ponovno sem sestavil jedro in, kot je to v moji navadi pri x86, zgradil modul jedra z uporabo DKMS. Vendar je bila hitrost gradnje na ARM64, tudi za majhne pripomočke, neprijetno presenetljiva. Nato je bil potreben še en modul jedra in tako naprej. V bistvu se je izkazalo, da je vse, kar je povezano z jedrom, najbolje prevesti na razcapanem prenosniku x86, nato pa preprosto kopirati in prilepiti v ARM64, ponovno zagnati in preizkusiti.
Del z uporabnostjo prostora je druga stvar. V mojem primeru je izbira Debian, vse za arhitekturo arm64 je že v paketih.debian.org in ni treba ničesar prevajati.
Da ne bi izdelal še enega kolesa, sem na BPI R64.
Ali bolje rečeno: del uporabniškega prostora je Armbian, jedro pa je vzeto iz repozitorija -A. Najnovejšo sliko lahko prenesete .
Vse aktivnosti na razvoju programskega dela R64 potekajo naprej Na splošno se proizvajalec sam trudi popularizirati usmerjevalnik za OpenWrt, a zahvaljujoč dejavnosti razvijalca Franka iz Nemčije se vse funkcije hitro znajdejo v jedru. Debian-a. Presenetljivo je, da je Frank aktiven v vsaki temi foruma.
Organizacija delovnega prostora: žice
Ločeno vam želim povedati, kako postaviti SBC (ne samo BPI) na mizo med razvojem / testiranjem, da ne bi do njega vodili ethernetnega kabla iz internetnega vira skozi celotno sobo / pisarno. Dejstvo je, da je treba po eni strani železju zagotoviti internet, po drugi strani pa se lahko v tem železu vse pokvari, še posebej Wifi.
Najprej sem se odločil kupiti poceni USB-Wifi "piščalko", jo vtakniti v edini port na BPI in pozabiti na žice. Da bi to naredil, sem kupil poceni TP-LINK TL-WN725N USB 2.0, vendar je zelo kmalu postalo jasno, da ne bo vzletel: za delovanje piščalke je bil potreben gonilnik jedra, ki ga seveda ni bilo (kasneje sem prevedel potreben gonilnik RTL8XXXU, vendar je še vedno nepraktičen). In ethernet kabel je za nekaj časa pokvaril pogled na sobo.
Posledično sem se s pomočjo Tenda MW3 (Wifi mesh system) uspel znebiti kabla: eno kocko sem preprosto položil pod mizo in z meter Ethernet kablom povezal BPI na LAN priključek slednjega. Uspeh.
Wireguard, RKN, Ptica
Ena od stvari, za katere uporabljam Banana PI, je prost dostop do spletnih mest, ki jih blokira zlasti RKN, tako da Telegram in klici v Slack delujejo. Članki na to temo so bili že predlagani na Habréju: , , .
Implementiral sem samo takšno rešitev z uporabo Ansible: .
Predpostavlja se, da VPS deluje pod Ubuntu 18.04. aprila. Funkcionalnost sem preizkusil pri dveh ponudnikih gostovanja v Evropi: Amazon in Digital Ocean.
Torej, zgornji Armbian smo namestili na R64, na voljo je prek ssh pod imenom hm-bananapi-1 in ima dostop do interneta. Razmestimo zaporedno ansible, avtomatizacijske skripte in izvedemo samo namestitev 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-1Nato morate naš VPN namestiti v VPS na enak način:
ansible-playbook ./router.py -l current-vpnTukaj je argument vedno trenutni-vpn, samo ime VPS pa je konfigurirano v spremenljivki (v tem primeru 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-1Oh ja, pred vsemi temi operacijami morate ustvariti skrivnosti (zlasti ključe) Wireguard) v mapo ./secrets, mora imenik izgledati takole .
Ansible avtomatizacija v Pythonu
Morda boste opazili, da so namesto v formatu YAML ukazi Ansible kodirani v skriptih Python. Za primerjavo, kako omogočiti ptičji demon na običajen način:
- name: start bird
systemd:
name: bird
state: started
enabled: yesin kako isto prek Pythona:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Pisanje ukazov Ansible s kodo Python omogoča ponovno uporabo kode in na splošno so odprte vse možnosti jezika za splošno uporabo. Na primer, namestitev bird na R64 in VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")glejte funkcijsko kodo .
Ta funkcija se imenuje pybook izvajati . Za pybook še ni dokumentacije, potem bom popravil to napako.
Kaj misli o tem.
Spremljanje. Prometej
Skupaj: telegram deluje, linkedin in pornhub tudi, na splošno je uporabniška izkušnja ok. A vse se lahko zlomi, kitajski kosi železa tudi.
Posodobitve jedra so lahko tudi zanimive: na primer, želel sem posodobiti jedro 5.4 => 5.6, no, tam Wireguard Takoj po namestitvi ni bilo treba nameščati popravkov ... Komaj rečeno, storjeno: skrbno sem prenesel popravke iz 5.4 na 5.6, jedro se je zagnalo, tunel do VPS-ja pinga, vendar se Bird ne more povezati z napako "BGP Error" ... "V grozi sem se vrnil" (c) na 5.4; prehod na 5.6 je bil dodan v TODO.
Zato sem poleg namestitve usmerjevalnika in VPS-ja dodal še spremljanje (na x86 Ubuntu 18.04), ki je nameščen na ločenem gostitelju z naslednjimi komponentami:
- prometheus, alertmanager, blackbox_exporter - vse v dockerju
- opozorila so poslana na kanal telegram z uporabo bota metalmatze/alertmanager-bot - tudi v dockerju
- tor za bota, tako da lahko bot opozori situacije, ko je internet na voljo, vendar telegram še vedno ne deluje in se bot sam ne more povezati
- uporablja : NodeVPNTroubles (brez pinga do VPS), BirdVPNTroubles (ni Bird seje), AntifilterDownloadTroubles (ni uspelo naložiti blokiranih naslovov IP), SiteTroubles (nesrečen telegram ni na voljo)
- sistemska opozorila, kot je HostGrowingDiskReadLatency (poceni kartica SD se preneha brati)
Primer nastavitve spremljanja:
ansible-playbook ./monitoring.py -l monitoring-preprodSamodejno odkrivanje za prometheus je nastavljeno na mapo /etc/prometheus/auto_http, kar je primer dodajanja gostitelja v nadzor (gostitelji niso privzeto nadzorovani):
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
EOFOPRAVILO: 2 ponudnika, 2 BPI-ja, preklop po poljubni oddaji
Poleg vsega sem načrtoval povezavo z dvema ponudnikoma, da bi internet deloval naprej, tudi če bi imel en ponudnik težave z omrežjem, ali bi pozabil plačati internet itd., ter drugi človeški faktorji.
Opisana je najnaprednejša uporabniška izkušnja na temo multi-wan za sistem Mwan3 pod Openwrt. Ta rešitev ima bogato funkcionalnost, vendar je nastavitev in delovanje na splošno za multi-wan precej težavno. Samo en primer: če pridete na nekatera spletna mesta z dveh naslovov IP hkrati, potem jim to morda ne bo všeč, prenehale bodo delovati => "internet ne deluje."
Glede na to izkušnjo sem se odločil, da multihoming še ni prioriteta, ampak samo failover. Čeprav se zdi, da bi moralo v najnovejših različicah linuxa vse delovati z enim ukazom, kot je:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Torej, da ni ene same točke napake, vzamemo 2 BPI-ja, vsakega povežemo z enim ponudnikom, ju povežemo skupaj in vzpostavimo medsebojno komunikacijo z dinamičnim usmerjanjem prek bird / OSPF.
Nadalje na vsakem objavimo isti naslov IP, če je storitev na voljo (internet, DNS). To pomeni, da privzete poti ne bomo določili sami, ampak prek ptice. Rešitev vohunila .
Ta funkcionalnost še ni implementirana, zahrbten koronavirus je zamočil (ni prišlo vse iz aliexpressa; druga spletna trgovina Layta je obljubila dobavo v enem tednu, minil pa je že več kot mesec dni; drugemu ponudniku ni uspelo raztegniti kabel pred karanteno, uspel le narediti luknjo v steni, da bi izvrtal kabel).
Kako naročiti R64
Sama plošča v uradni trgovini .
Prav tako je bolje naročiti takoj:
- + obveščajte standard vtiča EU ali ZDA
- toplotno telo: radiatorji/ventilatorji; ker se segrejeta tako CPU kot stikalni čip
- wifi antena,
Obstaja odtenek - cena dostave je v uradni trgovini nekaj časa postala neustrezno visoka. Vodja Judy Huang mi je zagotovila, da ni pomote, in da lahko izberete ePacket za 5 $, vendar sem videl, da je za Rusijo samo EMS za >33 $. Neprijetno, a ne kritično. Poleg tega, če izberete katero koli drugo državo za dostavo (šel sem skozi vse celine), bo dostava stala ~5$. Rusofobi?.. Potem pa sem ugotovil, da je tudi za Francijo cena dostave ~30$, in se pomiril.
Posledično je Judy ponudila, da odda naročilo, vendar ne plača (namig: dajte manj na kartico, da plačilo ne poteka samodejno); piši ji pa ti bo znižala ceno pošiljanja na običajno. Uspeh.
Vprašanja
Vse še ne deluje popolno.
Produktivnost
Ansible=ukazi Python se izvajajo počasi, tudi tisti v mirovanju, 20-30 sekund; red velikosti dlje kot pri prenosniku x86. Poleg tega se sprva izvajajo precej hitro, ~ 3 sekunde, nato pa se močno upočasnijo. Morda je to posledica segrevanja procesorja (dušenje). Koda Go je tudi dolgotrajna:
# запрос метрик для прометея из 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 deluje, vendar se na Armbianu ustavi po približno enem dnevu, piš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
...Samo ponovni zagon pomaga. Moramo iti dlje .
Ethernet
Ethernet deluje, vendar po ~ enem dnevu paketi (DHCP) iz R64 prenehajo prihajati.
Ponovni zagon vmesnika pomaga:
ifdown br0; sleep 30; ifup br0Driver je nov, jedro še ni bilo sprejeto, upam, da kitajski Landen Chao .
Vir: www.habr.com
