最近买了台二手的 ThinkPad X1 Carbon 用来当做开发用机,系统方面选择安装了 Arch Linux 。

由于硬件方面并不是算很新,所以系统安装硬件的过程很顺利。还注意到 X1 Carbon 支持 4G 网卡,手头上刚好有一张联通的流量卡,考虑能否用起来。但是打开了盖板以后发现只是预留了插槽和天线,并没有 4G 网卡模块。

https://friable.rocks/_/2018_09_20/1537424625.jpg

根据 ArchLiux 的文档,淘宝上找了家靠谱的卖家,名为  Sierra EM7345 的模块很便宜,原装拆机的只要一百多,而且对 Linux 的支持很好,于是下单。

还是要夸下 ThinkPad 的,硬件安装非常方便,拧开螺丝就可以安装上去。硬件安装好了以后,启动使用 # lsusb 就能看到硬件了。

然后安装对应的软件包:

# pacman -S usbutils usb_modeswitch modemmanager mobile-broadband-provider-info

但是启动 ModemManage 的时候发现了问题,有报错信息:

ModemManager[13625]: <info>  Couldn't check support for device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1': not supported by any plugin
ModemManager[13625]: <info>  Couldn't check support for device '/sys/devices/pci0000:00/0000:00:19.0': not supported by any plugin
ModemManager[13625]: <info>  Couldn't check support for device '/sys/devices/pci0000:00/0000:00:1c.1/0000:04:00.0': not supported by any plugin

好在 ArchLinux 的 Wiki 上有对应的信息说明,对应的应该是 udev 的权限问题。于是增加相应的配置文件,发现并不成功。然后搜索了一圈,并没有对应的解决方案。

后来,在 rules.d 目录中发现了另外个文件 /lib/udev/rules.d/77-mm-sierra.rules 里面虽然没有对应的 Vendor, 但是从注释可以看出来这是 Sierra 相对应的 udev 权限配置文件,于是将配置加入到 /etc/udev/rules.d 其中。

注意,直接修改 /lib/udev/rules.d/ 目录的 rule 文件可能在下次更新的时候被覆盖掉。

ACTION!="add|change|move|bind", GOTO="mm_sierra_end"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1199", GOTO="mm_sierra"
GOTO="mm_sierra_end"

LABEL="mm_sierra"

# @see https://wiki.archlinux.org/index.php/USB_3G_Modem
# @see https://support.lenovo.com/us/en/solutions/pd031021
# @see https://www.freedesktop.org/software/ModemManager/api/1.8.0/ref-overview-modem-filter.html

ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{FILTER_RULE_TTY_ACM_INTERFACE}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_CDC_WDM}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_EXPLICIT_WHITELIST}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_NET}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_BLACKLIST}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_DEFAULT_ALLOWED}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_DRIVER}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_PLATFORM_DRIVER}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY_WITH_NET}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_TTY}="1"
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="a001", ENV{MM_FILTER_RULE_VIRTUAL}="1"

LABEL="mm_sierra_end"

然后,刷新 udev 的配置,并通知 kernel 启用新的权限:

# udevadm control -R && udevadm trigger

再看下对应设备文件文件的 rule 是否已经启用成功:

# udevadm info /dev/cdc-wdm0

对应的输出

P: /devices/pci0000:00/0000:00:14.0/usb2/2-4/2-4:1.0/usbmisc/cdc-wdm0
N: cdc-wdm0
E: DEVNAME=/dev/cdc-wdm0
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb2/2-4/2-4:1.0/usbmisc/cdc-wdm0
E: FILTER_RULE_TTY_ACM_INTERFACE=1
E: ID_MM_CANDIDATE=1
E: ID_MM_DEVICE_PROCESS=1
E: MAJOR=180
E: MINOR=0
E: MM_FILTER_RULE_CDC_WDM=1
E: MM_FILTER_RULE_EXPLICIT_WHITELIST=1
E: MM_FILTER_RULE_NET=1
E: MM_FILTER_RULE_TTY=1
E: MM_FILTER_RULE_TTY_BLACKLIST=1
E: MM_FILTER_RULE_TTY_DEFAULT_ALLOWED=1
E: MM_FILTER_RULE_TTY_DRIVER=1
E: MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY=1
E: MM_FILTER_RULE_TTY_PLATFORM_DRIVER=1
E: MM_FILTER_RULE_TTY_WITH_NET=1
E: MM_FILTER_RULE_VIRTUAL=1
E: SUBSYSTEM=usbmisc
E: USEC_INITIALIZED=10423134

配置生效,kernel 的配置看起来一切正常。

这时候启动 ModemManage 还是发现有错误信息,但是过了一段时间以后对应的 Modem 已经是 enable 可用状态(这点百思不得解,可能是 4G 网络连接需要初始化比较慢)。

Sep 20 14:25:44 x1-carbon ModemManager[2047]: opening device...
Sep 20 14:25:44 x1-carbon ModemManager[2047]: [/dev/cdc-wdm0] Read max control message size from descriptors file: 512
Sep 20 14:25:44 x1-carbon ModemManager[2047]: <info>  Couldn't check support for device '/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1': not supported by any plugin
Sep 20 14:25:50 x1-carbon ModemManager[2047]: <info>  Modem: state changed (unknown -> disabled)
Sep 20 14:25:50 x1-carbon ModemManager[2047]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (disabled -> enabling)
Sep 20 14:25:54 x1-carbon ModemManager[2047]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (enabling -> enabled)
Sep 20 14:25:54 x1-carbon ModemManager[2047]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: 3GPP Registration state changed (unknown -> registering)
Sep 20 14:25:54 x1-carbon ModemManager[2047]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: 3GPP Registration state changed (registering -> home)
Sep 20 14:25:54 x1-carbon ModemManager[2047]: <info>  Modem /org/freedesktop/ModemManager1/Modem/0: state changed (enabled -> registered)

然后在控制台下使用 mmcli 获取相关的信息,具体的 mmcli 可以参考这里的文档。发现了一个不大不小的问题,就是 sim 卡的日期还是 20040101 ,很明显没有和网络同步(后来发现这块并不重要)。

$ mmcli -m 0 --simple-status

/org/freedesktop/ModemManager1/Modem/0
  -------------------------
  Status |          state: 'connected'
         | signal quality: '67' (recent)
         |          bands: 'unknown'
         |    access tech: 'lte'
  -------------------------
  3GPP   |   registration: 'home'
         |  operator code: '46001'
         |  operator name: 'CHN-UNICOM'
         |   subscription: 'unknown'

再尝试启动 modem-manage-gui 看其信息,过一会发现已经注册了网络并能获取对应的信息。

https://friable.rocks/_/2018_09_20/1537427550.png

硬件方面的配置没有问题,那么软件方面的设置就简单多了。然后使用 Gnome 的网络配置,配置 APN 已经相关的网络参数,过一会就能看到久违的信号了。

https://friable.rocks/_/2018_09_20/1537427570.png

总结下,这个问题困扰了我一个晚上的时间,然后也走了很多的弯路。

主要还是在硬件资源的权限方面,这块还是要多看 Arch 的 Wiki 以及对应软件的 Manual(开源社区的锅都扔给用户了)。

相关的参考链接:

PS,有什么靠谱的联通流量卡推荐下?

- eof -