随身WiFi刷Debian系统:USB主从模式切换与4G拨号自愈方案

随身WiFi刷Debian系统:USB主从模式切换与4G拨号自愈方案

手上几个高通 410 平台的随身 WiFi 棒子,原本跑的是安卓系统,功能受限只能当热点用。这芯片好歹是四核 A53 1.2GHz + 1GB RAM,刷个 Debian 能玩出花来——跑 Docker、做打印服务器、当小 NAS 都行。折腾了大半个月,把刷机、USB 模式切换、4G 拨号自愈这套流程跑通了,记录下来给同样喜欢折腾的朋友参考。

硬件概况与可行性评估

高通 410(MSM8916)这颗芯片在随身 WiFi 产品里用得很广,中移的 UF891、各种品牌的随身 WiFi 棒基本都用它。配置在当年不算高但放今天做轻量
Linux
完全够:

  • 四核 Cortex-A53 @ 1.2GHz
  • 1GB LPDDR3 RAM
  • 4GB/8GB eMMC
  • 集成 X6 LTE 基带(Cat.4)
  • USB 2.0 OTG 接口

关键前提是 bootloader 需要能解锁 。有些厂家的设备锁了
bootloader
,需要进 EDL(Emergency Download)模式强刷。如果设备还能正常启动安卓,一般在开发者选项里开 OEM 解锁后用 fastboot flashing unlock 解锁。锁了的设备需要短接主板上的测试点进 EDL 模式,用 QFIL 工具刷编程文件,操作门槛高一些但社区有详细教程。

RAM 是 1GB 还是 2GB 要先确认清楚,1GB 版能跑但不富裕,Docker 只能跑轻量容器。2GB 版就宽裕多了,跑个 Node.js + Redis 毫无压力。可以通过安卓里看 /proc/meminfo 确认。

还有个选型建议:买随身 WiFi 棒优先选 USB 口而不是 micro USB 口的。USB 口供电更稳,后续接 USB
Hub
扩展也更方便。另外看清楚是高通 410 还是 210,210 是双核 A53 性能差不少,刷 Debian 的社区支持也不如 410 完善,驱动覆盖面窄。

刷 Debian 12 的核心步骤

刷机主要分三步:刷 aboot(引导)、刷内核+设备树、刷 rootfs。社区项目 msm8916-mainline 提供了维护良好的内核和设备树,直接用它的预编译包。

fastboot flash aboot emmc_appsboot.mbn
fastboot flash boot boot.img
fastboot flash system debian-rootfs.img

# 分区表被改过的情况需要先恢复
fastboot flash partition gpt_both0.bin
fastboot flash aboot emmc_appsboot.mbn

rootfs 我用的是 debootstrap 自己做的,也可以直接用社区预构建的镜像。做 rootfs 时注意几件事:

  • debootstrap 用的架构是 arm64,不是 armhf
  • 要 chroot 进去装好内核模块(.ko 文件)到 /lib/modules/
  • 首次启动需要配置好串口调试控制台(ttyMSM0 或 ttyHSL0,取决于设备树)
  • 网络配置先别急着搞,确保能通过串口登录再说

串口是刷机调试的生命线。随身 WiFi 棒拆开后,板子上通常有 TX、RX、GND 三个测试点,需要飞线接 USB-TTL 模块。波特率一般是 115200,8N1。刷机失败、内核 panic、bootloader 卡住,全靠串口日志判断问题出在哪一步。不用串口的话,刷失败了你连死在哪步都不知道——屏幕黑着,没有任何反馈。

rootfs 定制方面,基础包我装了 openssh-server、htop、vim、network-manager、iptables。SSH 一定要装好配好,否则刷完系统只能靠串口操作,效率太低。建议在 rootfs 里预置好 SSH 公钥和 WiFi 配置,首次启动就能远程登录。

USB Gadget 从设备模式切换到 Host 主模式

这是整个折腾过程中卡时间最长的一步。随身 WiFi 棒的 USB 口默认是 Gadget(从设备)模式 ——插到电脑上会被识别为网卡/串口/ADB 设备。但我想接 USB
摄像头
和 U 盘,就得切到 Host(主设备)模式 。

MSM8916 的 USB 控制器是 dwc3,通过设备树配置工作模式。默认设备树里配的是 dr_mode = "peripheral",改成 Host 模式需要:

方法一:改设备树重新编译内核。 把 dwc3 节点的 dr-mode 改成 host,重新编译 boot.img 刷入。这种方式最彻底,但每次切换模式都要刷内核,不够灵活。

方法二:运行时通过 sysfs 切换(推荐)。 内核编译时打开 CONFIG_USB_DWC3_DUAL_ROLE,然后通过 sysfs 控制:

