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卡加载操作系统:download by
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]
接下来,您需要将预加载器写入特殊的引导分区
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)放在桌子上,以免将以太网电缆从互联网源穿过整个房间/办公室连接到它。 事实是,一方面,你需要给这块铁提供互联网,另一方面,这块铁里的一切都可能坏掉,尤其是Wifi。
首先,我决定购买一个便宜的 USB-Wifi“哨子”,将其插入 BPI 上唯一的端口,然后忘记电线。 为了做到这一点,我购买了一个便宜的 TP-LINK TL-WN725N USB 2.0,但很快就发现它不会起飞:为了让哨子工作,需要一个内核驱动程序,当然,这个驱动程序不存在(后来我编译了必要的RTL8XXXU驱动,但还是不切实际)。 而且网线一度破坏了房间的视野。
结果,我在 Tenda MW3(Wifi 网状系统)的帮助下设法摆脱了电缆:我只需将一个立方体放在桌子下面,然后用一米以太网电缆将 BPI 连接到后者的 LAN 端口。 成功。
Wireguard、RKN、Bird
我使用 Banana PI 的目的之一是可以免费访问被 RKN 屏蔽的网站,特别是这样 Telegram 和 Slack 的呼叫都可以正常工作。 关于该主题的文章已在 Habré 上提出:
我使用 Ansible 实现了这样一个解决方案的部署:
VPS 应该运行 Ubuntu 18.04。 我检查了欧洲两家托管商的性能:亚马逊和 Digital Ocean。
因此,我们在 R64 上安装了上述 Armbian,可以通过 ssh 使用该名称 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
实施的
他怎么想
监控。 普罗米修斯
Total:telegram 可以用,linkedin 和pornhub 也可以,总体来说,用户体验还可以。 但任何东西都会破碎,中国的铁块也不例外。
内核更新也可能很有趣:例如,我想更新内核 5.4 => 5.6,嗯,有开箱即用的 Wireguard,无需打补丁...说来就做:煞费苦心地将补丁从 5.4 转移到5.6,内核启动,到 VPS 的隧道已 ping 通,但 Bird 无法连接,错误“BGP 错误”…“惊恐地回滚”(c) 至 5.4; TODO 中推迟到 5.6。
因此,除了安装路由器和VPS之外,我还添加了监控(在x86 Ubuntu 18.04上),它安装在具有以下组件的单独主机上:
- prometheus、alertmanager、blackbox_exporter - 全部在 docker 中
- 使用 Metalmatze/alertmanager-bot 机器人将警报发送到电报频道 - 也在 docker 中
- 为机器人提供tor,以便机器人可以在互联网可用时发出警报,但电报仍然不起作用,并且机器人本身无法连接
- 已应用
警报 :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、任播故障转移
除了一切之外,我还计划连接到两个提供商,以便互联网能够继续工作,即使其中一个提供商出现网络问题,或者他们忘记支付互联网费用等等,以及其他人为因素。
描述了关于多WAN主题的最先进的用户体验
鉴于这次经验,我认为多宿主还不是优先考虑的事情,只是故障转移。 尽管看起来在最新版本的 Linux 中,一切都应该使用一个命令,例如:
ip route add default
nexthop via 192.168.1.1 weight 10
nexthop via 192.168.2.1 weight 5
因此,为了避免单点故障,我们采用 2 个 BPI,每个 BPI 连接到一个提供商,将它们连接在一起,并通过 Bird/OSPF 动态路由彼此之间的通信。
此外,如果服务可用(互联网、DNS),我们会在每个设备上公布相同的 IP 地址。 就是我们不会自己放下默认路由,而是通过bird。 解决方案窥探
这个功能还没有实现,阴险的冠状病毒搞砸了(不是所有东西都来自速卖通;另一家网上商店 Layta 承诺一周内发货,一个多月过去了;第二家提供商没能延长交货期)隔离前的电缆,只能在墙上打一个洞来钻电缆)。
如何订购 R64
主板本身在官方商店
最好立即订购:
有一个细微差别 - 从一段时间以来,官方商店的送货价格变得不够高。 经理Judy Huang向我保证没有错误,你可以选择ePacket 5美元,但我看到俄罗斯只有EMS >33美元。 不愉快,但并不重要。 此外,如果您选择任何其他国家送货(我走遍了所有大洲),送货费用约为 5 美元。 俄罗斯恐惧症?...但后来我发现法国的运费也~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
...
只有重新启动才有帮助。 我们需要走得更远
以太网(EtherNet)
以太网可以工作,但大约一天后,来自 R64 的数据包 (DHCP) 停止发送。
重新启动界面有助于:
ifdown br0; sleep 30; ifup br0
驱动是新的,内核还没有被接受,希望中文兰登潮
来源: habr.com