Banana Pi R64-enkursigilo - Debian, Wireguard, RKN

La Banana Pi 64 estas unu-tabulo komputilo simila al la Raspberry Pi, sed kun pluraj Ethernet-havenoj, kio ebligas igi ĝin enkursigilo bazita sur ĝeneraluzebla Linukso-distribuo.

Banana Pi R64-enkursigilo - Debian, Wireguard, RKN

Jes, jam ekzistas Openwrt, sed ĝi havas siajn proprajn problemojn, sian GUI kaj CLI; Estas Mikrotik, sed denove ĝi havas sian propran GUI/CLI, kaj Wireguard ne funkcias el la skatolo... Ĝenerale, mi volas enkursigilon kun flekseblaj agordoj, restante en la kadro de norma Linukso, kiun vi funkcias. kun ĉiu tago.

En la artikolo sub la nomoj BPI, R64, unu-tabulo, mi signifos la samon - la Banana Pi R64-unu-tabulo mem.

Elektante bildon. Elŝutu per eMMC

La unua kapablo, kiun vi devas akiri kiam vi laboras SBC ĝenerale, kaj precipe kun la R64, tio signifas lerni kiel ŝargi operaciumon en ĝi kaj povi interagi kun ĝi, ĉar la R64 ne havas havenon por monitoro (HDMI, ekzemple). Kiam ĉio defalis - ĉesis funkcii Wifi, Ethernet, Bluetooth, USB ktp.. Estas UART, per kies interfaco vi ĉiam povas vidi kio misfunkciis, kaj ankaŭ ruli kelkajn komandojn de la konzolo, se necese.

Algoritmo por konekti al R64 per USB-UART:

  • ni kuras al la vendejo de radiopartoj por USB-UART-kablo (PL2303, Seria-al-USB)
  • konekti unu USB-finon al la komputilo, kaj la alia, UART, al la R64, kun tri dratoj el kvar, kiel en la suba bildo.
  • kuri en la komputila konzolo sudo minicom

Post tio, plejofte aperos la unutabula konzolo = sukceso.
Vi povas vidi pli da detaloj tie.

Banana Pi R64-enkursigilo - Debian, Wireguard, RKN

Poste, la plej facila maniero estas ŝargi la operaciumon de SD-karto: elŝuti per ligilo bildon kaj plenigu ĝin:

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=noxfer

Ni enmetas la karton en la fendo R64 SD, ŝaltas ĝin kaj observas, ke la konektita konzolo ŝarĝas unue uboot, poste norman Linukso-ŝarĝadon.

Alternativa ekfunkciigo uzas 64Gb-karton jam enkonstruitan en la R8, nomatan eMMC. Laŭ la instrukcioj en la vikio, ni kopias la bildon al la aparato
/dev/mmcblk0 al BPI, rekomencu, forigu la SD-karton, ŝaltu BPI denove... kaj ĝi ne funkcias. Kiel iri tien kaj reen Boot select ne ĝenu.

Fakte estas, ke almenaŭ por BPI vi devas agordi specialan flagon por povi ekŝargi de interna poŝmemoro:

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]

Poste, vi devas skribi antaŭŝargilon en specialan lanĉan sekcion

root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro 
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0

Fabrikisto R64 (Ĉinio) afiŝis ĉi tiun binaron tie. Kion ĝi faras estas nekonata (ne ekzistas fontkodoj), sed ĝi ankaŭ ne funkcios sen ĝi.

Ĝenerale, post ĉi tio, la bildoj komencas ŝargi de eMMC. Se vi volas eltrovi ĝin kaj krei bildojn de nulo, tiam por ambaŭ kazoj (SD/eMMC) vi devas skribi plurajn pliajn dosierojn (antaŭŝargilo por SD-karto, ATF, u-boot) nur por ekŝarĝi la kernon. Ĉi tiu temo ankoraŭ estas disvolviĝas, sed por ni la ĉefa afero estas, ke ĝi funkcias kaj bone.

Nun mi elŝutas per eMMC, sincere, mi ne uzas ĝin, SD-karto sufiĉas, sed mi pasigis sufiĉe da tempo por ke ĝi funkciigu, do estu en la artikolo.

