Banana Pi 64 — është një kompjuter me një pllakë si Raspberry Pi, por me disa porte Ethernet, duke e bërë të mundur që të bëhet një ruter mbi një shpërndarje të përgjithshme të Linux.

Po, ka tashmë Openwrt, por ka disa probleme me GUI dhe CLI; ka Mikrotik, por ka gjithashtu GUI/CLI të vet, dhe Wireguard nuk funksionon direkt… Në përgjithësi, dëshiroj një ruter me konfigurime tërësisht fleksibël, duke mbetur brenda standardeve të Linux-it me të cilin punoni çdo ditë.
Në këtë artikull nën emrat BPI, R64, kompjuter me një pllakë do të kuptojmë të njëjtën gjë — vetë kompjuterin me një pllakë Banana Pi R64.
Zgjedhja e imazhit. Ngarkimi përmes eMMC
Aftësia më e parë që duhet të fitoni 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ësinë për të bashkëvepruar me të, pasi R64 nuk ka një port për monitorin (HDMI, për shembull). Kur gjithçka ndalon — WiFi, rrjeti Ethernet, Bluetooth, USB dhe të tjera, ka UART, përmes ndërfaqes së të cilit gjithmonë mund të shihni se çfarë ka shkuar keq, si dhe të ekzekutoni disa komanda nga consola, sipas nevojës.
Algoritmi i lidhjes me R64 përmes USB-UART:
- shkëmbej për te dyqani i pajisjeve elektronike për një kabllo USB-UART (PL2303, Serial-to-USB)
- lidhi një skaj USB në kompjuter dhe skajin tjetër, UART,- në R64, me tre tela nga katër, siç është në imazhin më poshtë
- në konsolën e kompjuterit starto
sudo minicom
Pas kësaj, në shumicën e rasteve do të shfaqet konsola e kompjuterit = sukses.
Mund të shikohet në detaje .