# 查看当前模式
cat /sys/bus/platform/drivers/dwc3/*.auto/mode

# 切换到 host 模式(需要先释放 gadget)
echo host > /sys/bus/platform/drivers/dwc3/*.auto/mode

# 切换回 peripheral 模式
echo peripheral > /sys/bus/platform/drivers/dwc3/*.auto/mode

切到 Host 模式后,插 USB 设备(U 盘、摄像头、键鼠)就能直接识别。但有个物理限制—— Host 模式下需要给 USB 设备供电 。随身 WiFi 棒的 USB 口对外供电能力很弱,接大电流设备必须用带外接供电的 USB Hub,否则设备识别不了或反复掉线。

我测试过几种 USB 设备的兼容性:U 盘和键盘鼠标基本即插即用;USB 摄像头需要内核编译 uvcvideo 驱动;USB 蓝牙适配器需要 btusb 驱动。如果设备插上没反应,先 dmesg | tail 看内核日志,八成是缺驱动模块。

如果同时需要 Gadget 和 Host 功能,可以配成 otg 模式用 USB ID 引脚自动切换。但随身 WiFi 棒的 USB 口通常没接 ID 引脚,这个方案得硬件改板,软件层面搞不了。

4G 拨号配置

Debian 刷好后,4G 模块是内核里集成的,驱动没问题,关键是选对拨号方式。MSM8916 的基带走 QMI 接口,mainline 内核提供了 qmi_wwan 驱动,拨号用 uqmi 工具最直接:

apt install uqmi

uqmi -d /dev/cdc-wdm0 \
  --set-wwan-profile ipv4 \
  --start-network cmnet \
  --ip-family ipv4 \
  --autoconnect

uqmi -d /dev/cdc-wdm0 --get-wwan-profile

dhclient wwan0

也可以用 NetworkManager 管理连接,更省心:

nmcli c add type gsm ifname wwan0 apn cmnet con-name 4g
nmcli c up 4g

NetworkManager 会自动处理 IP 获取、DNS 配置和重连,配合下面的自愈脚本,基本能做到开机即联网。

拨号阶段常见的坑:/dev/cdc-wdm0 设备节点不存在,说明 qmi_wwan 模块没加载,检查 lsmod | grep qmi。如果模块加载了但节点不在,可能是设备树里没启用 USB ECM + QMI 的组合,需要改设备树加 qcom,usb-dwc3 节点的 QMI 相关属性。

APN 名也要对。移动用 cmnet,联通用 3gnet,电信用 ctnet。APN 错了拨号能成功但上不了网,排查时容易绕弯路。物联网卡的话 APN 可能是 unim2m.njm2mapn 这种特殊值,得问卡商要,网上查不到。

拨号掉线自动检测与恢复

4G 拨号掉线是部署中最头疼的问题。信号波动、基站切换、运营商心跳超时都会导致 wwan0 接口失联。我做了一个 systemd 服务 + shell 脚本的自愈方案:

#!/bin/bash
IFACE=wwan0
RETRY=0
MAX_RETRY=3

while true; do
    if ip link show $IFACE | grep -q "state UP"; then
        if ping -c 3 -W 2 223.5.5.5 > /dev/null 2>&1; then
            RETRY=0
            sleep 30
            continue
        fi
    fi

    RETRY=$((RETRY + 1))
    echo "$(date): wwan0 down or no internet, retry $RETRY"

    if [ $RETRY -le $MAX_RETRY ]; then
        nmcli c down 4g
        sleep 5
        nmcli c up 4g
        sleep 10
    else
        echo "$(date): max retry exceeded, rebooting"
        reboot
    fi
    sleep 10
done

配套的 systemd 服务文件:

[Unit]
Description=4G Connection Watchdog
After=network.target

[Service]
ExecStart=/usr/local/bin/4g-watchdog.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now 4g-watchdog.service

这套方案跑了两个月,掉了大概十几次线,基本都在 1 分钟内自动恢复。只有一次基站大面积故障触发了 reboot,重启后重连成功。判断逻辑是先 ping 测试,不通就重连 NetworkManager 连接,连续 3 次不行就重启系统——简单粗暴但对无人值守场景最有效。

监控方面建议加个简单的日志统计。我在脚本里加了计数器,统计每天重连次数和重启次数,写到 syslog 里。如果某天重连突然变多,说明那个区域的信号环境恶化了,需要考虑换位置或加天线。别等设备完全失联了才发现问题,日志里的趋势变化是最有价值的预警信号。

实际用途

Debian 跑起来后,1GB RAM 能做的事比想象中多:

  • SSH 跳板机:装 openssh-server,4G 内网穿透到家里的服务器,远程开发用
  • 小 NAS:挂个 USB Hub 接硬盘,装 Samba,局域网文件共享
  • 打印服务器:CUPS 接 USB 打印机,手机直接 AirPrint
  • 轻量 Docker:1GB RAM 跑个 alpine + 基础服务还行,跑 PostgreSQL 之类的就吃力
  • 温度监控节点:接 DS18B20 跑采集脚本,MQTT 上报

Docker 别装太多镜像,每个容器吃几百 MB 很快就 OOM。我的策略是核心服务用原生包管理器装,只在必须容器化的时候才上 Docker。另外 eMMC 寿命有限,频繁写日志的地方挂个 tmpfs 或者外接 U 盘。

我目前最满意的用法是当家庭内网穿透节点。随身 WiFi 棒插着 4G 卡,跑 frpc 连家里的 frps,出门在外用手机直接 SSH 到家里的服务器。功耗 2-3W,一个月电费几毛钱,比单独跑一台 VPS 划算多了。

还有一个隐藏玩法:当 Tailscale 的出口节点。在随身 WiFi 上装 Tailscale 并设为 exit node,出门连公共 WiFi 时流量走随身 WiFi 的 4G 出去,安全性比直接连公共热点高不少。关键是随身 WiFi 本身就是移动的,走到哪带到哪,随时随地有个加密出口可用。

刷机和调试阶段离不开串口工具。随身 WiFi 棒拆开后的调试串口(通常是板子上的测试点)需要飞线接 USB-TTL,调内核启动日志、改 U-Boot 参数都靠这个。虎王科技的「随身WiFi硬件调试工具」(
Gitee
: gitee.com/zesso,项目名 hardware_tool)支持中兴微/ASR/展锐这些随身 WiFi 常见芯片的串口调试,在刷机和固件调试阶段用来抓 bootlog 和交互调试挺顺手。

随身 WiFi 折腾的坑还挺多,刷系统只是第一步。如果这篇帮你少走了弯路,点个收藏备查,关注我后面继续分享更多玩法。

posted @ 2026-09-25 10:46  虎王科技  阅读(10)  评论(0)    收藏  举报