Elektante operaciumon. Armbiano

La unua aplika tasko estas lanĉi VPN, nature Wireguard. Oni tuj malkovris, ke sur la kernflanko ĝi ne estis kunvenita kaj ne estis kaplinioj. Mi rekonstruis la kernon kaj, kiel mia kutimo kun x86, kunmetis la kernan modulon uzante DKMS. Tamen, la rapideco konstrui eĉ malgrandajn utilecojn sur arm64 malagrable surprizis min. Kaj tiam alia kernomodulo estis postulata, ktp. Ĝenerale, rezultas, ke ĉio rilata al la kerno estas plej bone kunvenita sur varma x86-tekkomputilo, poste transdonita al la R64 per simpla kopiado, rekomencita kaj provita.

Alia afero estas la uzantspaca parto. En mia kazo de elekto de Debian, ĉio por la arm64-arkitekturo jam estas en packages.debian.org kaj ne necesas rekonstrui ion ajn.

Por ne produkti alian biciklon, mi portita Armbiano sur BPI R64.
Aŭ pli ĝuste, ĉi tio: la uzantspaca parto estas Armbian, kaj la kerno estas prenita el la deponejo sinceraj-A. La plej nova bildo estas elŝutebla tie.

Ĉiu agado pri la disvolviĝo de la programaro parto de R64 estas efektivigita forumo. Ĝenerale, la fabrikanto mem klopodas popularigi la enkursigilon por Openwrt, sed danke al la agado de la programisto Frank el Germanio, ĉiuj funkcioj rapide finiĝas en la kerno por Debian. Mirinde, Frank aktivas en ĉiu forumfadeno.

Laborspaca organizo: dratoj

Aparte, mi ŝatus rakonti al vi kiel, dum evoluado/testado, metu SBC (ne nur BPI) sur tablon por ne ruli Ethernet-kablon al ĝi de interreta fonto tra la tuta ĉambro/oficejo. La fakto estas, ke, unuflanke, vi devas provizi pecon de aparataro kun Interreto, sed aliflanke, ĉio en tiu aparataro povas rompi, kaj antaŭ ĉio Wifi.

Unue, mi decidis aĉeti malmultekostan USB-Wifi "fajfilon", ŝtopu ĝin en la solan havenon de la BPI kaj forgesu pri la dratoj. Por fari tion, mi aĉetis malmultekostan TP-LINK TL-WN725N USB 2.0, sed tre baldaŭ evidentiĝis, ke ĝi ne ekflugos: por ke la fajfilo funkciu, vi bezonas kernan pelilon, kiu kompreneble ne estis tie. (poste mi kunmetis la necesan ŝoforon RTL8XXXU, sed ĝi estas ankoraŭ nepraktika). Kaj la Ethernet-kablo difektis la aspekton de la ĉambro dum momento.

Kiel rezulto, mi sukcesis forigi la kablon helpe de Tenda MW3 (Wifi mesh-sistemo): mi simple metis unu kubon sub la tablon kaj konektis la BPI al la LAN-haveno de ĉi-lasta per metro-longa Ethernet-kablo. Sukceso.

Wireguard, RKN, Birdo

Unu el la aferoj, por kiuj mi volas uzi Banana PI, estas havi liberan aliron al retejoj blokitaj de RKN, precipe, por ke Telegram kaj Slack-vokoj povu funkcii. Artikoloj pri Habré jam estis proponitaj pri ĉi tiu temo: fojoj, два, tri.

Mi deplojis ĝuste ĉi tiun solvon uzante Ansible: ligilo.

Oni supozas, ke la VPS funkcias Ubuntu 18.04. Mi kontrolis la funkciojn ĉe du gastigantoj en Eŭropo: Amazon kaj Digital Ocean.

Do, ni instalis la supran Armbianon sur R64, ĝi estas alirebla per ssh sub la nomo hm-bananapi-1 kaj havas interretan aliron. Ni konstante deplojas Ansible, aŭtomatigajn skriptojn kaj lanĉas la instaladon mem sur 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

Poste, vi devas deploji nian VPN al la VPS en la sama maniero:

ansible-playbook ./router.py -l current-vpn

