Banana Pi 64 — është një kompjuter një-faqësor i ngjashëm me Raspberry Pi, por me disa porte Ethernet, gjë që e bën të mundur krijimin e një ruter-i të bazuar në një shpërndarje të zakonshme Linuх.

Po, ka Openwrt, por ka shqetësimet e veta si GUI dhe CLI; ka Mikrotik, por po ashtu ka GUI/CLI të vet dhe Wireguard nuk funksionon nga kutia… Në përgjithësi, dëshiroj një ruter me vendosje fleksibile, me një sistem standard linux që përdor çdo ditë.
Në këtë artikull me emrat BPI, R64, dhe një-faqësori do të nënkuptoj të njëjtën gjë — vetë kompjuteri një-faqësor Banana Pi R64.
Zgjedhja e imazhit. Ngarkimi nëpërmjet eMMC
Aftësia e parë që duhet të zhvilloni kur punoni me në përgjithësi, dhe me R64 në veçanti, është të mësoni si të ngarkoni sistemin operativ dhe të keni mundësi të komunikoni me të, sepse R64 nuk ka port për monitor (HDMI, për shembull). Kur gjithçka dështon — WiFi, rrjeti Ethernet, Bluetooth, USB dhe të tjera ndalojnë së funksionuari, ka UART, përmes të cilit gjithmonë mund të shihni se çfarë ka ndodhur, si dhe të ekzekutoni disa komanda nga konsola, sipas nevojës.
Algoritmi i lidhjes me R64 përmes USB-UART:
- shkoni në dyqanin e pajisjeve elektronike për një kabllo USB-UART (PL2303, Serial-to-USB)
- lidheni një skaj USB me kompjuterin dhe skajin tjetër, UART, me R64, me tre tel nga katër, si në figurën më poshtë.
- në konsolën e kompjuterit ekzekutoni
sudo minicom
Pas kësaj, në shumicën e rasteve do të shfaqet konsola e kompjuterit një-faqësor = suksesi.
Mund të shikoni më shumë .