Më pas, më e lehtë do të jetë të ngarkoni sistemin operativ nga SD-karta: shkarkoni nëpërmjet imagjinës dhe ngarkojeni atë:
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=noxfervendosni kartën në slotin SD të R64, ndizni, dhe vëzhgoni ngarkimin përmes konsolës së lidhur, fillimisht uboot, pastaj ngarkimin standard të Linux-it.
Një alternativë e ngarkimit — përmes kartës eMMC të integruar në R64 me madhësi 8Gb. Sipas udhëzimeve në wiki, shkruajmë imazhin në pajisje
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Zgjedhja e boot-it mos e prek.
Çështja është se të paktën për BPI nevojitet vendosja e një flamuri të veçantë për të qenë në gjendje të ngarkohet nga flash-i brenda:
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]Pastaj, në seksionin speciale të boot-it, duhet të shkruhet preloader
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0Prodhuesi R64 (Kina) publikoi këtë binar . Çfarë bën, nuk dihet (nuk ka burime), por pa të nuk do të funksiononte ashtu siç duhet.
Në përgjithësi, pas kësaj, imazhet fillojnë të ngarkohen gjithashtu nga eMMC. Nëse dëshiron të marrësh në dorë procesin dhe të krijosh imazhe nga e para, për të dy rastet (SD/eMMC) duhet të shkruhen disa skedarë të tjerë (preloader për kartën SD, ATF, u-boot), vetëm që të arrihet ngarkimi i bërthamës. Kjo temë është ende , por për ne është më e rëndësishme që funksionon dhe mjafton.
Aktualisht, ngarkimin nga eMMC, me sinqeritet, nuk e përdor, kartat SD janë të mjaftueshme, por kam shpenzuar shumë kohë për ta bërë atë të funksionojë, prandaj le ta mbajmë në artikull.
Zgjedhja e sistemit operativ. Armbian
Detyra e parë praktike — të fillosh VPN, natyrisht Wireguard. Menjëherë u zbulua se nga ana e bërthamës nuk ishte ndërtuar, dhe nuk kishte tituj. Rindërtuam bërthamën dhe, duke bërë sikur isha me x86, ndërtova modulin e bërthamës duke përdorur DKMS. Megjithatë, shpejtësia e ndërtimit në arm64 për edhe utilitetet e vogla më habiti. Dhe pastaj nevojitej edhe një moduli tjetër i bërthamës, e kështu me radhë. Në përgjithësi, duket se gjithçka që lidhet me bërthamën, është më mirë të ndërtohet në laptopin x86 të ngrohtë dhe të butë, pastaj të transferohet me kopjim në R64, të ri-startohet dhe të testohet.
Një tjetër gjë — pjesa e përdoruesve. Në rastin tim të zgjedhjes Debian, gjithçka për arkitekturën arm64 tashmë është në packages.debian.org dhe nuk nevojitet të rindërtohet asgjë.
Për të mos krijuar një biçikletë tjetër, unë në BPI R64.
Në mënyrë më të saktë: pjesa e përdoruesve — Armbian, dhe bërthama merret nga depoja Imazhi më i fundit mund të shkarkohet .
Të gjitha aktivitetet për zhvillimin e pjesës softuerike të R64 bëhen në . Në përgjithësi, prodhuesi vetë synon të populizohet router-in nën Openwrt, por falë aktiviteteve të zhvilluesit Frank nga Gjermania, të gjitha funksionalitetet shpesh përfshihen shpejt 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: kabllot
Në mënyrë të veçantë, dua të flas për mënyrën se si, gjatë zhvillimit/testimit, mund të vendosni SBC (jo vetëm BPI) mbi tryezë në mënyrë që të mos tërheqni kabllon Ethernet nga burimi i internetit përmes gjithë dhomës/zyrës. Kjo për atë se nga njëra anë duhet të sigurosh internet për pajisjen, ndërsa nga ana tjetër, mund të ketë probleme me pajisjen, dhe së pari Wifi.
Fillimisht vendosa të blej një 'dongle' USB-Wifi të lirë, ta lidh atë në portin e vetëm në BPI dhe të harroj për kabllot. Për këtë blova 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ë funksionuar dongle-i duhet një driver bërthamë, të cilin aty, natyrisht, nuk e kishte (më vonë e krijova driver-in e nevojshëm RTL8XXXU, por prapë kjo është e papraktiçme). Dhe kablli Ethernet prishte pamjen e dhomës për një kohë.
Në fund, mund të heq dorë nga kablli me ndihmën e Tenda MW3 (sistemi Wifi mesh): thjesht vendosa një kubik nën tryezë dhe me një kabllo Ethernet një metër e lidha BPI-në në portin LAN të fundit. Sukses.
Wireguard, RKN, Bird
Një nga dëshirat për të cilat përdor Banana PI është të kem qasje të lirë në faqet e bllokuara nga RKN, veçanërisht që të punojë Telegrami dhe thirrjet në Slack. Ka pasur artikuj të propozuar mbi këtë temë në Habr: , , .
Zhvillimi i një zgjidhjeje të tillë e realizova me Ansible: .
Kuptohet se VPS funksionon nën Ubuntu 18.04. E kontrollova funksionalitetin në dy hoste në Evropë: Amazon dhe Digital Ocean.
Pra, ne kemi instaluar Armbian e përmendur më sipër në R64, i cili është i aksesueshëm përmes ssh me emrin hm-bananapi-1 dhe ka qasje në internet. Zhvillojmë në mënyrë të njëpasnjëshme ansible, skriptet e automatizimit dhe fillojmë instalimin 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-1Më pas, duhet të zbatojmë në mënyrë të ngjashme VPN-në tonë në VPS:
ansible-playbook ./router.py -l current-vpnKëtu argumenti është gjithmonë current-vpn, ndërsa emri i VPS-së konfigurohet 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 duhet të gjeneroni sekrete (në veçanti çelësat Wireguard) në dosjen ./secrets, direktorja duhet të duket .
Automatizimi Ansible në Python
Mund të vërehet se, në vend të formatit YAML, komandat e Ansible janë koduar në skriptet Python. Për krahasim, si ta aktivizoni demonin bird në mënyrë të zakonshme:
- name: start bird
systemd:
name: bird
state: started
enabled: yesdhe si e njëjta gjë nëpërmjet Python:
me mapping:
append("name", "start bird")
me mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")Shkrimi i komandave Ansible me kod në Python lejon ripërdorimin e kodit, dhe gjithashtu hap të gjitha mundësitë e gjuhës së përgjithshme. Për shembull, instalimi i bird në R64 dhe VPS:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")shiko kodin e funksionit .
Kjo karakteristikë e quajtur pybook është implementuar . Dokumentacioni për pybook nuk ekziston akoma, më vonë do ta rregulloj këtë mangësi.
Çfarë mendon për këtë.
Monitorimi. Prometheus
Dhe kështu: telegrami punon, linkedin dhe pornhub gjithashtu, përfundimisht përvoja e përdoruesit — ok. Por gjithçka mund të dështojë, dhe pajisjet kineze gjithashtu.
Përditësimet e bërthamës gjithashtu janë të tërheqshme: p.sh., dëshiroja të përditësoja bërthamën nga 5.4 në 5.6, mirë, atje ka Wireguard nga kutia, nuk është e nevojshme të patchoj… E thënë, e bërë: me kujdes kam transferuar patch-ët nga 5.4 në 5.6, bërthama u ngjall, tuneli deri në VPS ping-oj, por bird nuk mund të lidhet me gabimin "BGP Error"… "Me tmerr u riktheva prapa" (c) në 5.4; kalimi në 5.6 e kam shtyrë për në TODO.
Prandaj, në shtesë të instalimit të router-it dhe VPS, kam shtuar monitorimin (në x86 Ubuntu 18.04), i cili instalohet në një host të veçantë me komponentët si:
- prometheus, alertmanager, blackbox_exporter — gjithçka në docker
- alerte dërgohen në kanalin telegram me ndihmën e bot-it metalmatze/alertmanager-bot — gjithashtu në docker
- tor për bot, në mënyrë që boti të mund të alerte zotimet, kur ka internet, por telegrami ende nuk funksionon, dhe boti vetë nuk mund të lidhet
- alerte : NodeVPNTroubles (nuk ka ping deri në VPS), BirdVPNTroubles (nuk ka seancë Bird), AntifilterDownloadTroubles (gabim në ngarkimin e IP-adresave të bllokuara), SiteTroubles (telegrami e shijshëm është i paarritshëm)
- alerte sistemore, p.sh., HostGrowingDiskReadLatency (kartela SD e lirë ndalon së lexuari)
Shembuj instalimi të monitorimit:
ansible-playbook ./monitoring.py -l monitoring-preprodAuto Discovery për prometheus është e konfiguruar në dosjen /etc/prometheus/auto_http, shembuj për të shtuar një host në monitorim (për arsye të 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
EOFTODO: 2 ofrues, 2 BPI, anycast failover
Në përmbledhje, kam planifikuar të lidhem me dy ofrues, në mënyrë që interneti të vazhdojë të punojë, madje edhe nëse një ofrues ka probleme me rrjetin, ose harroi të paguajë për internetin, etj., dhe faktorë të tjerë njerëzorë.
Përvoja më e avancuar e përdoruesit mbi temën multi-wan është përshkruar për sistemin Mwan3 nën Openwrt. Ky zgjidhje ka funksionalitet të pasur, por konfigurimi dhe përdorimi i multi-wan është mjaft i ndërlikuar. Një shembull vetëm: nëse lidhemi në disa faqe me dy IP adresash njëkohësisht, ato mund të mos e pranojnë, dhe do të fillojë të shfaqet 'interneti nuk punon'.
Duke marrë parasysh këtë përvojë, vendosa që multihoming nuk është prioritet tani, vetëm failover. Megjithatë, duket se në versionet e fundit të linux-it gjithçka duhet të funksionojë me një komandë të tipit:
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, ne marrim 2 BPI, secilin e lidhim me një ofrues dhe i lidhim midis tyre me routing dinamik përmes bird/OSPF.
Më pas, në secilin njoftojmë të njëjtin IP adresë në rast se shërbimi është i aksesueshëm (internet, DNS). Këtu do të vendosim rrugën në mënyrë të paracaktuar jo vetë, por përmes bird. Zgjidhjen e kam parë .
Ky funksionalitet nuk e kam realizuar ende, virusi dinak i korona-s po bënë këtu të vështirë (jo gjithçka erdhi nga aliexpress; një dyqan tjetër online, Layta, premtoi se do të dërgonte brenda një jave, por ka kaluar më shumë se një muaj; ofruesi tjetër nuk kishte kohë të tërhiqte kabuj deri në karantinim, vetëm sa arriti të bëjë një vrimë në mur për kabin.)
Si të porosis R64
Vetë karta në dyqanin zyrtar .
Gjithashtu, është më mirë të porosisësh menjëherë:
- + të informosh për standardin e ndërlidhësit të BE-së apo SHBA-së
- ndeshja e nxehtësisë: radiatorë/ventilatorë; sepse CPU ngrohet dhe çipi switch-it
- antenën për wifi,
Ka një ndryshim — çmimi i dërgesës është bërë papritur shumë i lartë në dyqanin zyrtar. Menaxherja Judy Huang më siguroi se nuk ka gabim, dhe mund të zgjedh ePacket për $5, por unë pashë se për Rusinë kishte vetëm EMS për >33$. E pakëndshme, por jo kritike. Përveç kësaj, nëse zgjidh një vend tjetër për dërgesën (kam provuar të gjitha kontinentet), dërgesa është rreth ~$5. Pse rusofobë...? Por më vonë gjeta se për Francën çmimi i dërgesës është gjithashtu ~30$, dhe u qetësova.
Në fund, Judy ofroi të bënte porosinë, por të mos e paguaja (hint: të vendosesh më pak në kartë, për të mos kaluar automatikisht pagesa); t'i shkruaj atij, dhe ajo do ta zvogëlojë çmimin e dërgesës në një nivel të arsyeshëm. Succes.
Çështjet
Jo gjithçka funksionon perfekte ende.
Performanca
Komandat Ansible=Python executohen ngadalshëm, madje edhe ato të zbrazëta, duke zgjatur 20-30 sekonda; shumë më gjatë se sa në laptopin x86. Fillimisht ato ekzekutohen mjaft shpejt, rreth 3 sekonda, pastaj ngadalësohen papritur. Ndoshta kjo ndodh për shkak të nxehtësisë së CPU-së (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 diku pas një dite, shkruan:
sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Mesazhi 38 (seq 3) ka skaduar
[470314.042508] mt7622_wmac 18000000.wmac: Mesazhi 50 (seq 4) ka skaduar
...Rivendosja është ndihmuesi i vetëm. Duhet të kërkojmë më tutje .
Ethernet
Ethernet funksionon, por pas rreth një dite, paketat (DHCP) nga R64 ndalojnë së ardhuri.
Rivendosja e ndërfaqes ndihmon:
ifdown br0; sleep 30; ifup br0Drejtpërdrejtori është i ri, ende nuk është pranuar në kernel, shpresoj që kinezi Landen Chao .
Burimi: habr.com