Ĉi tie la argumento ĉiam estas aktuala-vpn, kaj la fakta VPS-nomo estas agordita en variablo (en ĉi tiu kazo ĝi estas 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-1

Ho jes, antaŭ ĉiuj ĉi tiuj operacioj vi devas generi sekretojn (precipe Wireguard-ŝlosilojn) en la dosierujon ./secrets, la dosierujo devus aspekti kiel tiel.

Ansible Automation en Python

Vi eble rimarkos, ke anstataŭ esti en YAML-formato, la Ansible-komandoj estas koditaj en Python-skriptoj. Por komparo, kiel ebligi la birddemonon laŭ la kutima maniero:

- name: start bird
  systemd:
    name: bird
    state: started
    enabled: yes

kaj kiel fari la samon per Python:

with mapping:
    append("name", "start bird")
    with mapping("systemd"):
        append("name",  "bird")
        append("state", "started")
        append("enabled", "yes")

Skribi Ansible-komandojn en Python permesas reuzi la kodon, kaj ĝenerale malfermas ĉiujn eblecojn de la ĝeneraluzebla lingvo. Ekzemple, instalante birdon sur R64 kaj VPS:

install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")

vidu la funkciokodon instal_birdo().

Ĉi tiu funkcio vokis pybook efektivigita tie. Ankoraŭ ne ekzistas dokumentaro pri pybook, sed mi solvos ĉi tiun problemon poste.

Kion li pensas kontraŭflue pri tio.

Monitorado. Prometeo

Entute: telegramo funkcias, ankaŭ linkedin kaj pornhub, ĝenerale la sperto de uzanto estas bona. Sed ĉio povas rompiĝi, inkluzive de ĉina aparataro.

Ankaŭ kernaj ĝisdatigoj povas esti interesaj: ekzemple, mi volis ĝisdatigi kernon 5.4 => 5.6, nu, Wireguard estas tie ekstere de la skatolo, ne necesas fliki... Apenaŭ dirite ol farite: mi pene translokigis la diakilojn de 5.4. al 5.6, la kerno ekfunkciis, la tunelo al la VPS pingis, sed birdo ne povas konekti kun la eraro "BGP-Eraro" ... "Mi terure retroiris" (c) al 5.4; La movo al 5.6 estis prokrastita en TODO.

Tial, krom instali la enkursigilon kaj VPS, mi aldonis monitoradon (sur x86 Ubuntu 18.04), kiu estas instalita sur aparta gastiganto kun la sekvaj komponantoj:

  • prometheus, alertmanager, blackbox_exporter - ĉio en docker
  • Atentigoj estas senditaj al la telegrama kanalo uzante la metalmatze/alertmanager-bot bot - ankaŭ en Docker
  • tor por la bot, tiel ke la bot povas atentigi situaciojn kiam ekzistas Interreto, sed telegramo ankoraŭ ne funkcias, kaj la roboto mem ne povas konektiĝi.
  • aplikita atentigoj: NodeVPNTroubles (neniu ping al VPS), BirdVPNTroubles (neniu Bird-sesio), AntifilterDownloadTroubles (eraro ŝarĝante blokitajn IP-adresojn), SiteTroubles (malbonŝanca telegramo ne disponeblas)
  • sistemaj atentigoj, ekzemple, HostGrowingDiskReadLatency (malmultekosta SD-karto fariĝas nelegebla)

Ekzemplo de monitorado de instalado:

ansible-playbook ./monitoring.py -l monitoring-preprod

Aŭtomata Discovery por Prometheus estas agordita en la dosierujo /etc/prometheus/auto_http, ekzemplo de aldono de gastiganto al monitorado (gastigantoj ne estas monitoritaj defaŭlte):

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 provizantoj, 2 BPI, anycast malsukceso

Krom ĉio, mi planis konekti al du provizantoj, por ke la Interreto daŭre funkciu, eĉ se unu provizanto havus problemojn kun la reto, aŭ ili forgesis pagi por Interreto ktp., kaj aliaj homaj faktoroj.

La plej altnivela uzantsperto pri la temo de multi-wan estas priskribita tie por la Mwan3-sistemo sub Openwrt. Ĉi tiu solvo havas riĉan funkciecon, sed agordi kaj funkcii ĝin ĝenerale por mult-wan estas sufiĉe ĝena. Nur unu ekzemplo: se vi venas al iuj retejoj de du IP-adresoj samtempe, ili eble ne ŝatas ĝin, ili ĉesos funkcii => "Interreto ne funkcias."

Konsiderante ĉi tiun sperton, mi decidis, ke multihoming ankoraŭ ne estas prioritato, nur malsukceso. Kvankam, ŝajnas, ke en la plej novaj versioj de Linukso ĉio devus funkcii per unu komando kiel:

ip route add default 
    nexthop via 192.168.1.1 weight 10 
    nexthop via 192.168.2.1 weight 5

Do, por eviti ununuran malsukcesan punkton, ni prenas 2 BPI-ojn, ligas ĉiun al unu provizanto, ligas ilin unu al la alia kaj faras la ligon inter si dinamikan vojigon per birdo/OSPF.

Poste, ni reklamas la saman IP-adreson ĉe ĉiu se la servo disponeblas (Interreto, DNS). Tio estas, ni mem ne starigos la defaŭltan itineron, sed tra birdo. Mi spionis la solvon tie .

Ĉi tiu funkcio ankoraŭ ne estis efektivigita, la insida koronaviruso ludis ĉi tie (ne ĉio alvenis de Aliexpress; alia reta vendejo, Layta, promesis liveri post semajno, sed pasis pli ol monato; la dua provizanto ne havis tempon. etendi la kablon antaŭ kvaranteno, nur sukcesis enigi truon en borilo en la muron por la kablo).

Kiel mendi R64

La tabulo mem estas en la oficiala vendejo SinoVoip.
Ankaŭ estas pli bone mendi tuj:

  • nutrado + informu la normon pri ŝtopilo de EU aŭ Usono
  • varmego: radiatoroj/ventoliloj; ĉar kaj la CPU kaj la ŝaltila blato varmiĝas
  • anteno por wifi, ekzemple

Estas nuanco - la liverprezo fariĝis neadekvate alta en la oficiala vendejo dum iom da tempo. Administranto Judy Huang konvinkis min, ke ne estis eraro, kaj vi povus elekti ePacket por $5, sed mi vidis, ke por Rusio ekzistas nur EMS por >$33. Malagrabla, sed ne kritika. Krome, se vi elektas iun alian landon por liveraĵo (mi trapasis ĉiujn kontinentojn), livero kostos ~$5. Rusofoboj?.. Sed tiam mi trovis, ke ankaŭ por Francio la liverprezo estas ~30$, kaj mi trankviliĝis.

Kiel rezulto, Judi proponis fari mendon, sed ne pagi (aludo: metu malpli sur la karton por ke la aŭtomata pago ne trairu); skribu al ŝi kaj ŝi reduktos la liverprezon al normalo. Sukceso.

temoj

Ankoraŭ ne ĉio funkcias perfekte.

Produkteco

Ansible=Python-komandoj estas ekzekutitaj malrapide, eĉ neaktivaj, dum 20-30 sekundoj; grandordo pli longa ol sur x86-tekkomputilo. Krome, komence ili estas ekzekutitaj sufiĉe rapide, ~3 sekundoj, poste ili akre malrapidiĝas. Ĉi tio povas ŝuldiĝi al la CPU-varmiĝo (streĉo). La Go-kodo ankaŭ bezonas longan tempon por funkcii:

# запрос метрик для прометея из 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 funkcias, sed ĉe Armbian ĝi ĉesas post ĉirkaŭ unu tago, skribas:

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
...

Nur rekomenco helpas. Ni devas pluiri ordigi.

ethernet

Eterreto funkcias, sed post ~64 horoj pakoj (DHCP) de RXNUMX ĉesas alveni.
Rekomenci la interfacon helpas:

ifdown br0; sleep 30; ifup br0

La ŝoforo estas nova, ĝi ankoraŭ ne estis akceptita en la kernon, mi esperas, ke ĝi estas ĉina Landen Chao finas ĝin.

fonto: www.habr.com

Aldoni komenton