最近遇到一个颇有迷惑性的问题:笔记本正常启动后,内置 4G LTE 网卡可以连接网络;但从睡眠状态唤醒后,桌面中的“移动网络”入口直接消失。重启 ModemManager 也无法恢复,只有重启电脑才会重新出现。
表面上看像是 LTE 网卡掉电或硬件失联,实际排查下来,设备并没有真正消失。问题发生在 USB MBIM 设备恢复之后,ModemManager 没能重新建立正确的控制端口。
本文记录完整的定位过程,以及最终采用的自动恢复方案。
2c7c:0127不同发行版和模组也可能出现相似问题,但文中的设备 ID 和恢复脚本需要根据实际硬件调整。
先查看 PCI 和 USB 设备:
1 | lspci -nnk |
LTE 模组没有出现在 PCI 设备中,而是作为内部 USB 设备连接。启动日志中可以看到:
1 | usb 3-2: New USB device found, idVendor=2c7c, idProduct=0127 |
随后,内核的 cdc_mbim 驱动创建控制和网络接口:
1 | cdc_mbim 3-2:1.1: cdc-wdm0: USB WDM device |
这说明该模组工作在 MBIM 模式。正常情况下:
/dev/cdc-wdm0 是 MBIM 控制端口;wwp0s20f0u2i1 是数据网络接口;下面的命令可以集中查看本次启动中与睡眠、USB 和蜂窝网络有关的日志:
1 | journalctl -b -k --no-pager | \ |
睡眠前,LTE 连接完全正常:
1 | ModemManager: state changed (registered -> connecting) |
系统随后进入 S3:
1 | PM: suspend entry (deep) |
唤醒时,内核确实重新设置了设备:
1 | ACPI: PM: Waking up from system sleep state S3 |
这条记录很关键:USB 总线仍能看到 EM05-CE,说明它没有在硬件层面彻底消失。
唤醒后,ModemManager 重新探测 cdc-wdm0,但最终失败:
1 | [cdc-wdm0/probe] probe step: MBIM |
冷启动时,同一个仅暴露 MBIM 接口的模组可以被正确识别:
1 | [modem0/cdc-wdm0/mbim] (shared-quectel) MBIM device is AT capable |
因此可以排除以下方向:
更符合日志的解释是:EM05-CE 从 S3 恢复后,USB 设备虽然仍在,但 MBIM 控制端口处于不完整状态。ModemManager 在重新探测时发生端口识别竞态,未能再次确认 AT-over-MBIM 能力,最终没有创建 Modem 对象。桌面自然也就不再显示移动网络。
首先尝试了最常见的恢复方式:
1 | sudo systemctl restart ModemManager |
但日志仍然是:
1 | Cannot add port 'usbmisc/cdc-wdm0', unhandled port type |
原因是问题已经落在 USB/MBIM 设备状态上。重启用户态服务不会重新枚举 USB 设备,所以 ModemManager 得到的仍是同一个异常端口状态。
当前机器上,EM05-CE 位于 USB 路径 3-2。对这个设备执行一次解绑和重新绑定即可恢复:
1 | sudo sh -c 'printf "%s" 3-2 > /sys/bus/usb/drivers/usb/unbind' |
注意:3-2 是本次机器上的 USB 路径,不应直接照抄到其他电脑。可以通过下面的方式确认设备:
1 | for device in /sys/bus/usb/devices/*; do |
重新枚举之后,日志显示:
1 | cdc_mbim 3-2:1.1: cdc-wdm0: USB WDM device |
这也最终验证了问题所在:只有让 USB 设备重新枚举,ModemManager 才能获得一个干净的 MBIM 控制端口。
手动执行解绑和绑定并不方便,可以使用 systemd 的睡眠钩子自动完成。
创建 /usr/lib/systemd/system-sleep/quectel-em05-resume:
1 |
|
赋予执行权限:
1 | sudo chmod 0755 /usr/lib/systemd/system-sleep/quectel-em05-resume |
这个脚本没有写死 3-2,而是根据 USB VID/PID 动态查找设备。即使某次启动后的总线编号发生变化,它仍能找到正确的模组。同时,它只重置 LTE 模组,不会重置整条 USB 控制器,因此不会连带影响摄像头、蓝牙或外接 USB 设备。
执行一次睡眠:
1 | systemctl suspend |
唤醒后等待约 5 至 10 秒,然后检查钩子日志:
1 | journalctl -b -t quectel-em05-resume |
正常情况下会看到:
1 | resetting USB device 3-2 after resume |
还可以检查内核和 ModemManager:
1 | ip link show |
如果看到 wwp... 网络接口,且 mmcli -L 列出了 Quectel Modem,说明恢复成功。
如果安装钩子后出现其他问题,删除它即可:
1 | sudo rm /usr/lib/systemd/system-sleep/quectel-em05-resume |
删除后不需要执行 daemon-reload,下一次睡眠时它就不会再运行。
这次故障最容易误判成“LTE 网卡睡眠后掉电”。实际上,内核始终能够看到 USB 设备,真正失败的是恢复后的 MBIM 控制端口和 ModemManager 重新识别过程。
排查这类问题时,可以按以下层次逐级确认:
lsusb 或 sysfs 中是否仍有设备;cdc_mbim 是否绑定、网络接口是否存在;/dev/cdc-wdm* 是否生成;当重启 ModemManager 无效,而 USB 设备仍在时,针对目标设备做一次解绑和重新绑定,往往比重启整机更快,也比重置整个 USB 控制器更安全。长期仍应关注内核、ModemManager 和设备固件更新;睡眠钩子属于针对当前恢复兼容性问题的实用规避方案。