Më pas, më e lehta është të ngarkoni sistemin operativ nga karta SD: shkarkoni nga imagjin dhe ngarkojeni:
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=noxferFutni kartën në slotin SD të R64, ndizni, dhe ndiqni ngarkimin fillimisht të uboot, pastaj ngarkimin standard të linuxit nga konsola e lidhur.
Një opsion alternativ i ngarkimit — përmes një kartë të përfshirë në R64 me madhësi 8Gb, e quajtur eMMC. Sipas udhëzimit në wiki, regjistroni imazhin në pajisje.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Zgjedhja e ngarkesës mos u ngacmo.
Kjo është për shkak se së paku për BPI është e nevojshme të vendosni një flamur të veçantë për të pasur mundësinë të ngarkoni nga flash interiore:
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Bytes e konfigurimit të ngarkesës [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Bytes e konfigurimit të ngarkesës [PARTITION_CONFIG: 0x48]Më pas, në seksionin e veçantë të ngarkimit, duhet të regjistroni paraloadin.
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Prodhuesi i R64 (Kina) ka publikuar këtë binar . Çfarë bën ai nuk dihet (nuk ka burime), por pa të gjithashtu nuk do të funksionojë.
Në të vërtetë, pas kësaj imazhet fillojnë të ngarkohen edhe nga eMMC. Nëse dëshironi të kuptoni më mirë dhe të krijoni imazhe nga fillimi, atëherë për të dy rastet (SD/eMMC) duhet të regjistroni disa skedarë të tjerë (paraload për kartën SD, ATF, u-boot), vetëm për të arritur ngarkimin e bërthamës. Ky subjekt është ende , por për ne e rëndësishme është që funksionon dhe është mirë.
Tani nuk po përdor ngarkimin përmes eMMC, sinqerisht, karta SD janë të mjaftueshme, por kam shpenzuar shumë kohë për ta bërë të funksionojë, prandaj le të jetë në artikull.
Zgjedhja e sistemit operativ. Armbian
Detyra e parë praktike — të aktivizoni VPN, sigurisht që Wireguard. Menjëherë u zbulua se nga anët e bërthamës ai nuk është ndërtuar, dhe nuk ka kokat. Rindërtoja bërthamën dhe, sipas zakonit me x86, ndërtova modulin e bërthamës me anë të DKMS. Megjithatë, shpejtësia e ndërtimit në arm64 madje edhe për utilitarët e vegjël më shqetësoi. Pastaj nevojitej edhe një modulin tjetër i bërthamës, etj. Në përgjithësi, del se gjithçka që është e lidhur me bërthamën është më mirë të ndërtohet në një laptop x86 të ngrohtë dhe me ndihmën e kopjimit të thjeshtë të transferohet në R64, të rinisni dhe të testoni.
Një tjetër çështje është pjesa e hapësirës së përdoruesit. Në rastin tim zgjedhja e Debian, të gjitha për arkitekturën arm64 janë tashmë në packages.debian.org dhe nuk ka nevojë të rindërtojë asgjë.
Për të mos krijuar një biçikletë të re, unë në BPI R64.
Më saktë kështu: pjesa e hapësirës së përdoruesit — Armbian, ndërsa bërthama merret nga depoja -a. Imazhi më i fundit mund të shkarkohet .
Të gjitha aktivitetet rinore lidhur me zhvillimin e pjesës software të R64 kryhen në . Në të vërtetë, prodhuesi vetë synon të popullarizojë router-in me Openwrt, por përmes aktivitetit të zhvilluesit Frank nga Gjermania, të gjitha funksionalitetet shpejt kalojnë në bërthamën për Debian. Është e çuditshme, por Frank është aktiv në çdo degë të forumit.
Organizimi i hapësirës së punës: kabllo
Dua të flas veçmas se si gjatë zhvillimit/testimit të poziciononi SBC (jo vetëm BPI) në tryezë në mënyrë që të mos çoni kabllon Ethernet nga burimi i internetit përmes tërë dhomës/zyrës. Çështja është se nga njëra anë duhet të sigurosh internet për pajisjen, dhe nga ana tjetër, në këtë pajisje gjithçka mund të prishet, dhe në radhë të parë WiFi.
Fillova vendosa fillova vendosa është kostoja e parë që vendosa të blija një "USB-Wifi" të lirë, ta lidhja në portin e vetëm në BPI dhe të harroja kabllot. Për këtë, bleva një TP-LINK TL-WN725N USB 2.0 të lirë, por shumë shpejt u bë e qartë se nuk do të funksiononte: për të bërë të punonte, nevojitej një drajver bërthamor, i cili natyrisht nuk ishte atje (më vonë e ndërtova drajverin e duhur RTL8XXXU, por prapë ishte i papërdorshëm). Dhe kablli Ethernet prishte pamjen e dhomës për disa kohë.
Si përfundim, arrita të heq kabllon duke përdorur Tenda MW3 (sistemi Wifi mesh): thjesht vendosa një kubik poshtë tavolinës dhe lidhja me kabllon Ethernet një metër lidh BPI për portin LAN të saj. Sukses.
Wireguard, RKN, Bird
Një nga dëshirat për të cilat përdor Banana PI — është të kem akses të lirë në faqet e bllokuara nga RKN, veçanërisht për të punuar Telegram dhe thirrjet në Slack. Në këtë temë tashmë janë propozuar artikuj në Habra: , , .
Zhvillimi i këtij zgjidhjeje e realizova me Ansible: .
Supozoni se VPS punon mbi Ubuntu 18.04. Testova funksionalitetin në dy hoste në Evropë: Amazon dhe Digital Ocean.
Pra, instaluam Armbian e përmendur më sipër në R64, e cila është e aksesueshme përmes ssh me emrin hm-bananapi-1 dhe ka qasje në internet. Zhvillojmë në rend ansible, skenarët e automatizimit dhe nisemi për të instaluar në 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-1Pastaj duhet të deployonim VPN-në tonë në VPS në mënyrë të ngjashme:
ansible-playbook ./router.py -l current-vpnKëtu argumenti është gjithmonë current-vpn, ndërsa emri i VPS konfiguridohet në variablën (në këtë rast është 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-1Ah, po, para të gjitha këtyre operacioneve duheshin gjeneruar sekretet (veçanërisht çelësat e Wireguard) në dosjen ./secrets, direktoria duhet të duket .
Automatizimi Ansible në Python
Është e dukshme që në vend të formatit YAML, komandat Ansible janë koduar në skenarët Python. Për krahasim, si të aktivizoni demonin bird në mënyrë tradicionale:
- name: start bird
systemd:
name: bird
state: started
enabled: yesdhe si e njëjta gjë përmes Python:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Shkrimi i komandave Ansible me kodin Python lejon riciklimin e kodit, dhe do të hapin të gjitha mundësitë e një gjuhe programimi të përgjithshme. Për shembull, instalimi i bird në R64 dhe VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")shihni kodin e funksionit .
Ky funksion i quajtur pybook është realizuar . Dokumentacioni për pybook aktualisht nuk është në dispozicion, më vonë do ta rregulloj këtë mungesë.
Çfarë mendon rreth kësaj.
Monitorimi. Prometheus
Përgjithësisht: telegrami punon, linkedin dhe pornhub gjithashtu, në përgjithësi përvoja e përdoruesit — është e rregullt. Por gjithçka mund të prishët, dhe pajisjet kineze gjithashtu.
Përditësimet e bërthamës gjithashtu ndodhin të jenë interesante: për shembull, desha të përditësoj bërthamën nga 5.4 në 5.6, siç dihet, aty është Wireguard nga kutia, nuk ka nevojë për patchim… Thënë dhe bërë: me kujdes transferova patches nga 5.4 në 5.6, bërthama e nisi, tuneli deri në VPS pingon, por bird nuk mund të lidhë me gabimin "BGP Error"... "Me frikë u ktheva mbrapsht" (c) në 5.4; migren nga 5.6 e shtyva në TODO.
Prandaj, në përveç instalimit të routerit dhe VPS tani shtova monitorimin (në x86 Ubuntu 18.04), i cili ishtë vendosur në një host të veçantë me komponentët e mëposhtëm:
- prometheus, alertmanager, blackbox_exporter — të gjitha në docker
- alerte dërgohen në kanalin telegram me ndihmën e bot-it metalmatze/alertmanager-bot — gjithashtu në docker
- tor për robotin, në mënyrë që roboti të mund të alarmonte situatat, kur interneti është në dispozicion, por telegrami megjithatë nuk punon, dhe vetë roboti nuk mund të lidhet.
- alerte të aplikacioneve alerte sistemore, për shembull, HostGrowingDiskReadLatency (kartelë SD e lirë ndalon së lexuari)
- Shembulli i instalimit të monitorimit:
ansible-playbook ./monitoring.py -l monitoring-preprod
Auto Discovery për prometheun është konfigurua në dosjen /etc/prometheus/auto_http, shembulli i shtimit të një host në monitorim (për default, hostet nuk monitorohen):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 EOF
TODO: 2 providerë, 2 BPI, anycast failoverPërveç të gjithave, planifikova të lidhem me dy providerë, që interneti të vazhdoj të funksionojë, edhe nëse njëri nga providerët ka një problem me rrjetin, ose harroi të paguajë për internet etj., dhe faktorët e tjerë njerëzorë.
Përvoja më e avancuar e përdoruesit në temën multi-wan është e përshkruar
për sistemin Mwan3 nën Openwrt. Ky zgjidhje ka funksionalitete të pasura, por konfigurimi dhe operimi është për të vërtetë mjaft i vështirë për multi-wan. Një shembull i vetëm: nëse afroheni në disa faqe menjëherë nga dy IP adresash, ata mund të mos e pëlqejnë këtë, do të ndalen së funksionuari => "interneti nuk punon". për sistemin Mwan3 nën Openwrt. Ky zgjidhje ka funksionalitet të pasur, por konfigurimi dhe përdorimi për multi-wan është në përgjithësi mjaft i ndërlikuar. Një shembull i vetëm: nëse po vizitoni disa faqe menjëherë nga dy IP të ndryshme, ato mund të mos e pranojnë këtë, dhe do të ndalen së funksionuari => "interneti nuk punon".
Duke marrë parasysh këtë përvojë, vendosa se multihoming nuk është prioritet për momentin, vetëm failover. Megjithatë, duket se në versionet e fundit të linux gjithçka duhet të funksionojë me një komandë të tillë:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5Pra, për të shmangur një pikë të vetme dështimi, marrim 2 BPI, secili i lidhur me një ofrues, i lidhim mes vete dhe komunikimin e tyre e bëjmë me маршрутизацией dinamike përmes bird/OSPF.
Pastaj, në çdo kusht pranojmë të njëjtin adresë IP në rast se shërbimi është i disponueshëm (internet, DNS). Do të vendosim rrugën e paracaktuar jo vetë, por përmes bird. Zgjidhjen e vëzhgoj .
Ky funksionalitet nuk e kam realizuar ende, coronavirus.i pabesë e pengoi këtë (nuk arriti gjithçka nga AliExpress; një dyqan tjetër online, Layta, premtoi dërgimin brenda një jave, por janë kaluar më shumë se një muaj; ofruesi i dytë nuk u arrijti të tërheqë kabllin përpara karantinës, arriti vetëm të bëjë një vrimë në mur për kabllin).
Si të porosisim R64
Të dhënat e pllakës në dyqanin zyrtar .
Gjithashtu, është më mirë të porositni menjëherë:
- + të njoftoni standardin e plugut të BE-së ose SHBA-së
- shkëmbyesin: radiatorët/ventilatorët; sepse si CPU ngrohet, ashtu edhe çipi i switch-it
- antenën për wifi,
Ka një detaj - çmimi i dërgimit është bërë ndjeshëm i lartë nga njëfarë kohe në dyqanin zyrtar. Menaxherja Judy Huang më siguroi se nuk ka gabim, dhe mund të zgjedh ePacket për $5, por pashë se për Rusinë ka vetëm EMS për >33$. E pakëndshme, por jo kritike. Për më tepër, nëse zgjidhni çdo vend tjetër për dërgim (kam provuar të gjitha kontinentet), dërgimi do të jetë rreth $5. Rusofobët?.. Por më vonë e pashë se për Francën çmimi i dërgimit është gjithashtu rreth 30$, dhe u qetësova.
Në fund, Judy ofroi të bëjë porosinë, por të mos paguhen (hint: të vendosni më pak në kartë, në mënyrë që pagesa të mos kalojë automatikisht); të shkruani asaj, dhe ajo do të ulet çmimin e dërgimit në një nivel normal. Succes.
Issues
Jo gjithçka funksionon perfekt për momentin.
Performanca
Komandat Ansible=Python ekzekutohen ngadalë, madje edhe në zbrazëti, 20-30 sekonda; shumë më gjatë se në laptopin x86. Në fakt, fillimisht ekzekutohen me mjaft shpejtësi, rreth 3 sekonda, më pas ngadalësohen papritmas. Ndoshta kjo ndodh për shkak të ngrohjes së CPU (throttling). Kodi në Go gjithashtu punon ngadalë:
# запрос метрик для прометея из 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 funksionon, por në Armbian ndalon pas një dite, shkruan:
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
...Ndihmon vetëm rikonfigurimi. Duhet të vazhdoj .
Ethernet
Ethernet funksionon, por pas ~një dite paketa (DHCP) nga R64 ndalojnë për të ardhur.
Rikonfigurimi i interfesës ndihmon:
ifdown br0; sleep 30; ifup br0Driveri është i ri, nuk është pranuar ende në bërthamë, shpresoj se kinez Landen Chao .
Burimi: habr.com
