De Banana Pi 64 is in single-board komputer fergelykber mei de Raspberry Pi, mar mei ferskate Ethernet-ports, wêrtroch it mooglik is om it te feroarjen yn in router basearre op in algemiene doel Linux-distribúsje.

Ja, der is Openwrt, mar it hat syn eigen eigenaardigheden, syn eigen GUI en CLI; der is Mikrotik, mar it hat wer syn eigen GUI/CLI, en Wireguard It wurket net út 'e doaze... Yn prinsipe wol ik in router mei fleksibele ynstellings, wylst ik binnen it ramt fan 'e standert Linux bliuw dêr't ik alle dagen mei wurkje.
Yn it artikel ûnder de nammen BPI, R64, single-board, sil ik itselde betsjutte - it Banana Pi R64 single-board sels.
Kies in ôfbylding. Download fia eMMC
De alderearste feardigens dy't jo moatte krije as jo wurkje mei yn it algemien, en mei de R64 yn it bysûnder, dit betsjut leare hoe te laden in bestjoeringssysteem yn it en kinne omgean mei it, omdat de R64 hat gjin haven foar in monitor (HDMI, bygelyks). Doe't alles foel ôf - Wifi, Ethernet, Bluetooth, USB, ensfh stopte wurkjen. D'r is in UART, troch de ynterface wêrfan jo altyd kinne sjen wat der ferkeard gie, en ek in pear kommando's útfiere fan 'e konsole, as it nedich is.
Algoritme foar ferbining mei R64 fia USB-UART:
- wy rinne nei de winkel foar radio-ûnderdielen foar in USB-UART-kabel (PL2303, Serial-to-USB)
- ferbine ien USB-ein oan 'e kompjûter, en de oare, UART, oan' e R64, mei trije fan 'e fjouwer draden, lykas yn' e foto hjirûnder
- rinne yn 'e kompjûter konsole
sudo minicom
Hjirnei sil yn de measte gefallen de single-board konsole ferskine = súkses.
Jo kinne mear details sjen .

