使用Banana Pi BPI-R4开发板实现5G上网、Wi-Fi AP、文件共享和Docker服务

news2024/12/27 12:53:35

转载:本文出处
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-CNRM500Q-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模块

先说结论:MT7921MT7922OpenWrt-23.05上确定可用,但是在官方固件源代码确定不可用;不可用的原因是官方源代码所采用的内核版本上mt76mac80211驱动有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.05SD卡,上电...好吧,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-CNRM520N-GLRM-500Q-GL的支持

然而官方源代码对于无线网卡的支持并不好,因此本文我主要演示dangowrt大佬提供的固件源代码,该固件支持RM520N-GLRM500Q-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

  • 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-firmwarekmod-mt7921ekmod-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

  • Network > SSH
    • openssh-sftp-server

  • Utilities
    • dockerd(注意:此处是M,非*)
    • pciutils
    • usbutils

  • 最后,保存配置

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源,则可以考虑使用pythonhttp.server(http.server文档)挂载http服务;因为我编译使用的是Ubuntu虚拟机,而且网络设置为nat模式,如果要让OpenWrt访问该虚拟机还需要重新设置网络,因此我直接将编译目录中的文件复制到写该Blog的Windows上。

Ubuntu文件层级见下图:

Windows文件层级见下图:

  • Windows环境上配置HTTP服务器
    a. 把base,luci,packages,routing,telephonytargets/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. 修改OpenWrtopkg配置,将/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算是浅尝辄止了,有些东西你让我说我也说不明白,后续也没有继续深入学习研究的条件,所以就只能这样了,希望能帮到有需要的朋友。

同时,也希望用到看到这篇文章的大佬们不吝指教,提出宝贵的意见建议,能够帮助到更多有需要的朋友,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

大数据学习之Redis,十大数据类型的具体应用(一)

目录 3. 数据类型命令及落地应用 3.1 备注 3.2 Redis字符串&#xff08;String&#xff09; 单值单value 多值操作 获取指定区间范围内的值 数值增减 获取字符串长度和内容追加 分布式锁 getset(先get后set) 3.3 Redis列表&#xff08;List&#xff09; 简单说明 …

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功&#xff0c;考虑到曾经付费用户的负责&#xff0c;2024年可以发出来了。去年我辅导队伍数量&#xff1a;15&#xff0c;获奖M为主&#xff0c;个别F&#xff0c;H&#xff0c;零S。言归正传&#xff0c;这里我开始分享去年的方案。由于时间久远&#xff0c;我…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本&#xff0c;jdk8和jdk17 自从升级IDEA版本到2023以后&#xff0c;每次打开新项目&#xff0c;sdk都被默认选择成了jdk17, 每次都得手动修改 &#xff08;File--Project Structure&#xff09;&#xff0c;超级麻烦。 没有用的解决方法 以下这…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归&#xff1a; 举例&#xff1a;蝉&#xff08;昆虫物种&…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式&#xff1a;在不破坏封装的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋&#xff0c;下完之后发现走错了&#xff0c;想要回退…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

ONLYOFFICE:兼顾协作与安全的开源办公套件

文章目录 前言ONLYOFFICE是什么&#xff1f;ONLYOFFICE的特点多人在线协同灵活集成安全可靠跨平台和设备扩展丰富 实操注册登录编写文档插件安装智谱CopilotDraw.io 新版强势功能显示协作者头像插件 UI 界面更新 总结 前言 随着数字化时代的到来&#xff0c;越来越多的文档处理…

第38期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Redis核心技术与实战【学习笔记】 - 7.Redis GEO类型 - 面向 LBS 应用的数据类型

前言 前面&#xff0c;介绍了 Redis 的 5 大基本数据类型&#xff1a;String、List、Hash、Set、Sorted Set&#xff0c;它们可以满足绝大多数的数据存储需求&#xff0c;但是在面对海里数据统计时&#xff0c;它们的内存开销很大。所以对于一些特殊的场景&#xff0c;它们是无…

Java笔记 --- 四、异常

四、异常 Java.lang.Throwable Error Exception&#xff08;异常&#xff09; 异常的作用 异常的处理方式 JVM默认的处理方式 捕获异常&#xff08;自己处理&#xff09; try里面没有出现异常&#xff0c;就不会运行catch里面的代码 如果出现多个异常&#xff0c;需要多个c…

山石防火墙安装使用

山石虚拟防火墙&#xff0c;可以安装在vmware workstation上 安装步骤&#xff1a; 1、新建虚拟机&#xff0c;选择典型。 2、稍后安装 3、操作系统版本选择“Other Linux 3.x kernel 64-bit”。 4、配置虚拟机名称和位置 5、自定义硬盘容量 6、点击自定义硬件 7、此处可以选…

Python编辑开发 --- pycharm pro 中文

PyCharm Pro是一款专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它为Python开发者提供了丰富的功能和工具&#xff0c;使得Python编程变得更加高效和便捷。PyCharm Pro具有智能代码编辑功能&#xff0c;能够自动完成代码、快速导航至…

爆了!sealos 三天时间支持 1000 个帕鲁私服

Sealos 的帕鲁私服模板从第一天发布之后就起了 100 多个私服&#xff0c;第二天直接上到 500 多个&#xff0c;第三天直接上千&#xff0c;还在加速增长中。来讲讲我们只用一个晚上怎么做到上线一个专属可用区的&#xff0c;还有一些帕鲁实践让我对云有的一些新的思考。 Sealos…

2024年AI全景:趋势、预测和可能性

欢迎来到 2024 年人工智能和技术的可能性之旅。 在这里&#xff0c;每一个预测都是一个潜在的窗口&#xff0c;通向充满创新、变革、更重要的是类似于 1950 年代工业革命的未来。 20 世纪 50 年代见证了数字计算的兴起&#xff0c;重塑了行业和社会规范。 如今&#xff0c;人工…

第二十回 虔婆醉打唐牛儿 宋江怒杀阎婆惜-FreeBSD改变分区大小

阎婆找到宋江&#xff0c;劝宋江和阎婆惜和解。 宋江无奈跟阎婆惜喝酒&#xff0c;想趁阎婆下楼之机离开&#xff0c;但被阎婆用门锁拦住。宋江无奈留宿&#xff0c;但是两人还是不愉快&#xff0c;宋江五更天就起来了。 宋江走的匆忙&#xff0c;没有带招文袋。阎婆惜拿到招文…

maven helper 解决jar包冲突方法

一 概要说明 1.1 说明 首先&#xff0c;解决idea中jar包冲突&#xff0c;使用maven的插件&#xff1a;maven helper插件&#xff0c;它能够给我们罗列出来同一个jar包的不同版本&#xff0c;以及他们的来源&#xff0c;但是对不同jar包中同名的类没有办法。 1.2 依赖顺序 …

动态住宅IP可以用来注册亚马逊电商吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。所以现在非常多人使用指纹浏览器搭配代理IP 固定ip可以给我们的账户带来更多的安全&#xff0c;要知…

【java核心-IoC(控制反转)和DI(依赖注入)及AOP(面向切面编程)】

java核心-IoC&#xff08;控制反转&#xff09;和DI&#xff08;依赖注入&#xff09;及AOP&#xff08;面向切面编程&#xff09; 控制反转&#xff08;IoC&#xff09;依赖注入&#xff08;DI&#xff09;面向切面编程&#xff08;AOPAOP的应用场景包括但不限于&#xff1a;以…