【Linux】H3网络(二)

NanoPi M1 Armbian 配置 RTL8188GU USB WiFi


1. 下载并烧录 Armbian 系统

操作:

去 Armbian 归档站 http://fi.mirror.armbian.de/oldarchive/nanopim1/archive/ 下载

Armbian_21.08.1_Nanopim1_focal_current_5.10.60.img.xz。

烧录到 TF 卡,插入 NanoPi M1,接网线、电源。

为什么:

官方系统内核太老(4.14),Armbian 是社区维护的现代系统。选 focal 是因为它是 Ubuntu 20.04 用户空间,软件生态好。虽然初始内核是 5.10.60,但后续可以升级。归档站是因为官网不再直接展示旧板子镜像。


2. 首次启动并创建用户

操作:

用串口或 HDMI 登录。默认用户名 root,密码 1234。

系统强制要求改 root 密码,并创建普通用户,例如 user,设置密码。

为什么:

首次启动必须初始化。创建普通用户是为了日常安全操作,避免一直用 root。以后 SSH 登录用 user,需要管理员权限时加 sudo。


3. 确认系统版本

操作:

bash 复制代码
cat /etc/os-release
cat /etc/armbian-release

为什么:

确认用户空间是 Ubuntu 20.04 Focal,Armbian 版本 21.08.1,板子 nanopim1。避免以后混淆 Debian/Ubuntu,也方便安装正确的软件包。


4. 确认有线网络

操作:

bash 复制代码
ip a

看 eth0 是否有 inet 192.168.x.x。如果没有:

bash 复制代码
sudo dhclient eth0

为什么:

后面所有安装(apt、git、编译工具)都需要网络。有线网是最稳定的入口。


5. 启用 SSH(默认已开)

操作:

Armbian 默认开启 SSH 服务且开机自启。在电脑上用 MobaXterm 或终端连接:

bash 复制代码
ssh user@192.168.31.56

为什么:

SSH 是日常开发主力,资源占用极小。以后板子可以无头运行,不用接串口或显示器。


6. 安装 usb-modeswitch

操作:

bash 复制代码
sudo apt update
sudo apt install -y usb-modeswitch usbutils

为什么:

RTL8188GU 出厂默认是 U 盘模式(0bda:1a2b),需要 usb_modeswitch 工具把它切换成 WiFi 模式(0bda:b711)。


7. 切换 USB 网卡模式

操作:

bash 复制代码
sudo usb_modeswitch -KW -v 0bda -p 1a2b
lsusb

确认 ID 从 0bda:1a2b 变成 0bda:b711。

为什么:

不切换的话,系统只认它是一个 U 盘,不会加载 WiFi 驱动。


8. 检查旧内核驱动

操作:

bash 复制代码
lsmod | grep rtl8xxxu
ip a

为什么:

初始内核 5.10.60 太老,自带的 rtl8xxxu 驱动不支持 RTL8188GU,所以看不到 wlan0。需要升级内核。


9. 升级内核到 6.18.44

操作:

bash 复制代码
sudo apt update
sudo apt upgrade -y

遇到配置文件提示(如 /etc/issue)输入 Y 回车。

完成后:

bash 复制代码
sudo reboot

重启后确认:

bash 复制代码
uname -r

应显示 6.18.44-current-sunxi。

为什么:

新内核的 rtl8xxxu 驱动增加了对 RTL8188GU 的支持(2023 年后主线合并)。升级内核是解决驱动缺失最省事的方法。


10. 再次切换模式并检查驱动

操作:

bash 复制代码
sudo usb_modeswitch -KW -v 0bda -p 1a2b
lsmod | grep rtl8xxxu
dmesg | tail -n 30
ip a

为什么:

重启后网卡可能又变回 DISK 模式,需要重新切换。

此时 lsmod 能看到 rtl8xxxu,但 dmesg 可能报 probe failed with error -11,且 ip a 没有 wlan0。说明主线驱动兼容性不好,需要社区驱动。


11. 安装 GCC 14

操作:

bash 复制代码
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install -y gcc-14
gcc-14 --version

为什么:

内核是用 GCC 14.2 编译的,系统默认 GCC 是 9.4,版本不匹配会导致编译驱动时报 unrecognized command line option 错误。必须安装 GCC 14。


12. 克隆并编译社区驱动

操作:

bash 复制代码
cd ~
git clone https://github.com/a5a5aa555oo/rtl8xxxu.git
cd rtl8xxxu
make clean
make CC=gcc-14 -j$(nproc)

成功生成 rtl8xxxu_git.ko。

为什么:

这个社区驱动专门修复了 RTL8188GU 的兼容性问题。用 CC=gcc-14 指定编译器,避免版本不匹配。


13. 安装并加载新驱动

操作:

bash 复制代码
sudo make install
sudo depmod -a
sudo modprobe -r rtl8xxxu        # 卸载内核自带旧驱动
sudo modprobe rtl8xxxu_git       # 加载新驱动
ip a

应出现类似 wlx7454271ea36f 的无线接口。

为什么:

安装新模块到系统,刷新依赖,然后卸载旧驱动、加载新驱动。接口名带 wlx 和 MAC 地址是正常的。


14. 连接 WiFi

操作:

bash 复制代码
sudo nmcli device wifi list
sudo nmcli device wifi connect "你的WiFi名称" password "你的密码"
ip a

无线接口应获取到 IP,例如 192.168.31.192。

为什么:

nmcli 是 NetworkManager 的命令行工具,方便连接和记忆网络。


15. 配置永久生效

操作:

15.1 驱动开机自动加载

bash 复制代码
echo "rtl8xxxu_git" | sudo tee -a /etc/modules

15.2 屏蔽内核自带旧驱动

bash 复制代码
echo "blacklist rtl8xxxu" | sudo tee -a /etc/modprobe.d/blacklist-rtl8xxxu.conf

15.3 自动切换 USB 模式

bash 复制代码
sudo nano /etc/udev/rules.d/40-usb_modeswitch.rules

写入:

text 复制代码
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch -KW -v 0bda -p 1a2b"

保存后:

bash 复制代码
sudo udevadm control --reload-rules
sudo udevadm trigger

为什么:

避免每次重启都要手动敲命令。自动加载驱动、屏蔽旧驱动、自动切换模式,让系统开机即用。


16. 测试脱离网线

操作:

拔掉网线,等几秒,用电脑 SSH 连接无线 IP:

bash 复制代码
ssh user@192.168.31.192

能连上即成功。

为什么:

验证 WiFi 方案真正可用,以后机器人可以自由移动。


最终成功状态

  • 硬件:NanoPi M1(全志 H3,1GB RAM)
  • 系统:Armbian 21.08.1 Focal(Ubuntu 20.04)
  • 内核:6.18.44-current-sunxi
  • 驱动:社区编译的 rtl8xxxu_git
  • 无线接口:wlx7454271ea36f
  • WiFi 连接:成功,IP 192.168.31.192
  • 永久配置:udev 自动切换、/etc/modules 自动加载、黑名单屏蔽旧驱动

以后重启应能自动进入 WiFi 模式并连接网络,可拔掉网线用 SSH 继续开发。

相关推荐
阳光九叶草LXGZXJ4 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊4 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛8 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德8 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札9 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨11 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业11 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
wuminyu11 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
她说彩礼65万11 小时前
C语言 堆区和栈区
java·linux·c语言