Il Banana Pi 64 è un computer a scheda singola simile al Raspberry Pi, ma con più porte Ethernet, che lo rendono un router di distribuzione Linux generico.
Sì, Openwrt esiste già, ma ha la sua GUI e CLI; c'è Mikrotik, ma ancora una volta ha la sua GUI / CLI e Wireguard non funziona fuori dagli schemi ... In generale, voglio un router con impostazioni flessibili, pur rimanendo all'interno del framework di Linux standard, con cui lavori ogni giorno.
Nell'articolo sotto i nomi BPI, R64, scheda singola, intendo la stessa cosa: la stessa scheda singola Banana Pi R64.
Selezione delle immagini. Scarica tramite eMMC
La primissima abilità da acquisire quando si lavora con SBC in generale, e con R64 in particolare, significa imparare a caricare un sistema operativo al suo interno ed essere in grado di interagire con esso, perché R64 non ha una porta monitor (HDMI, per esempio). Quando tutto è caduto - Wifi ha smesso di funzionare, rete Ethernet, Bluetooth, USB, ecc. c'è un UART, attraverso l'interfaccia di cui puoi sempre vedere cosa è andato storto ed eseguire anche un paio di comandi dalla console, se necessario.
Algoritmo di connessione a R64 tramite USB-UART:
corri al negozio di ricambi radio per un cavo USB-UART (PL2303, Serial-to-USB)
colleghiamo un'estremità USB al computer e l'altra, UART, a R64, con tre fili su quattro, come nella figura sotto
nell'esecuzione della console del computer sudo minicom
Successivamente, nella maggior parte dei casi, apparirà la console a scheda singola = successo.
Puoi vedere di più qui.
Successivamente, il modo più semplice è caricare il sistema operativo dalla scheda SD: scarica da collegamento immagine e caricala:
inseriamo la scheda nello slot SD R64, la accendiamo, osserviamo il caricamento di uboot prima sulla console collegata, quindi l'avvio standard di Linux.
Un'opzione di avvio alternativa utilizza una scheda da 64 Gb già incorporata nell'R8, chiamata eMMC. Secondo le istruzioni sul wiki, riscriviamo l'immagine sul dispositivo
/dev/mmcblk0 su BPI, riavvia, rimuovi la scheda SD, abilita di nuovo BPI ... e non funziona. Come arrivare là Boot select non tenere duro.
Il fatto è che almeno per BPI è necessario impostare un flag speciale per poter eseguire l'avvio da un'unità flash interna:
Il produttore di R64 (Cina) ha pubblicato questo file binario qui. Quello che fa è sconosciuto (non ci sono codici sorgente), ma senza di lui non funzionerà neanche.
In generale, dopodiché, le immagini iniziano a caricarsi da eMMC. Se vuoi capirlo e creare immagini da zero, allora per entrambi i casi (SD / eMMC) devi scrivere qualche altro file (preloader per la scheda SD, ATF, u-boot), solo per arrivare al kernel stivale. Questo argomento è ancora si sta sviluppando, ma per noi la cosa principale è che funzioni e vada bene.
Ora, a dire il vero, non uso il download di eMMC, le schede SD sono sufficienti, ma ho passato parecchio tempo a farlo funzionare, quindi lascia che sia nell'articolo.
Scelta del sistema operativo. armbiano
La prima attività dell'applicazione è avviare una VPN, ovviamente Wireguard. Si è subito scoperto che non era assemblato dal lato del kernel e non c'erano intestazioni. Ho ricostruito il kernel e, per abitudine con x86, ho creato il modulo del kernel usando DKMS. Tuttavia, la velocità di assemblaggio su arm64 anche di piccole utilità mi ha spiacevolmente sorpreso. E poi è stato richiesto un altro modulo del kernel, e così via. In generale, si scopre che è meglio assemblare tutto ciò che riguarda il kernel su un laptop x86 warm-tube, quindi trasferirlo su R64 mediante semplice copia, riavviare e testare.
Un'altra cosa è la parte dello spazio utente. Nel mio caso di scelta di Debian, tutto per l'architettura arm64 è già su packages.debian.org e non c'è bisogno di ricostruire nulla.
Per non produrre un'altra bicicletta, I portatoarminiano su BPI R64.
O meglio: la parte userspace è Armbian, e il core è preso dal repository Frank-UN. L'ultima immagine può essere scaricata qui.
Tutta l'attività sullo sviluppo della parte software di R64 viene svolta su foro. In generale, il produttore stesso cerca di rendere popolare il router Openwrt, ma grazie all'attività dello sviluppatore Frank dalla Germania, tutte le funzionalità finiscono rapidamente nel kernel Debian. Sorprendentemente, Frank è attivo in ogni thread del forum.
Organizzazione dello spazio di lavoro: fili
Separatamente, voglio dirti come posizionare l'SBC (non solo BPI) sul tavolo durante lo sviluppo / test in modo da non condurre un cavo Ethernet dalla fonte Internet attraverso l'intera stanza / ufficio. Il fatto è che, da un lato, devi fornire Internet al pezzo di ferro e, dall'altro, tutto può rompersi in questo pezzo di ferro, e soprattutto il Wifi.
Per prima cosa ho deciso di acquistare un "fischio" USB-Wifi economico, collegarlo all'unica porta del BPI e dimenticare i cavi. Per fare questo, ho acquistato un economico TP-LINK TL-WN725N USB 2.0, ma ben presto è diventato chiaro che non sarebbe decollato: perché il fischio funzionasse, era necessario un driver del kernel, che, ovviamente, non c'era (successivamente ho compilato il driver RTL8XXXU necessario, ma è ancora poco pratico). E il cavo ethernet ha rovinato per un po' la vista della stanza.
Di conseguenza, sono riuscito a sbarazzarmi del cavo con l'aiuto di Tenda MW3 (sistema Wi-Fi mesh): ho semplicemente posizionato un cubo sotto il tavolo e ho collegato il BPI alla porta LAN di quest'ultimo con un metro di cavo Ethernet. Successo.
Wireguard, RKN, Uccello
Una delle cose per cui utilizzo Banana PI è avere libero accesso ai siti bloccati dall'RKN, in particolare, in modo che Telegram e le chiamate a Slack funzionino. Su Habré sono già stati proposti articoli su questo argomento: tempo, два, tre.
Ho implementato la distribuzione di una tale soluzione utilizzando Ansible: collegamento.
Il VPS dovrebbe eseguire Ubuntu 18.04. Ho controllato le prestazioni su due hoster in Europa: Amazon e Digital Ocean.
Quindi, abbiamo installato l'Armbian di cui sopra su R64, è disponibile tramite ssh con il nome hm-bananapi-1 e ha accesso a Internet. Distribuiamo script di automazione ansibili in sequenza ed eseguiamo l'installazione stessa su 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
Successivamente, devi distribuire la nostra VPN al VPS nello stesso modo:
ansible-playbook ./router.py -l current-vpn
Qui, l'argomento è sempre current-vpn e il nome VPS stesso è configurato in una variabile (in questo caso, è paris-vpn-aws-t2-micro-1):
Eh si, prima di tutte queste operazioni, bisogna generare i segreti (in particolare le chiavi Wireguard) in una cartella ./secrets, la directory dovrebbe essere simile a così.
Automazione Ansible in Python
Potresti notare che invece del formato YAML, i comandi Ansible sono codificati in script Python. Per confronto, come abilitare il demone uccello nel solito modo:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
Scrivere comandi Ansible con codice Python consente di riutilizzare il codice e, in generale, sono aperte tutte le possibilità di un linguaggio generico. Ad esempio, installando bird su R64 e VPS:
Totale: telegram funziona, linkedin e anche pornhub, in generale, l'esperienza dell'utente è ok. Ma tutto può rompersi, e anche pezzi di ferro cinesi.
Anche gli aggiornamenti del kernel possono essere interessanti: ad esempio, volevo aggiornare il kernel 5.4 => 5.6, beh, c'è Wireguard pronto all'uso, non c'è bisogno di patch ... Detto fatto: patch trasferite con cura da 5.4 a 5.6, il kernel è stato avviato, il tunnel verso il VPS ha eseguito il ping, ma bird non riesce a connettersi con l'errore "Errore BGP"… "Rollback in horror" (c) a 5.4; il passaggio a 5.6 è stato posticipato in TODO.
Pertanto, oltre all'installazione del router e del VPS, ho aggiunto il monitoraggio (su x86 Ubuntu 18.04), che è installato su un host separato con i seguenti componenti:
prometheus, alertmanager, blackbox_exporter - tutto nella finestra mobile
gli avvisi vengono inviati al canale Telegram utilizzando il bot metalmatze/alertmanager-bot - anche nella finestra mobile
tor per il bot, in modo che il bot possa avvisare situazioni quando Internet è disponibile, ma il telegramma continua a non funzionare e il bot stesso non può connettersi
applicato avvisi: NodeVPNTroubles (nessun ping al VPS), BirdVPNTroubles (nessuna sessione Bird), AntifilterDownloadTroubles (impossibile caricare gli indirizzi IP bloccati), SiteTroubles (sfortunato telegramma non disponibile)
avvisi di sistema come HostGrowingDiskReadLatency (la scheda SD economica smette di essere letta)
Il rilevamento automatico per prometheus è impostato sulla cartella /etc/prometheus/auto_http, un esempio di aggiunta di un host al monitoraggio (gli host non sono monitorati per impostazione predefinita):
Oltre a tutto, avevo in programma di connettermi a due provider in modo che Internet continuasse a funzionare, anche se un provider avesse avuto problemi con la rete, o si fosse dimenticato di pagare per Internet, ecc., e altri fattori umani.
Viene descritta l'esperienza utente più avanzata sull'argomento multi-wan qui per il sistema Mwan3 sotto Openwrt. Questa soluzione ha una ricca funzionalità, ma l'impostazione e il funzionamento in generale per multi-wan è piuttosto problematico. Solo un esempio: se arrivi su alcuni siti da due indirizzi IP contemporaneamente, potrebbe non piacergli, smetteranno di funzionare => "Internet non funziona".
Data questa esperienza, ho deciso che il multihoming non è ancora una priorità, solo il failover. Anche se sembra che nelle ultime versioni di Linux tutto dovrebbe funzionare con un comando come:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
Quindi, in modo che non ci sia un singolo punto di errore, prendiamo 2 BPI, ciascuno connesso a un provider, li colleghiamo insieme e comunichiamo tra loro tramite routing dinamico tramite bird / OSPF.
Inoltre, su ciascuno annunciamo lo stesso indirizzo IP se il servizio è disponibile (Internet, DNS). Cioè, non stabiliremo noi stessi il percorso predefinito, ma tramite bird. La soluzione spiata qui .
Questa funzionalità non è stata ancora implementata, l'insidioso coronavirus ha incasinato (non tutto è arrivato da aliexpress; un altro negozio online, Layta, ha promesso di consegnare in una settimana, ed è passato più di un mese; il secondo fornitore non è riuscito ad allungare il cavo prima della quarantena, è riuscito solo a fare un buco nel muro per far passare il cavo).
Come ordinare R64
La scheda stessa nel negozio ufficiale SinoVoip.
È anche meglio ordinare subito:
nutrizione + informa lo standard di spina UE o USA
dissipatore di calore: radiatori/ventole; perché sia la CPU è riscaldata, sia il chip dello switch
C'è una sfumatura: il prezzo della consegna da qualche tempo è diventato troppo alto nel negozio ufficiale. Il manager Judy Huang mi ha assicurato che non ci sono stati errori e puoi scegliere ePacket per $ 5, ma ho visto che per la Russia c'è solo EMS per> 33 $. Sgradevole, ma non critico. Inoltre, se scegli un altro paese per la consegna (ho attraversato tutti i continenti), la consegna costerà ~5$. Russofobi? .. Ma poi ho scoperto che anche per la Francia il prezzo di consegna è di ~ $ 30 e mi sono calmato.
Di conseguenza, Judy si è offerta di effettuare un ordine, ma non di pagare (accennare: mettere meno sulla carta in modo che il pagamento non vada a buon fine automaticamente); scrivile e ridurrà il prezzo di spedizione alla normalità. Successo.
Problema
Non tutto funziona ancora perfettamente.
Производительность
Ansible=i comandi Python vengono eseguiti lentamente, anche quelli inattivi, per 20-30 secondi; un ordine di grandezza più lungo rispetto a un laptop x86. Inoltre, all'inizio vengono eseguiti abbastanza rapidamente, ~ 3 secondi, quindi rallentano bruscamente. Forse questo è dovuto al riscaldamento della CPU (throttling). Anche il codice Go è di lunga durata:
# запрос метрик для прометея из 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
Il wifi funziona, ma si ferma su Armbian dopo circa un giorno, scrive: