Banana Pi 64 是類似於 Raspberry Pi 的單板計算機,但具有多個以太網端口,使其成為通用的 Linux 分佈式路由器。
是的,Openwrt 已經存在,但它有自己的 GUI 和 CLI; 有 Mikrotik,但它也有自己的 GUI / CLI,並且 Wireguard 不是開箱即用的......總的來說,我想要一個具有靈活設置的路由器,同時保持在你使用的標準 Linux 的框架內每天。
在名為 BPI、R64、單板的文章中,我指的是同一件事 - Banana Pi R64 單板本身。
圖像選擇。 通過 eMMC 下載
與人一起工作時獲得的第一項技能
通過 USB-UART 連接到 R64 的算法:
- 跑到收音機配件店買一根 USB-UART 電纜(PL2303,串口轉 USB)
- 我們把USB一端接電腦,UART接R64,四線三選一,如下圖
- 在電腦控制台運行
sudo minicom
之後,大多數情況下,單板控制台會出現=成功。
你可以看到更多
接下來,最簡單的方法是從 SD 卡加載操作系統:通過以下方式下載
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
我們將卡插入 R64 SD 插槽,打開它,首先在連接的控制台上觀察 uboot 的加載,然後是標準的 Linux 啟動。
另一種啟動選項是使用已嵌入 R64 中的 8Gb 卡,稱為 eMMC。 根據wiki上的說明,我們將鏡像重寫到設備中
/dev/mmcblk0 到 BPI,重新啟動,移除 SD 卡,再次啟用 BPI……但它不起作用。 到那裡怎麼走 Boot select
不要堅持。
事實上,至少對於 BPI,您需要設置一個特殊標誌,以便能夠從內部閃存驅動器啟動:
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]
接下來需要將preloader寫入特殊的boot分區
root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0
R64 製造商(中國)發布了這個二進製文件
一般來說,在那之後,圖像開始從 eMMC 加載。 如果您想弄清楚並從頭開始創建圖像,那麼對於這兩種情況(SD / eMMC),您都需要編寫更多文件(SD 卡的預加載器、ATF、u-boot),只是為了進入內核引導。 這個話題還是
現在,說實話,我不使用eMMC下載,SD卡就夠了,但我花了很多時間讓它工作,所以讓它在文章中。
操作系統的選擇。 阿比亞人
第一個應用程序任務是啟動VPN,當然是Wireguard。 馬上發現不是從內核端組裝的,也沒有頭文件。 我重建了內核,出於對 x86 的習慣,我使用 DKMS 構建了內核模塊。 然而,即使是小型實用程序在 arm64 上的組裝速度也讓我感到不快。 然後需要另一個內核模塊,依此類推。 總的來說,事實證明,所有與內核相關的東西都最好在熱管x86筆記本電腦上組裝,然後通過簡單的複制轉移到R64,重新啟動並測試。
另一件事是用戶空間部分。 在我選擇 Debian 的情況下,arm64 架構的所有內容都已經在 packages.debian.org 上了,不需要重建任何東西。
為了不生產另一輛自行車,我
或者更確切地說:用戶空間部分是 Armbian,核心是從存儲庫中獲取的
R64 軟件部分的所有開發活動均在
工作區組織:電線
另外,我想告訴您如何在開發/測試期間將 SBC(不僅僅是 BPI)放在桌子上,以免通過整個房間/辦公室將以太網電纜從 Internet 源連接到它。 事實是,一方面,您需要為這塊鐵提供互聯網,另一方面,這塊鐵中的一切都可能壞掉,尤其是 Wifi。
首先,我決定買一個便宜的 USB-Wifi“哨子”,將它插入 BPI 上唯一的端口而忘記電線。 為此,我購買了一個便宜的 TP-LINK TL-WN725N USB 2.0,但很快就發現它不會起飛:為了讓哨聲正常工作,需要一個內核驅動程序,當然,內核驅動程序不存在(後來自己編譯了必要的RTL8XXXU驅動,但還是不行)。 以太網電纜有一段時間毀了房間的景色。
結果,在 Tenda MW3(Wifi 網狀系統)的幫助下,我設法擺脫了電纜:我只是將一個立方體放在桌子下面,然後用一根米以太網電纜將 BPI 連接到後者的 LAN 端口。 成功。
Wireguard,RKN,鳥
我使用 Banana PI 的其中一件事是可以免費訪問被 RKN 阻止的站點,特別是這樣 Telegram 和對 Slack 的調用就可以正常工作。 已經在 Habré 上提出了關於該主題的文章:
我使用 Ansible 實施了這樣一個解決方案的部署:
VPS 應該運行 Ubuntu 18.04。 我檢查了歐洲兩個主機的性能:Amazon 和 Digital Ocean。
所以,我們在 R64 上安裝了上面的 Armbian,它可以通過 ssh 以 name hm-bananapi-1
並且可以上網。 我們按順序部署 ansible 自動化腳本並在 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
接下來,您需要以相同的方式將我們的VPN部署到VPS:
ansible-playbook ./router.py -l current-vpn
在這裡,參數始終是 current-vpn,VPS 名稱本身是在一個變量中配置的(在本例中,它是 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
哦,是的,在所有這些操作之前,您需要在文件夾中生成機密(特別是 Wireguard 密鑰) ./secrets
, 目錄應該是這樣的
Python 中的 Ansible 自動化
您可能會注意到,Ansible 命令不是 YAML 格式,而是用 Python 腳本編碼的。 為了比較,如何以通常的方式啟用 bird 守護進程:
- name: start bird
systemd:
name: bird
state: started
enabled: yes
以及如何通過 Python 實現相同:
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
使用 Python 代碼編寫 Ansible 命令允許您重用代碼,並且通常,通用語言的所有可能性都是開放的。 比如在R64和VPS上安裝bird:
install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")
見功能代碼
此功能稱為 pybook
實施的
他怎麼想
監控。 普羅米修斯
總計:telegram works,linkedin 和 pornhub 也行,總的來說,用戶體驗還可以。 但任何東西都會破碎,中國的鐵塊也一樣。
內核更新也可以很有趣:例如,我想更新內核 5.4 => 5.6,好吧,開箱即用的 Wireguard,無需打補丁......說到做到:煞費苦心地將補丁從 5.4 轉移到5.6,內核啟動,通向 VPS 的隧道被 ping 通了,但是 bird 無法連接,出現錯誤“BGP 錯誤”……“驚恐地回滾”(c) 到 5.4; 遷移到 5.6 在 TODO 中被推遲。
因此,除了安裝路由器和VPS之外,我還添加了監控(在x86 Ubuntu 18.04上),它安裝在一個單獨的主機上,具有以下組件:
- prometheus、alertmanager、blackbox_exporter - 都在 docker 中
- 使用 metalmatze/alertmanager-bot 機器人將警報發送到電報頻道——也在 docker 中
- bot 的 tor,這樣 bot 可以在 Internet 可用時發出警報,但電報仍然無法正常工作,並且 bot 本身無法連接
- 應用
警報 : NodeVPNTroubles(沒有 ping 到 VPS),BirdVPNTroubles(沒有 Bird 會話),AntifilterDownloadTroubles(無法加載被阻止的 IP 地址),SiteTroubles(不幸的電報不可用) - 系統警報,如 HostGrowingDiskReadLatency(停止讀取便宜的 SD 卡)
監控設置示例:
ansible-playbook ./monitoring.py -l monitoring-preprod
prometheus的Auto Discovery設置在/etc/prometheus/auto_http文件夾下,添加主機監控示例(默認不監控主機):
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 個提供者、2 個 BPI、任播故障轉移
除了一切,我計劃連接到兩個供應商,這樣互聯網就可以繼續工作,即使一個供應商的網絡出現問題,或者他們忘記為互聯網付費等等,以及其他人為因素。
描述了關於 multi-wan 主題的最先進的用戶體驗
鑑於這種經驗,我決定多宿主不是優先事項,只有故障轉移。 雖然看起來在最新版本的 linux 中一切都應該使用一個命令,如:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
因此,為了不存在單點故障,我們採用 2 個 BPI,每個連接到一個提供商,將它們連接在一起,並通過 bird / OSPF 通過動態路由相互通信。
此外,如果服務可用(Internet、DNS),我們會在每個服務上公佈相同的 IP 地址。 也就是我們不會自己放下默認路由,而是通過bird。 偵測到的解決方案
此功能尚未實現,陰險的冠狀病毒搞砸了(不是所有東西都來自速賣通;另一家在線商店 Layta 承諾在一周內送貨,但一個多月過去了;第二家供應商未能延長檢疫前的電纜,只能設法在牆上打個洞來鑽電纜)。
如何訂購 R64
董事會本身在官方商店
最好立即訂購:
有一個細微差別-一段時間以來,官方商店的交貨價格已經變得不夠高。 Judy Huang經理向我保證沒有弄錯,你可以選擇ePacket 5美元,但我看到俄羅斯只有EMS,價格>33美元。 令人不快,但並不重要。 此外,如果您選擇任何其他國家/地區送貨(我走遍了所有大洲),送貨費用為 ~5 美元。 Russophobes?.. 但後來我發現法國的運費也是 ~$30,然後冷靜下來。
結果,Judy主動提出下單,但不付款(暗示: 減少卡上的金額,這樣付款就不會自動完成); 寫信給她,她會把運費降到正常水平。 成功。
探讨问题
並非一切都完美無缺。
Производительность
Ansible=Python命令執行緩慢,即使是空閒的,也要20-30秒; 比 x86 筆記本電腦長一個數量級。 此外,起初它們執行得非常快,大約 3 秒,然後它們急劇減速。 這可能是由於 CPU 發熱(節流)造成的。 Go 代碼也長時間運行:
# запрос метрик для прометея из 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 工作,但大約一天后停止在 Armbian 上,寫道:
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
...
只有重新啟動有幫助。 我們需要走得更遠
乙太網路 - ENET
以太網工作,但在〜一天后來自 R64 的數據包(DHCP)停止到來。
重新啟動界面有助於:
ifdown br0; sleep 30; ifup br0
驅動是新的,內核還沒有接受,希望中文藍登超
來源: www.habr.com