转载:本文出处
https://think8848.cnblogs.com和作者: think8848
本文目的:记录近一个月以来折腾BPI-R4的过程,为后面可能的学习提供参考资料,此外也把折腾中踩过的坑发出来,让更多研究BPI-R4的筒子们少踩坑。
一、需求描述
公司的项目基本都会有去客户现场实施的情况,我们的客户现场一般情况下都不具备上网条件,在没有互联网的情况下项目组人员无论使用搜索引擎查找技术方案,还是在公司的同事也对现场提供技术支撑都非常不便。另外在现场通过手机热点使用Linux Mirrors,Docker Repository、Nuget、Maven、NpmJS等资源都速度较慢,而且流量消耗也比较大;平时公司文件服务器上的开发工具、办公软件等软件不易转输到项目现场。
经历无数次各种受限后,我下决心搞个能在客户项目办公期间实现以下功能的装置:
- 实现高速上网
- 内置开发所需的各种Mirrors、Repository、Registry服务
- 提供各类常用开发和办公软件共享
- 提供Wi-Fi AP(可选)
一站式解决过去的各种不便(而不需要携带多个设备),体积足够小(便于出差时携带)。提高点现场办公的效率,少在现场呆几天时间,这个设备的成本就回来了 😃
带着上述需求确定的硬件需求是:
- CPU:多核CPU,至少在跑Docker时不拉胯
- 内存: ≥ 2GB
- 网络: 支持千兆以太网(最好有一个2.5G网口)
- 5G: 具备5G模块接口
- Wi-Fi: 板载Wi-Fi 6功能或具备Wi-Fi 6模块接口
- 存储: 具备NVMe固态硬盘接口
二、硬件准备
1. BPI-R4开发板
带着需求在T宝上进行搜索,目前发现最符合条件的是BPI-R4,其他或多或少都有一个或几个点没有到位(欢迎熟悉开发板的大佬提供更好的板子)。
产品图片
硬件接口图
硬件规格表
这个板子几乎能满足我全部的需求,同时还具有光口和Wi-Fi7的接口,问题是在我买的时候板子刚刚上市,几乎没有像样的资料(一开始就只有技术规格书,过了差不多大半个月后官方文档才加了不少有用内容),而且Wi-Fi7模块、官方外壳到目前还没有上市,预计在24年一季度末期才会有,建议不愿意/没时间折腾的筒子们二季度视情况购买,到那时板子的资料、固件、外围的配件应该就比较齐全了,上手就能用,不然真是非常的折腾。
免责声明:本文列出了部分我采用的商品链接,本人和这些商家没有任何直接、间接关系,实在是因为我在折腾过程踩坑太多,所以我尽量把我认为不坑或者服务稍好点的供货商放上来,避免筒子们继续踩坑。我觉得产品/商家好不代表大家都觉得好,请自行辨别,本人对所列举的产品和商家不负任何直接或连带责任。
板子的购买地址(板子的生产厂家T宝店):
https://item.taobao.com/item.htm?abbucket=8&id=750678904197&ns=1&spm=a21n57.1.0.0.943b523cPUzb23
主板建议在生产厂家买,我当时是在另一家专门买各类板子的商家店里买的,原因是该商家发货地在上海,我想更快点拿到板子。然而后来一系列的沟通才觉得,应该还是到工厂店买更好,听说在工厂店的订单可以获得厂家更好的技术支持。
2. 电源
根据硬件规格表所示,该板使用DC供电,规格为12V/5.2A or 19V 3.2A
,我在T宝上找了好久也没有找到合适的电源,后来又问卖我板子的商家,他给推荐了一个电源,并称是兼容管方的电源,售价:50元,到货后我发现他发的是12V2A
的电源,质量非常的次,但是确实能正常使用,后来因为这个电源的线又短又硬,实在是难以使用,我只能按照12V2A的规格重新找一个商家,售价:39元,这次没有翻车。商家还送了我一个USB转TTL模块和一个USB读卡器,这两样东西我也没有用过,对于当下手头没有这两样家什的筒子们应该是有用的。
DC电源图片
商家送的读卡器
DC电源购买链接:
Banana Pi BPI-R4高性能开源路由器MT7988A Wifi 7香蕉派R4开发板 配件:电源12V2A【图片 价格 品牌 报价】-京东
3. USB转TLL模块
当时在买BPI-R4的时候,商家给我推荐了一个USB转TTL线,是2303芯片的,
PL2302模块图片
PL2302模块购买链接:
交易快照
接上之后无法正常驱动,出现以下问题:
联系商家后,商家提供了解决方案,见下方链接:
解决"PL2303HXA自2012已停产,请联系供货商" USB不识别的问题
为方便起见,我将驱动程序搬运到此处:点此下载PL2302驱动
这个线使用后终于在启动BPI-R4后能看到屏幕输出了,但是却无法使用键盘进行输入,我一开始怀疑是这条线有问题,因此又买了第二个模块。
CH340模块图片
CH340模块购买链接:
https://item.jd.com/10083021362308.html
CH340驱动下载地址:点此下载CH340驱动
这个模块的优点是链接速度快,使用PL2302模块时不能键盘输入的问题没有了,而且CH340还可以使用跳线设置VCC为3.3v或5v,在接入电脑后有电源指示灯,但缺点也比较明显,裸露的模板,接插不方便,另外它使用很短杜邦线连接BPI-R4,在使用这个模块时必须把板子放到距离电脑USB口很近的地方,无奈之下我又试了一下PL2302,神奇的是我的PL2302连上后板子居然可以接收键盘输入了,好吧,CH340放进抽屉吃灰吧。
结论: 如果只是玩BPI-R4,那还是建议使用上图中PL2302类型的线,确实方便,如果将来还可能调试其他设备,建议使用CH340,功能多且便宜。
4. SD卡
先说结论:非必要不要买大容量的TF卡,一来价格比较贵,高速、可靠、容量大的存储将来还是要靠NVMe硬盘,TF卡差了点意思,过去我ThinkPad上外挂的TF卡经常会出现文件损坏的情况,二来在某些情况下向TF卡烧镜像时总是提示失败,这时候你可能需要低格SD卡,然而SD低格的速度实在是太感人了,你可能吃了两顿饭后,进度才走了50%不到 😦 ,因此墙裂不建议使用大容量TF卡,不要问我是怎么知道的...
TF卡图片
实验证明,上图的卡就很好用,8G容量够用了,价格便宜:14.9元,而且耐造,目前已经几十次的烧写镜像,使用没有出过任何问题。
TF卡购买链接:
https://item.jd.com/7250669.html#none
读卡器?上面买DC电源时不是送你读卡器了吗?
5. 5G模块
先说结论:BPI-R4在官方固件代码(OpenWrt-21.02)上可以使用移远通信(Quectel)的RM500U-CN
和RM500Q-GL
,在OpenWrt-23.05
主线版本上仅RM500Q-GL
可用(主线固件源码里有RM500Q-GL的驱动,其产品ID为800,而RM500U-CN的产品ID为900,因此不被OpenWrt所识别),所以说RM500Q-GL比RM500U-CN好用,原因一:500Q能够同时在OpenWrt-21.02和OpenWrt-23.05上使用,原因二:发热量明显小;据官方资料显示RM520N-GL
也可以使用,但我手头没有,没有办法测试
Quectel RM500Q-GL实物图(图片来自闲鱼)
Quectel RM500U-CN实物图(图片来自闲鱼)
注意:5G模块上除了“大”型号,如“RM500Q-GL”之外,还有一个“小”型号,如"RM500Q-GL AB","RM500U-CN VCA"之类的,如你所猜,"GL"代表全球都可以使用,"CN"代表在国内使用,再后面的字母代表模块用途,详细介绍情况请自行搜索。我测试的两个模块具体为"RM500Q-GL AB"和"RM500U-CNVCA",其中"RM500G-GL"是闲鱼上淘来的,品相成色很nice,功能正常;"RM500U-CNVCA"是在T宝购买的。
RM500U-CN效果图(我实际购买的是RM500U-CNVCA)
RM500U-CN购买链接(2024年1月28日 当前缺货):
https://item.taobao.com/item.htm?_u=skb3avd95d&id=703952904554&spm=a1z09.2.0.0.78462e8dVh8xMm
这个店应该是官方店,这个店的客服明显支持比另一个官方店的客服有耐心,服务更好一些。
5G模块必须接上天线和SIM卡才能正常工作,天线产品如下:
5G/4G通用棒状天线,型号:YECN009AA
天线射频转接线,型号:YM0004AA
此处要说明的是,天线转接线有两种规格,IPEX1代
和IPEX4代
,注意:RM500系仅支持IPEX4代转接线,买错了完全无法使用,不要问我是怎么知道的...
天线和转接线的购买链接:
https://item.taobao.com/item.htm?_u=skb3avbb85&id=724585239978&spm=a1z09.2.0.0.78462e8dVh8xMm&skuId=5221174257612
6. Wi-FI模块
先说结论:MT7921
和MT7922
在OpenWrt-23.05
上确定可用,但是在官方固件源代码确定不可用;不可用的原因是官方源代码所采用的内核版本上mt76
和mac80211
驱动有BUG,根本就不能编译通过,使用OpenWrt-21.02.7
中相应的目录替换官方源代码的目录后能编译通过,也能搜到网络,但无法实现Wi-Fi AP或能,甚至也不能作用Wi-Fi Client使用。后经搜索发现是mt76
驱动在21.02
版本上无法正常使用,OpenWrt
官方Github上还有一个专门的mt76
项目用来解决这个问题,本着不放弃任何一个细节的原则,我毫不犹豫下载了该代码和官方源代码进行了合并编译,然后不出意外的编译失败了,原因是该mt76
代码库中有一个头文件并不在官方固件源代码的内核中...
好吧,世上无难事,只要肯放弃!只要我不坚持搞21.02
上使用MT7921
了,难题自然就会自动消失了。
不用7921我就下单了一个MT7915
,更确切点说是DR7915
要特别慎重,因为我没有用起来。
官方声明不支持7天无理由,非批量用户不提供技术支持,大家千万不要怀疑他们公司的执行力,绝对不会给你提供半个字有用的技术支持。发货可能是个看人品的事情,我可能人品不佳,我下单后直到淘宝官方客服介入才终于发了货。发货之前我想知道这个天线接口是IPEX1代还是IPEX4代,客服会客(ai)客(da)气(bu)气(li)的和你说5句话,但绝不会告诉你是1
还是4
,我只能到货后再自行观察,到货后更坑的来了,我以为这个模块仅仅是正面使用了凸起来的封装,拿到手后发现原来背面也是凸起来的封装啊!杯具啊!!! 根本不能安装在BPI-R4上,这个造型很可能难以安装在很多板子上!
本着买都买了的想法,我还想再抢救一下,在买转接线和转线板之前纠结一番后觉得转子可能看起来更清爽,更好固定一些,经过两次折腾,转接板终于到了,插到BPI-R4上使用官方镜像,额..没有发现PCI-E设备,这一定是OpenWrt-21.02
版本过低的原因!马上插上OpenWrt-23.05
SD卡,上电...好吧,95%是转接卡太辣鸡了,这么贵的模块应该是不会出问题的,包好,收起来放抽屉。
想着把MT7921再换上去吧,这时就多了一点点小动作,又带来一个大麻烦,我想看看7921商家送的这个天线馈线和5G模块天线馈线是否有区别,就轻轻的把7921的天线拿下来,我真的已经足够轻了,但还是连带着把7921的天线底座一并从PCB板上拉下来了...小结一下:非必要不要抜天气馈线一个没多少钱,多买几根,一个模块可以买几十根馈线。
想着MT7921
反正也坏了,而且在官方代码上也跑不起来,OpenWrt-23.05
上有MT7922
的固件,这次要么试一下7922吧,它应该比7921更香吧,马上闲鱼上看到家附近就有,直接拿货测试。这次发现PCI-E设备了,但是/etc/config/wireless
文件里面是空的,使用/sbin/wifi config
重新生成也没有用,本着死马当做活马医的态度,再次编译固件,这次除kmod-mt7922-firmware
外,还加上了kmod-mt7921e
,别问我为什么这么想,我就是觉得这俩长的有点像,兴许会迷惑系统,烧TF卡,再次加电启动,这次终于看到/etc/config/wireless
里面有内容了,测试发现无线网络功能是正常的,说一句7922使用是IPEX4代线。
我买的MT7922
上还有个Port Number:RZ616
,据网上的介绍说是有160MHz带宽,然而我使用的是MT7921的驱动,页面上的配置最高也只有80MHz,Wi-Fi功能对我而言本就不是刚需,我也不想折腾了。
为什么第二次我在闲鱼上买7922,原因是我觉得淘宝上一手的MT7921
全新质量太次,反而是闲鱼上从品牌笔记本上拆机的无线网卡质量和做工更好一些,各位自行评估。
7. 散热片
- 20x20x4的带背胶纯铜散热片看着还不错,大小也正合适,主要是贴上后心理上觉得安全了一些,适用于CPU,NVMe硬盘,无线网卡和5G模块。
购买链接:
商品详情
- 5G模块专用散热片
合身、漂亮
购买链接:
https://item.taobao.com/item.htm?_u=vkb3av6638&id=672697533949&spm=a1z09.2.0.0.19852e8dpbPx1k&sku_properties=1627207:3232484
8. 风扇
也许能用到,也许用不着,6元一个,我看BPI官方也在用这个风扇,就备一个吧
注意:如果在BPI-R4背面安装NVMe硬盘的话,这个风扇的卡子是无法插到对应的位置的,需要使用硬盘的兄弟慎重购买
购买链接:
https://item.taobao.com/item.htm?_u=vkb3av289a&id=619655377629&spm=a1z09.2.0.0.19852e8dpbPx1k&skuId=4978584616607
到现在为止,BPI-R4折腾之旅可以发车了 😃
三、Banana PI BPI-R4资料和固件
官方资料和固件:
- 香蕉派 BPI-R4
- Getting Started with BPI-R4
- 官方固件代码仓库 BPI-R4-OPENWRT-V21.02
搜索到的几个有用的文章:
- 这路由很硬?bpi-r4万兆路由到手体验!
- BPI-R4万兆路由ImmortalWrt固件体验(cpu跑分5w+)
- bpi-r4固件--基于hanwckf大佬的uboot源码及固件源码
根据上面文章提到的线索,我找到了据称将来要合并到OpenWrt-23.05
主线的BPI-R4可用的固件源码,感谢不吝分享知识的大佬们!
-
https://github.com/dangowrt/openwrt/tree/bpi-r4
-
官方提供的固件源代码是
21.02
版,该代码提供了RM500U-CN
和RM520N-GL
和RM-500Q-GL
的支持
然而官方源代码对于无线网卡的支持并不好,因此本文我主要演示dangowrt大佬提供的固件源代码,该固件支持RM520N-GL
和RM500Q-GL
。
四、编译OpenWrt-23.05
1. 准备编译环境(Ubuntu 22.04.3
)
编译OpenWrt-23.05
我选用了Ubuntu 22.04.3
,编译官方固件源代码使用Ubuntu 22.04
会报错,只能选用Ubuntu 20.04
。
需要说明的是,在编译OpenWrt固件时,一定要选择非root
账号,否则在编译的过程中会报错。
2. 安装编译依赖项
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">sudo apt update -y
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils rsync unzip zlib1g-dev file wget swig -y
</code></span></span>
需要下载的依赖项比较多,建议最好将Ubuntu的apt
源设置为清华镜像站或其他国内镜像站。
建议在Ubuntu上保留足够的可用磁盘空间,至少应具有64GB可用空间,推荐128G及以上。
编译使用的电脑推荐使用主频高、CPU核心数多的台式电脑,使用普通笔记本编译可能浪费您大量的时间。
3. 设置http和git代理
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">export ALL_PROXY=socks5://192.168.183.1:1080
export http_proxy=http://192.168.183.1:808
export https_proxy=http://192.168.183.1:808
git config --global http.proxy "http://192.168.183.1:808"
git config --global https.proxy "http://192.168.183.1:808"
</code></span></span>
如果您没有代理服务器,不建议继续以下步骤
4. 下载OpenWrt-23.05源代码
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">git clone -b bpi-r4 https://github.com/dangowrt/openwrt.git
</code></span></span>
本文所有的操作均在用户根目录下,例:/home/joseph
或~/
下拉代码结束后进入源代码目录,并且查看代码是否是bpi-r4
分支
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">cd openwrt
git show
</code></span></span>
5. 下载安装交叉编译依赖项
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">./scripts/feeds update -a
./scripts/feeds install -a
</code></span></span>
6. 配置编译项
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">make menuconfig
</code></span></span>
6.1 配置项如下:
- 首页
- Target System:
MediaTek Ralink ARM
- Subtarget:
Filogic 8x0 (MT798X)
- Target Profile:
Bananapi BPi-R4
- Target System:
- Base System:
- block-mount
- blocked
- Customize busybox options
- Base System > Linux System Utilities
- fdisk
- Kernel modules > Block Devices
- kmod-dax
- kmod-dm
- kmod-nvme
- kmod-scsi-core
- Kernel modules > Filesystems
- kmod-fs-exfat
- kmod-fs-ext4
- kmod-fs-ksmbd
- kmod-fs-ntfs3
- Kernel modules > USB Support
- kmod-usb-core
- kmod-usb-net
- kmod-usb-net-qmi-wwwan
- kmod-usb-ohci
- kmod-usb-storage
- kmod-usb-wdm
- kmod-usb-usb2
- kmod-usb-usb3
- Kernel modules > Wireless Drivers
- kmod-mt7921-firmware
- kmod-mt7921e
- kmod-mt7922-firmware
此处手动添加kmod-mt7921-firmware
、kmod-mt7921e
和kmod-mt7922-firmware
, 取消kmod-mt7915e
,其他使用自动创建的依赖即可。
- LuCI > Collectioins
- luci
- luci-light
- LuCI > Modules
当在上一步骤中选择luci
选项后,配置程序会自动设置Modules选项,本文采用其默认值,仅在区域中加了中文
在LuCI > Modules > Translations
中添加中文支持
- LuCI > Modules > Translations
- Chinese Simplified (zh_Hans)
- LuCI > Applications
- luci-app-dockerman(注意:此处是
M
,非*
) - luci-app-ksmbd
- luci-app-dockerman(注意:此处是
- Network > SSH
- openssh-sftp-server
- Utilities
- dockerd(注意:此处是
M
,非*
) - pciutils
- usbutils
- dockerd(注意:此处是
- 最后,保存配置
6.2 添加5G上网和Wi-Fi所需的文件
请点击此处下载本章节中所需的文件
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>进入BPI-R4编译目标的目录
cd ~/openwrt/target/linux/mediatek/filogic/base-files
mkdir -p sbin && cd sbin
<span style="color:#2b91af">
# </span>使用sftp或是其他工具将下列文件存入sbin目录中
<span style="color:#2b91af">
# </span>1. quectel-atc-proxy
<span style="color:#2b91af"># </span>2. quectel-CM
<span style="color:#2b91af"># </span>3. quectel-mbim-proxy
<span style="color:#2b91af"># </span>4. quectel-qmi-proxy
<span style="color:#2b91af">
# </span>设置执行权限
chmod +x ./*
</code></span></span>
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>进入/etc/init.d目录
cd ~/openwrt/target/linux/mediatek/filogic/base-files/etc/init.d
<span style="color:#2b91af">
# </span>复制ltecalling文件至init.d目录中,该文件是5G模块连接网络的启动脚本
<span style="color:#2b91af">
# </span>设置ltecalling执行权限
chmod +x ltecalling
</code></span></span>
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>创建ltecalling文件的软链接,使该文件能够实现开机启动
mkdir -p ~/openwrt/target/linux/mediatek/filogic/base-files/etc/rc.d
cd ~/openwrt/target/linux/mediatek/filogic/base-files/etc/rc.d
ln -s ../init.d/ltecalling S99xltecalling
</code></span></span>
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>添加网络接口配置
mkdir -p ~/openwrt/target/linux/mediatek/filogic/base-files/etc/config
<span style="color:#2b91af"># </span>将下列文件复制进刚才创建的config文件夹中
<span style="color:#2b91af"># </span>1. network (网络接口配置文件)
<span style="color:#2b91af"># </span>2. firewall (防火墙配置文件)
<span style="color:#2b91af"># </span>3. wireless (Wi-Fi配置文件)
</code></span></span>
其中network
文件配置如下:
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-properties">
<span style="color:#ff0000">config</span> <span style="color:#a31515">interface 'loopback'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'lo'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto 'static'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">ipaddr '127.0.0.1'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">netmask '255.0.0.0'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">globals 'globals'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">ula_prefix 'fdd2:e351:889d::/48'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">device</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name 'br-lan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">type 'bridge'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'lan1'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'lan2'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'lan3'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'eth1'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">interface 'lan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'br-lan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto 'static'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">ipaddr '192.168.1.1'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">netmask '255.255.255.0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">ip6assign '60'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">device</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name 'br-wan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">type 'bridge'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'wan'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">ports 'eth2'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">interface 'wan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'br-wan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto 'dhcp'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">interface 'wan6'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'br-wan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto 'dhcpv6'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">interface '5G'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'wwan0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto 'dhcp'</span>
</code></span></span>
firewall
如下:
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-properties"><span style="color:#ff0000">config</span> <span style="color:#a31515">defaults</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">syn_flood 1</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">input REJECT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">output ACCEPT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">forward REJECT</span>
<span style="color:#008000"># Uncomment this line to disable ipv6 rules</span>
<span style="color:#008000"># option disable_ipv6 1</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">zone</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name lan</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">network 'lan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">input ACCEPT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">output ACCEPT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">forward ACCEPT</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">zone</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name wan</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">network 'wan'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">network 'wan6'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">network '5G'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">input REJECT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">output ACCEPT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">forward REJECT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">masq 1</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">mtu_fix 1</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">forwarding</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src lan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest wan</span>
<span style="color:#008000">
# We need to accept udp packets on port 68,</span>
<span style="color:#008000"># see https://dev.openwrt.org/ticket/4108</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-DHCP-Renew</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto udp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest_port 68</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv4</span>
<span style="color:#008000">
# Allow IPv4 ping</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-Ping</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto icmp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">icmp_type echo-request</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv4</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-IGMP</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto igmp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv4</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#008000">
# Allow DHCPv6 replies</span>
<span style="color:#008000"># see https://github.com/openwrt/openwrt/issues/5066</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-DHCPv6</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto udp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest_port 546</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv6</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-MLD</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto icmp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src_ip fe80::/10</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type '130/0'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type '131/0'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type '132/0'</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type '143/0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv6</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#008000">
# Allow essential incoming IPv6 ICMP traffic</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-ICMPv6-Input</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto icmp</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type echo-request</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type echo-reply</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type destination-unreachable</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type packet-too-big</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type time-exceeded</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type bad-header</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type unknown-header-type</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type router-solicitation</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type neighbour-solicitation</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type router-advertisement</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type neighbour-advertisement</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">limit 1000/sec</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv6</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#008000">
# Allow essential forwarded IPv6 ICMP traffic</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-ICMPv6-Forward</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest *</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto icmp</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type echo-request</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type echo-reply</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type destination-unreachable</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type packet-too-big</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type time-exceeded</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type bad-header</span>
<span style="color:#ff0000">list</span> <span style="color:#a31515">icmp_type unknown-header-type</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">limit 1000/sec</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">family ipv6</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-IPSec-ESP</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest lan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto esp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">rule</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">name Allow-ISAKMP</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">src wan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest lan</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">dest_port 500</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">proto udp</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">target ACCEPT</span>
</code></span></span>
wireless
如下:
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-properties">
<span style="color:#ff0000">config</span> <span style="color:#a31515">wifi-device 'radio0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">type 'mac80211'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">path 'soc/11300000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">channel '36'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">band '5g'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">htmode 'HE80'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">cell_density '0'</span>
<span style="color:#ff0000">config</span> <span style="color:#a31515">wifi-iface 'default_radio0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">device 'radio0'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">network 'lan'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">mode 'ap'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">ssid 'Szh-RS01'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">encryption 'psk2'</span>
<span style="color:#ff0000">option</span> <span style="color:#a31515">key 'think8848'</span>
</code></span></span>
至此,OpenWrt编译的准备工作完成,下面开始进行编译
7. 编译OpenWrt
7.1 预先下载内核和各类固件代码
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>虚拟机是8核虚拟CPU,我使用其中7个
<span style="color:#2b91af"># </span>可以不预先下载直接编译,如果不下载,有可能在编译的过程中某个代码下载失败造成编译失败,又得重新开始,我习惯上是先把所有除编译错误之外的故障排除完,然后定定心心的开始编译
make download -j7
</code></span></span>
看看这一排排的下载地址,没有代理是有点糟心(也可能使用国内源能够解决这个问题,我没有试过)
7.2 开始编译
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>开始时间 22:38 结束时间 23:16 编译总时长: 38m
make V=s -j7
</code></span></span>
编译时的CPU利用率,2016年的i7 7700K
编译成功,未出现致命错误
编译好输出目录
五、部署OpenWrt
1. 准备TF卡烧录工具
可以Windows上烧录TF卡,Windows使用Etchar工具;也可以在Linux上烧录TF卡,下面是Linux上烧录工具的下载安装方式。实验证明Windows上烧录TF卡真的很辣鸡,经常性烧录校验失败,而且每次将TF接入电脑后,电脑就卡死,推荐使用Linux烧录工具
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">sudo apt install -y pv
curl -sL https://github.com/BPI-SINOVOIP/bpi-tools/raw/master/bpi-tools | sudo -E bash
</code></span></span>
Linux下烧录工具
2. 将编译好的镜像烧录到TF卡上
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>将SD镜像复制到用户根目录下并解压
cp ~/openwrt/bin/targets/mediatek/filogic/openwrt-mediatek-filogic-bananapi_bpi-r4-sdcard.img.gz ~/
cd ~/ && gunzip openwrt-mediatek-filogic-bananapi_bpi-r4-sdcard.img.gz
<span style="color:#2b91af">
# </span>写入SD(TF)卡,注意:您的SD卡可能不一定和我一样是/dev/sdb,请按实际情况进行调整
sudo ./bpi-copy openwrt-mediatek-filogic-bananapi_bpi-r4-sdcard.img /dev/sdb
</code></span></span>
到此,可以将TF插入BPI-R4,将跳线设置为SD卡启动
3. 查看OpenWrt
使用Terminal登录进系统,可以看到Banner界面。
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>查看5G模块和PCI-E设备,可以看到`Quectel RM500Q-Gl`5G模块,`Mediatek MT7922`无线网卡和`Intel SSD 600P`NVMe固态硬盘
lsusb
lspci
cd /dev && ls
ping www.baidu.com
</code></span></span>
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>查看5G模块拨号情况(注意,启动系统后大概过30秒再查看)
ps | grep quectel
</code></span></span>
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>查看网络接口(同样待系统启动30秒后再查看)
ifconfig
</code></span></span>
下图上phy0-ap0
为无线网卡,wwan0
为5G模块
此时我正在写文档的电脑通过有线连接在BPI-R4的Lan口上,已经可以正常上网,注意:当电脑连上BPI-R4后,一开始的时候是可以ping
通域名的(如:www.baidu.com),过一会儿后就ping
不通了,再过一会儿又会ping
通,然后就稳定下来了。
换个姿势来看OpenWrt
😃
概览
端口和5G网络
无线(无线网卡驱动可能不对,另外使用了笔记本天线,请无视渣渣信号)
磁盘挂载
六、配置应用服务
1. 将NVMe固态硬盘挂载为OpenWrt的/overlay
目录
- 选择NVMe固态硬盘挂载点,点击
编辑
按钮,在打开的弹出框中将挂载点
设置为/overlay
,选中已启用
,然后点击保存
按钮。
注意:在挂载磁盘之前,最好将磁盘上清空,避免发生未知错误
- 关闭弹出框后,点击屏幕下方的
保存与应用
按钮。
- 重启BPI-R4
- 重启后可以看到NVMe固态硬盘已经被挂载为
/
和/overlay
2. 部署Docker
- 准备
opkg
源
如果您计划直接使用Ubuntu
上编译目录(~/openwrt/bin
)中的文件作为opkg源,则可以考虑使用python
的http.server
(http.server文档)挂载http服务;因为我编译使用的是Ubuntu
虚拟机,而且网络设置为nat
模式,如果要让OpenWrt访问该虚拟机还需要重新设置网络,因此我直接将编译目录中的文件复制到写该Blog的Windows
上。
Ubuntu
文件层级见下图:
Windows
文件层级见下图:
Windows
环境上配置HTTP服务器
a. 把base
,luci
,packages
,routing
,telephony
和targets/mediatek/filogic
目录复制到Windows
环境中。
b. 下载Windows
下轻量化HTTP服务器Rebex Tiny Web Server(官网)。解压,并设置wwwroot
目录
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-xml"><span style="color:#008000"><!-- Root directory of the web server. --></span>
<span style="color:#0000ff"><<span style="color:#0000ff">add</span> <span style="color:#ff0000">key</span>=<span style="color:#a31515">"webRootDir"</span> <span style="color:#ff0000">value</span>=<span style="color:#a31515">"D:\self\packages\aarch64_cortex-a53"</span> /></span>
</code></span></span>
启动Rebex Tiny Web Server
c. 修改OpenWrt
中opkg
配置,将/etc/opkg/distfeeds.conf
设置如下:
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-properties"><span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_core http://192.168.1.147:1180/filogic/packages</span>
<span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_base http://192.168.1.147:1180/base</span>
<span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_luci http://192.168.1.147:1180/luci</span>
<span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_packages http://192.168.1.147:1180/packages</span>
<span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_routing http://192.168.1.147:1180/routing</span>
<span style="color:#ff0000">src/gz</span> <span style="color:#a31515">openwrt_telephony http://192.168.1.147:1180/telephony</span>
</code></span></span>
d. 更新opkg
源
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">opkg update
</code></span></span>
- 安装
docker
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">opkg install dockerd
opkg install docker
docker ps
</code></span></span>
可以看到docker
已经启动
- 配置
Docker
a. 配置开机启动
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">/etc/init.d/dockerd enable
</code></span></span>
b. 配置Docker
防火墙设置以及使用网易的Repository
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">vi /etc/config/dockerd
<span style="color:#2b91af">
# </span>增加配置项
<span style="color:#2b91af"># </span>将option iptables 设置为 <span style="color:#a31515">'0'</span>
<span style="color:#2b91af"># </span>list registry_mirrors <span style="color:#a31515">'https://hub-mirror.c.163.com'</span>
</code></span></span>
此处可以重启BPI-R4检验Docker
是否可以正常开机启动
c. 测试Docker
测试Docker的时候不要和LuCI端口冲突
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">docker run -d --name nginx -p 8080:80 nginx
docker ps -a
</code></span></span>
打开nginx主页
3. 配置ksmbd
- 在
OpenWrt
根目录/
下创建文件共享目录
<span style="color:#232323"><span style="background-color:#ffffff"><code class="language-shell">mkdir -p /smbroot
<span style="color:#2b91af">
# </span>创建测试文件
echo hello think8848 >> /smbroot/readme.txt
</code></span></span>
设置只run许lan
口访问,因为我将来只是需要提供只读的工具共享,因此我允许匿名访问,并且是只读目录,见下图:
保存配置后查看共享文件夹
4. 某些情况下可能需要配置DNS
转发服务
安装部署OpenWrt
后,某些情况下LAN
网络上的设备可能无法正常解析域名,这个问题我没有去细究,解决方法是直接为dnsmasq
配置DNS
转发。
正好这时我的电脑是可以正常解析域名的,这个没有什么好测试的,上图演示了修改DNS转发的位置,有需要的筒子们请自行设置
七、后记
至此,本文一开始我确立的目标全部达到了,对于我而言,这篇文章是对近期折腾BPI-R4的一个记录,只有记录下来了,这次折腾就算是有一点点意义,不然半个月之后肯定全部忘却了。后续我计划在OpenWrt-21.02
上部署工作所需的正式环境,原理和23.05
类似。为什么我自己要在21.02
上部署?这不是RM500U-CN
不支持23.05
嘛,RM500Q-GL
留下来在必要的时候做测试用 😃
文内的所有代码和操作步骤我全部经过测试验证,如在参考过程出现错误,请仔细比对环境、版本是否和我使用的一致,建议使用干净的Ubuntu系统、NVMe硬盘进行测试。本文基本上一次成型,写作时间有限,后期非特殊情况也不会再行更新,对于本文语言组织欠佳,章节顺序混乱我深表歉意。
其实在折腾BPI-R4的这一段时间里,学习到不少有用的知识,感觉对于Linux、嵌入式、驱动迁移等好多知识都有涉及,感觉非常有意思,虽然本文可能是我所有博文中最长的一篇了,但实际上在折腾中遇到的、学到的远非这些,我基本上只描述了结果,过程和原理基本都没有讲,比方说为什么开机就自动拨号了,Wi-Fi没有配置为啥就可以连了,等等。没有更多细节的原因有两个,一个是我确实没有多少时间写文档,另一个是我对于OpenWrt算是浅尝辄止了,有些东西你让我说我也说不明白,后续也没有继续深入学习研究的条件,所以就只能这样了,希望能帮到有需要的朋友。
同时,也希望用到看到这篇文章的大佬们不吝指教,提出宝贵的意见建议,能够帮助到更多有需要的朋友,谢谢!