Dêrnei is de maklikste manier om it bestjoeringssysteem fan in SD-kaart te laden: download troch ôfbylding en folje it:
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=noxferWy ynfoegje de kaart yn it R64 SD-slot, skeakelje it oan, en observearje de ferbûne konsole dy't earst uboot laden, dan standert Linux laden.
In alternatyf bootopsje brûkt in 64Gb-kaart dy't al yn 'e R8 boud is, eMMC neamd. Neffens de ynstruksjes yn 'e wiki kopiearje wy de ôfbylding nei it apparaat
/ dev / mmcblk0 to BPI, nij opstarte, fuortsmite de SD card, oansette BPI wer ... en it wurket net. Hoe om te gean hinne en wer Boot select net lestich falle.
It feit is dat jo op syn minst foar BPI in spesjale flagge moatte ynstelle om te booten fan in ynterne flash drive:
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]Folgjende, jo moatte skriuwe preloader yn in spesjale boot partition
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Fabrikant R64 (Sina) pleatste dit binêr . Wat it docht is ûnbekend (der binne gjin boarne koades), mar it sil ek net wurkje sûnder.
Yn 't algemien begjinne de ôfbyldings nei dit te laden fan eMMC. As jo it útfine wolle en ôfbyldings fanôf it begjin meitsje, dan moatte jo foar beide gefallen (SD / eMMC) ferskate mear bestannen skriuwe (preloader foar SD-kaart, ATF, u-boot) gewoan om de kernel te laden. Dit ûnderwerp is noch , mar foar ús is it wichtichste dat it wurket en goed.
No download ik fia eMMC, om earlik te wêzen, ik brûk it net, in SD-kaart is genôch, mar ik haw in protte tiid bestege om it te wurkjen, dus lit it yn it artikel wêze.
Selektearje in bestjoeringssysteem. Armbian
De earste praktyske taak is fansels om in VPN te starten WireguardIk ûntduts fuortendaliks dat de kernel net goed kompilearre wie, en dat der gjin headers wiene. Ik haw de kernel opnij boud en, lykas myn gewoante is mei x86, in kernelmodule boud mei DKMS. De bousnelheid op ARM64 wie lykwols, sels foar lytse nutsbedriuwen, ûnnoflik ferrassend. Doe wie der noch in kernelmodule nedich, en sa fierder. Yn prinsipe docht bliken dat alles wat mei de kernel te krijen hat it bêste kompilearre wurde kin op in minne x86-laptop, dan gewoan kopiearre en plakt wurde kin nei ARM64, opnij starte en testen wurde kin.
It gebrûksromte-diel is in oare saak. Yn myn gefal, de kar Debian, alles foar de arm64-arsjitektuer stiet al op pakketten.debian.org en it is net nedich om wat opnij te kompilearjen.
Om gjin oare fyts te produsearjen, haw ik op BPI R64.
Of leaver, dit: it diel fan 'e brûkersromte is Armbian, en de kearn is nommen út it repository -IN. De lêste ôfbylding kin ynladen wurde .
Alle aktiviteit op de ûntwikkeling fan de software diel fan R64 wurdt útfierd op Yn 't algemien besiket de fabrikant sels de router foar OpenWrt te popularisearjen, mar tanksij de aktiviteit fan 'e ûntwikkelder Frank út Dútslân komme alle funksjes gau yn 'e kernel telâne foar Debian-a. Ferrassend genôch is Frank aktyf yn elke forumthread.
Wurkromte organisaasje: wires
Apart wol ik jo fertelle hoe't, tidens ûntwikkeling / testen, in SBC (net allinich in BPI) op in tafel pleatse om net in Ethernet-kabel nei it te rinnen fan in ynternetboarne oer de heule keamer / kantoar. It feit is dat jo oan 'e iene kant in stik hardware moatte leverje mei ynternet, mar oan' e oare kant kin alles yn dat stik hardware brekke, en earst Wifi.
Earst besleat ik in goedkeap USB-Wifi "fluit" te keapjen, plug it yn 'e ienige haven op' e BPI en ferjit oer de draden. Om dit te dwaan, kocht ik in goedkeape TP-LINK TL-WN725N USB 2.0, mar al gau waard dúdlik dat it net fuort soe: om it fluitjen te wurkjen, hawwe jo in kernel-bestjoerder nedich, dy't der fansels net wie (letter haw ik de nedige RTL8XXXU-bestjoerder gearstald, mar it is noch altyd ûnpraktysk). En de Ethernet-kabel bedoarn it uterlik fan 'e keamer in skoft.
As gefolch, ik slagge te ûntdwaan fan 'e kabel mei help fan Tenda MW3 (Wifi mesh systeem): Ik pleatste gewoan ien kubus ûnder de tafel en ferbûn de BPI oan de lêste syn LAN haven mei in meter-lange Ethernet kabel. Sukses.
Wireguard, RKN, Fûgel
Ien fan 'e dingen wêr't ik Banana PI foar brûke wol is fergees tagong te hawwen ta siden blokkearre troch RKN, benammen, sadat Telegram- en Slack-oproppen kinne wurkje. Artikels oer Habré binne al foarsteld oer dit ûnderwerp: , , .
Ik haw krekt dizze oplossing ynset mei Ansible: .
Der wurdt fan útgien dat de VPS ûnder rint Ubuntu 18.04 april. Ik haw de funksjonaliteit op twa hostingproviders yn Jeropa testen: Amazon en Digital Ocean.
Dat, wy hawwe de boppesteande Armbian ynstalleare op R64, it is tagonklik fia ssh ûnder de namme hm-bananapi-1 en hat ynternet tagong. Wy ynsette konsekwint Ansible, automatisearring skripts en lansearje de ynstallaasje sels op 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-1Folgjende moatte jo ús VPN op deselde manier ynsette nei de VPS:
ansible-playbook ./router.py -l current-vpnHjir is it argumint altyd aktueel-vpn, en de eigentlike VPS-namme is konfigureare yn in fariabele (yn dit gefal is it 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, foar al dizze operaasjes moatte jo geheimen generearje (yn it bysûnder kaaien) Wireguard) nei de map ./secrets, de map moat der útsjen .
Ansible Automatisearring yn Python
Jo kinne merke dat ynstee fan yn YAML-formaat te wêzen, binne de Ansible-kommando's kodearre yn Python-skripts. Foar fergeliking, hoe kinne jo de fûgeldaemon ynskeakelje op 'e gewoane manier:
- name: start bird
systemd:
name: bird
state: started
enabled: yesen hoe te dwaan itselde fia Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")It skriuwen fan Ansible kommando's yn Python lit jo de koade opnij brûke, en iepenet yn 't algemien alle mooglikheden fan' e algemiene doeltaal. Bygelyks, ynstallaasje fan fûgel op R64 en VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")sjoch de funksje koade .
Dizze funksje neamd pybook útfierd . D'r is noch gjin dokumintaasje oer pybook, mar ik sil dit probleem letter oplosse.
Wat tinkt er oer dit.
Monitoring. Prometheus
Totaal: telegram wurket, linkedin en pornhub ek, yn 't algemien is de brûkersûnderfining ok. Mar alles kin brekke, ynklusyf Sineeske hardware.
Kernel-updates kinne ek nijsgjirrich wêze: bygelyks, ik woe kernel 5.4 => 5.6 bywurkje, no, dêr Wireguard Ut 'e doaze, gjin needsaak om te patchen... Sa gau as dien: ik haw mei soarch patches oerdroegen fan 5.4 nei 5.6, de kernel is opstart, de tunnel nei de VPS pings, mar Bird kin gjin ferbining meitsje mei de flater "BGP Error"... "Yn skrik haw ik weromrolle" (c) nei 5.4; de oerstap nei 5.6 is yn TODO set.
Dêrom haw ik, neist it ynstallearjen fan 'e router en VPS, monitoring tafoege (op x86 Ubuntu 18.04), dy't ynstalleare is op in aparte host mei de folgjende komponinten:
- prometheus, alertmanager, blackbox_exporter - allegear yn docker
- Alerts wurde stjoerd nei it telegramkanaal mei de metalmatze/alertmanager-bot bot - ek yn Docker
- tor foar de bot, sadat de bot situaasjes kin warskôgje as d'r ynternet is, mar Telegram wurket noch altyd net, en de bot sels kin net ferbine
- tapast : NodeVPNTroubles (gjin ping nei VPS), BirdVPNTroubles (gjin Bird-sesje), AntifilterDownloadTroubles (flater by it laden fan blokkearre IP-adressen), SiteTroubles (ûnbedoeld telegram is net beskikber)
- systeem warskôgings, bygelyks, HostGrowingDiskReadLatency (goedkeape SD-kaart wurdt net lêsber)
Foarbyld fan tafersjoch ynstallaasje:
ansible-playbook ./monitoring.py -l monitoring-preprodAuto Discovery foar Prometheus is konfigurearre yn 'e map /etc/prometheus/auto_http, in foarbyld fan it tafoegjen fan in host foar tafersjoch (hosts wurde standert net kontrolearre):
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 providers, 2 BPI, anycast failover
Neist alles wie ik fan plan om te ferbinen mei twa providers sadat it ynternet soe bliuwe wurkjen, sels as ien provider hie problemen mei it netwurk, of se fergeat te beteljen foar it ynternet, ensfh, en oare minsklike faktoaren.
De meast avansearre brûkersûnderfining oer it ûnderwerp fan multi-wan wurdt beskreaun foar it Mwan3-systeem ûnder Openwrt. Dizze oplossing hat rike funksjonaliteit, mar it ynstellen en operearjen fan it yn 't algemien foar multi-wan is frij lestich. Krekt ien foarbyld: as jo op guon siden komme fan twa IP-adressen tagelyk, sille se it miskien net leuk fine, se stopje mei wurkjen => "It ynternet wurket net."
Mei dizze ûnderfining yn 'e rekken, besleat ik dat multihoming noch gjin prioriteit is, allinich failover. Hoewol, it liket derop dat yn 'e lêste ferzjes fan Linux alles moat wurkje mei ien kommando lykas:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Dat, om in inkeld punt fan mislearring te foarkommen, nimme wy 2 BPI's, ferbine elk mei ien provider, ferbine se mei elkoar en meitsje de ferbining mei elkoar dynamyske routing fia fûgel / OSPF.
Dêrnei advertearje wy itselde IP-adres op elk as de tsjinst beskikber is (ynternet, DNS). Dat is, wy sille de standertrûte net sels ynstelle, mar troch fûgel. Ik bispiede de oplossing .
Dizze funksjonaliteit is noch net ymplementearre, it ferrifeljende coronavirus spile hjir in trúk (net alles kaam fan Aliexpress; in oare online winkel, Layta, beloofde oer in wike te leverjen, mar mear as in moanne is ferrûn; de twadde provider hie gjin tiid om de kabel te ferlingjen foar quarantaine, allinich slagge om in gat yn te boarjen yn 'e muorre foar de kabel).
Hoe te bestellen R64
It boerd sels is yn 'e offisjele winkel .
It is ek better om fuortendaliks te bestellen:
- + ynformearje EU as US plug standert
- heatsink: radiatoren / fans; om't sawol de CPU as de switch-chip opwaarme
- wifi antenne,
Der is in nuânse - de levering priis is wurden ûnfoldwaande heech yn 'e offisjele winkel foar in skoft. Manager Judy Huang oertsjûge my dat der gjin flater, en do koe kieze ePacket foar $ 5, mar ik seach dat foar Ruslân d'r allinnich EMS foar> $ 33. Onaangenaam, mar net kritysk. Boppedat, as jo in oar lân kieze foar levering (ik gie troch alle kontininten), sil levering ~ $ 5 kostje. Russophobes? .. Mar doe fûn ik dat foar Frankryk de leveringspriis ek ~30 $ is, en ik bedarre.
As gefolch hat Judy oanbean om in bestelling te pleatsen, mar net te beteljen (hint: set minder op de kaart sadat de automatyske betelling net trochgiet); skriuw har en se sil de leveringspriis werombringe nei normaal. Sukses.
saken
Noch net alles wurket perfekt.
Produktiviteit
Ansible=Python-kommando's wurde stadich útfierd, sels idle, foar 20-30 sekonden; in folchoarder fan grutte langer as op in x86 laptop. Boppedat wurde se earst frij fluch útfierd, ~3 sekonden, dan fertrage se hurd. Dit kin wêze trochdat de CPU ferwaarming (throttling). De Go-koade duorret ek lang om te wurkjen:
# запрос метрик для прометея из 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 wurket, mar op Armbian stopt it nei sawat in dei, skriuwt:
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
...Allinnich in trochstart helpt. Wy moatte fierder .
Ethernet
Ethernet wurket, mar nei ~ 64 oeren pakketten (DHCP) út RXNUMX stopje oankommen.
De ynterface opnij starte helpt:
ifdown br0; sleep 30; ifup br0De bestjoerder is nij, it is noch net akseptearre yn 'e kernel, ik hoopje dat it Sineeske Landen Chao is .
Boarne: www.habr.com
