Banana Pi 64 to komputer jednopłytkowy podobny do Raspberry Pi, ale z wieloma portami Ethernet, co czyni go uniwersalnym routerem do dystrybucji Linuksa.
Tak, Openwrt już istnieje, ale ma własne GUI i CLI; jest Mikrotik, ale znowu ma swój własny GUI/CLI, a Wireguard nie działa od razu... Generalnie chcę router z elastycznymi ustawieniami, pozostając jednocześnie w ramach standardowego Linuksa, z którym pracujesz codziennie.
W artykule pod nazwami BPI, R64, single-board, będę miał na myśli to samo - samą jednopłytkę Banana Pi R64.
Wybór obrazu. Pobierz przez eMMC
Pierwsza umiejętność, którą należy zdobyć podczas pracy z SBC ogólnie, aw przypadku R64 w szczególności, oznacza to nauczenie się ładowania do niego systemu operacyjnego i możliwości interakcji z nim, ponieważ R64 nie ma portu monitora (na przykład HDMI). Kiedy wszystko się zepsuło - Wi-Fi przestało działać, sieć Ethernet, Bluetooth, USB itp. jest UART, przez którego interfejs zawsze możesz zobaczyć, co poszło nie tak, a także, jeśli to konieczne, uruchomić kilka poleceń z konsoli.
Algorytm połączenia z R64 przez USB-UART:
biegnij do sklepu z częściami radiowymi po kabel USB-UART (PL2303, Serial-to-USB)
jedną końcówkę USB podłączamy do komputera, a drugą, UART, do R64, trzema z czterech przewodów, jak na obrazku poniżej
w uruchomieniu konsoli komputera sudo minicom
Następnie w większości przypadków pojawi się konsola jednopłytkowa = sukces.
Możesz zobaczyć więcej tutaj.
Następnie najłatwiejszym sposobem jest załadowanie systemu operacyjnego z karty SD: pobierz przez powiązanie zdjęcie i wgraj:
wkładamy kartę do gniazda R64 SD, włączamy ją, obserwujemy najpierw ładowanie uboot na podłączonej konsoli, a następnie standardowy rozruch Linuksa.
Alternatywną opcją rozruchu jest użycie karty 64 Gb już wbudowanej w R8, zwanej eMMC. Zgodnie z instrukcjami na wiki przepisujemy obraz na urządzenie
/dev/mmcblk0 do BPI, uruchom ponownie, wyjmij kartę SD, ponownie włącz BPI ... i to nie działa. Jak się tam dostać Boot select nie trzymaj się.
Faktem jest, że przynajmniej dla BPI musisz ustawić specjalną flagę, aby móc uruchomić komputer z wewnętrznego dysku flash:
Producent R64 (Chiny) opublikował ten plik binarny tutaj. Nie wiadomo, co robi (nie ma kodów źródłowych), ale bez niego też nie zadziała.
Ogólnie rzecz biorąc, po tym obrazy zaczynają się ładować z eMMC. Jeśli chcesz to rozgryźć i tworzyć obrazy od podstaw, to w obu przypadkach (SD/eMMC) musisz napisać jeszcze kilka plików (preloader na kartę SD, ATF, u-boot), aby dostać się do jądra uruchomić. Ten temat jest nadal rozwija się, ale dla nas najważniejsze jest to, że działa i jest w porządku.
Szczerze mówiąc, nie korzystam z pobierania eMMC, wystarczą karty SD, ale spędziłem sporo czasu, aby to działało, więc niech będzie w artykule.
Wybór systemu operacyjnego. ormiański
Pierwszym zadaniem aplikacji jest uruchomienie VPN, oczywiście Wireguard. Od razu okazało się, że nie został zmontowany od strony jądra i nie ma nagłówków. Przebudowałem jądro i z przyzwyczajenia do x86 zbudowałem moduł jądra przy użyciu DKMS. Jednak szybkość montażu na ramieniu64 nawet niewielkich narzędzi niemile mnie zaskoczyła. A potem potrzebny był inny moduł jądra i tak dalej. Ogólnie rzecz biorąc, okazuje się, że wszystko, co dotyczy jądra, lepiej jest zmontować na laptopie x86 z ciepłą rurką, a następnie przenieść na R64 przez proste skopiowanie, ponowne uruchomienie i przetestowanie.
Kolejną rzeczą jest część przestrzeni użytkownika. W moim przypadku wybrania Debiana wszystko dla architektury arm64 jest już na packages.debian.org i nie ma potrzeby niczego przebudowywać.
Aby nie produkować kolejnego roweru, I przeniesionyarmbianski na BPI R64.
A raczej: część przestrzeni użytkownika to Armbian, a rdzeń jest pobierany z repozytorium Szczery-A. Najnowszy obraz można pobrać tutaj.
Cała działalność związana z rozwojem części programowej R64 jest prowadzona na forum. Ogólnie rzecz biorąc, producent sam dąży do spopularyzowania routera Openwrt, ale dzięki aktywności dewelopera Franka z Niemiec wszystkie funkcje szybko lądują w jądrze Debiana. Co zaskakujące, Frank jest aktywny we wszystkich wątkach na forum.
Organizacja miejsca pracy: przewody
Osobno chcę powiedzieć, jak umieścić SBC (nie tylko BPI) na stole podczas opracowywania / testowania, aby nie poprowadzić do niego kabla Ethernet ze źródła Internetu przez całe pomieszczenie / biuro. Faktem jest, że z jednej strony trzeba zapewnić Internet do kawałka żelaza, az drugiej strony wszystko może się zepsuć w tym kawałku żelaza, a zwłaszcza Wi-Fi.
Najpierw zdecydowałem się na zakup taniego „gwizdka” USB-Wifi, wpięcie go do jedynego portu na BPI i zapomnij o przewodach. Aby to zrobić, kupiłem niedrogi TP-LINK TL-WN725N USB 2.0, ale bardzo szybko stało się jasne, że nie wystartuje: aby gwizdek działał, potrzebny był sterownik jądra, którego oczywiście nie było (później skompilowałem niezbędny sterownik RTL8XXXU, ale nadal jest to niepraktyczne). A kabel ethernetowy na chwilę zepsuł widok pokoju.
W rezultacie udało mi się pozbyć kabla za pomocą Tenda MW3 (system Wifi mesh): po prostu umieściłem jedną kostkę pod stołem i podłączyłem BPI do portu LAN tego ostatniego za pomocą metrowego kabla Ethernet. Powodzenie.
Wireguard, RKN, Bird
Jedną z rzeczy, do których używam Banana PI, jest swobodny dostęp do stron zablokowanych przez RKN, w szczególności po to, aby Telegram i połączenia do Slacka działały. Artykuły na ten temat zostały już zaproponowane na Habré: czas, два, trzy.
Wdrożenie właśnie takiego rozwiązania zaimplementowałem za pomocą Ansible: łącze.
VPS powinien działać pod kontrolą Ubuntu 18.04. Sprawdziłem wydajność na dwóch hosterach w Europie: Amazon i Digital Ocean.
Więc zainstalowaliśmy powyższy Armbian na R64, jest dostępny przez ssh pod nazwą hm-bananapi-1 i posiada dostęp do internetu. Wdrażamy sekwencyjnie ansible, automatyzujące skrypty i uruchamiamy samą instalację na 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
Następnie musisz wdrożyć naszą sieć VPN na VPS w ten sam sposób:
ansible-playbook ./router.py -l current-vpn
Tutaj argumentem jest zawsze current-vpn, a sama nazwa VPS jest skonfigurowana w zmiennej (w tym przypadku jest to paris-vpn-aws-t2-micro-1):
O tak, przed wszystkimi tymi operacjami musisz wygenerować sekrety (w szczególności klucze Wireguard) w folderze ./secrets, katalog powinien wyglądać tak.
Automatyzacja Ansible w Pythonie
Możesz zauważyć, że zamiast formatu YAML, polecenia Ansible są zakodowane w skryptach Pythona. Dla porównania, jak włączyć demona ptaka w zwykły sposób:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
Pisanie poleceń Ansible za pomocą kodu Pythona pozwala na ponowne wykorzystanie kodu i ogólnie wszystkie możliwości języka ogólnego przeznaczenia są otwarte. Na przykład instalacja ptaka na R64 i VPS:
Razem: telegram działa, linkedin i pornhub też, ogólnie rzecz biorąc, wrażenia użytkownika są w porządku. Ale wszystko może się zepsuć, także chińskie kawałki żelaza.
Aktualizacje jądra też mogą być interesujące: na przykład chciałem zaktualizować jądro 5.4 => 5.6, cóż, jest Wireguard po wyjęciu z pudełka, nie trzeba łatać… Ledwie powiedziane, już zrobione: mozolnie przeniesione łatki z 5.4 do 5.6, jądro się uruchomiło, tunel do VPS pingował, ale bird nie może się połączyć z błędem „Błąd BGP”… „Cofnięto z przerażeniem” (c) do 5.4; przejście do wersji 5.6 zostało przełożone w TODO.
Dlatego oprócz instalacji routera i VPS dodałem monitoring (na x86 Ubuntu 18.04), który jest instalowany na oddzielnym hoście z następującymi komponentami:
prometheus, alertmanager, blackbox_exporter - wszystko w dockerze
alerty są wysyłane na kanał telegramu za pomocą bota metalmatze/alertmanager-bot - również w dockerze
tor dla bota, aby bot mógł alarmować sytuacje, gdy Internet jest dostępny, ale telegram nadal nie działa, a sam bot nie może się połączyć
stosowany alerty: NodeVPNTroubles (brak pingowania do VPS), BirdVPNTroubles (brak sesji Bird), AntifilterDownloadTroubles (nie udało się załadować zablokowanych adresów IP), SiteTroubles (niefortunny telegram niedostępny)
alerty systemowe, takie jak HostGrowingDiskReadLatency (tania karta SD przestaje być czytana)
Automatyczne wykrywanie dla prometheusa jest ustawione na folder /etc/prometheus/auto_http, przykład dodania hosta do monitorowania (hosty nie są domyślnie monitorowane):
DO ZROBIENIA: 2 dostawców, 2 BPI, przełączanie awaryjne anycast
Oprócz wszystkiego planowałem połączyć się z dwoma dostawcami, aby Internet nadal działał, nawet jeśli jeden dostawca miał problemy z siecią, lub zapomniał zapłacić za Internet itp. I inne czynniki ludzkie.
Opisano najbardziej zaawansowany interfejs użytkownika w temacie multi-wan tutaj dla systemu Mwan3 pod Openwrt. To rozwiązanie ma bogatą funkcjonalność, ale konfiguracja i ogólnie obsługa multi-wan jest dość kłopotliwa. Tylko jeden przykład: jeśli wejdziesz na niektóre strony z dwóch adresów IP jednocześnie, może im się to nie spodobać, przestaną działać => „Internet nie działa”.
Biorąc pod uwagę to doświadczenie, zdecydowałem, że multihoming nie jest jeszcze priorytetem, tylko przełączanie awaryjne. Chociaż wydaje się, że w najnowszych wersjach Linuksa wszystko powinno działać za pomocą jednej komendy typu:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
Tak więc, aby nie było pojedynczego punktu awarii, bierzemy 2 BPI, każdy łączymy się z jednym dostawcą, łączymy je ze sobą i komunikujemy się ze sobą przez dynamiczny routing przez bird / OSPF.
Ponadto na każdym ogłaszamy ten sam adres IP, jeśli usługa jest dostępna (Internet, DNS). Oznacza to, że sami nie ustalimy domyślnej trasy, ale przez ptaka. Rozwiązanie szpiegowało tutaj .
Ta funkcjonalność nie została jeszcze wdrożona, podstępny koronawirus namieszał (nie wszystko pochodziło z aliexpress; inny sklep internetowy Layta obiecał dostarczyć za tydzień, a minął ponad miesiąc; drugi dostawca nie zdążył rozciągnąć kabel przed kwarantanną, udało się tylko zrobić dziurę w ścianie do wywiercenia kabla).
Jak zamówić R64
Sama płytka w oficjalnym sklepie SinoVoip.
Lepiej też zamówić od razu:
Jest pewien niuans - cena dostawy od pewnego czasu stała się nieadekwatnie wysoka w oficjalnym sklepie. Menedżer Judy Huang zapewniła mnie, że nie ma pomyłki i można wybrać ePacket za 5 USD, ale widziałem, że w Rosji jest tylko EMS za >33 USD. Nieprzyjemne, ale nie krytyczne. Ponadto, jeśli wybierzesz inny kraj do dostawy (przejechałem przez wszystkie kontynenty), dostawa będzie kosztować ~5 $. Rusofobów?.. Ale potem dowiedziałem się, że dla Francji cena dostawy również wynosi ~30 USD i uspokoiłem się.
W rezultacie Judy zaproponowała, że złoży zamówienie, ale nie zapłaci (napomknąć: włóż mniej na kartę, aby płatność nie przeszła automatycznie); napisz do niej, a obniży cenę wysyłki do normalnej. Powodzenie.
Zagadnienia
Nie wszystko jeszcze działa idealnie.
produktywność
Ansible=Polecenia Pythona są wykonywane powoli, nawet bezczynne, przez 20-30 sekund; o rząd wielkości dłuższy niż na laptopie x86. Co więcej, na początku są wykonywane dość szybko, ~ 3 sekundy, potem gwałtownie zwalniają. Być może jest to spowodowane nagrzewaniem się procesora (throttling). Kod Go jest również długi:
# запрос метрик для прометея из 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 działa, ale zatrzymuje się na Armbian po około dniu, pisze: