标签归档:usb

【翻译】usb_modeswitch使用详解

原文链接:http://www.draisberghof.de/usb_modeswitch/

一、介绍

USB_ModeSwitch是一种模式切换工具,用于控制具有“多种模式”的USB设备。

越来越多的USB设备(特别是高速WAN上网卡,它基于一些手机芯片,能够改变它们的USB连接模式)都会板载它们自己的MS Windows驱动程序,当首次插入电脑时,它们会被识别为一个闪存设备,然后开始安装存储于其中的驱动程序。在安装完驱动程序之后(后面还需要再插拔一次),驱动程序就会再内部切换USB设备的连接模式,存储设备会消失(大多数情况下),然后会出现一个新的设备(例如,一个USB调制解调器)。调制解调器制造商会“可选地”调用“ZeroCD (TM)”特性,因为它会消除对用于承载一个独立驱动程序载体的需求。

起初,这方面的东西没有任何形式的文档记录,而且也几乎没有任何Linux支持可用。

从好的方面来看,大多数已知的设备在两种模式下都可以工作,使用诸如“usb-storage”或“option”(一种经过优化的串行驱动程序,高速3G调制解调器的Linux标准)的Linux驱动程序。

那么唯一的问题便是如何从存储设备切换至调制解调器设备,或者其他应该做的事情。

幸运的是,我们还有人类的理性、USB嗅探程序和“libusb”。MS Windows的驱动程序存在通信被窃听的可能性,但是,在Linux或BSD变种系统的规则之下,可以隔离触发模式切换的命令或动作,并且可以复制相同的东西。

在“libusb”的有力帮助之下,USB_ModeSwitch可以从一个配置文件中获取重要的参数,然后完成全部的初始化和通信工作,这样便使得用户可以轻松地处理这个过程。

它主要是自动使用的 — 通过udev事件和规则 — 不需要任何用户操作便能完成模式切换。但是它还可以作为一个命令行工具来运行,通常会在尝试使用某种未知设备时使用这种方式。

这个工具是大多数主流发型版的部件之一,你应当不用从源码包进行编译安装,除非运行时遇到问题,或者想要使用最新的版本。

你在提交任何问题之前,请首先仔细阅读本页面上的所有信息! 如果你使用一个新的设备,那么它会帮助你理解这个工具内部的工作原理,它也会反过来更加轻松地找到相关的切换命令,并且可以添加一条新的配置条目。

如果想要了解关于如何实现自己的USB嗅探,请查看下面的“ 贡献” 章节。

二、下载

重要: 想要完成一次高效的安装,你需要同时拥有程序和数据包!

对配置文件的修改和更新的频率可能会比发布新程序版本的频率高得多,这些配置文件包含已知USB设备的大多数信息。这也是为什么会单独提供这些配置文件。

请下载 usb-modeswitch-2.2.1.tar.bz2,源代码的发布日期为2015-01-15,Debian的软件仓库中很快也会有相应的Debian软件包。它支持很多种架构(诸如amd64或ia64)。

请下载 usb-modeswitch-data 数据包(2015-01-15)。它包含设备数据库和规则文件,包括完整的路径。你需要2.2.0版本以上的程序,因为引入了新的参数。

可选的 device_reference.txt文件(2013-11-13),它是较早设备的配置集合,分别由相应的贡献者添加;如果你想要使用某个新设备,那么你也可以将这个文件作为首选资源。

如果你的系统上没有安装 libusb-1.x,请不要忘记安装这个软件包。在大多数发行版本中,很可能有一个名为“libusb1-dev”或“libusb1-devel”的软件包(或类似的)。

较老的版本基于 libusb-0.1.12,但是自从2.0.0版本以来,只会支持libusb1.x。

有一点复杂的是,libusb1有一段时间还有一个兼容分支,叫做“libusbx”。更多信息可阅读:
http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=12912#p12912

如果你有一个带有USB主机端口的Android平板,并且Android版本至少为2.2,你可以尝试使用“ PPP Widget”,可以从Google Play下载使用。它包括USB_ModeSwitch和PPPD,使得你能够相对轻松地通过3G上网卡或手机连上网络,即使是在仅支持WiFi的设备上。

如果你是一个系统集成者(包维护者),你可以使用这个XML文件来检查新的版本:usb-modeswitch-versions.xml

USB_ModeSwitch的Debian软件包的维护者已经建立起一个PPA,提供大多数最近发布的版本,请查看论坛中的这个帖子:
http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=12609#p12609

三、如何安装

如果你已经安装了一个较早的版本,推荐卸载掉已安装的版本(运行 make uninstall 命令)。1.1.0版本中修改了若干文件的位置,如果不管旧版本的话,那么旧版本的文件就可能会被孤立。如果你以前安装的是1.1.0或更新的版本,那么你仅仅需要更新和覆盖所有已有的文件。

解压缩程序的源码文件(谁会想到!)。在新创建的目录中,以root或超级用户的身份运行以下命令:

  1. # make install

这样会安装一个用于udev的小型shell脚本、较大的包装器脚本、一个配置文件、man(使用说明)页面,以及全新编译的二进制文件。重要:如果你以这种方式安装,那么你将需要“tcl”软件包,用于处理大型的分配器脚本。还有很多种不依赖于“tcl”软件包的安装方式。请参考包含在源码包中的README文件,以便于了解更多的安装选项吧!

现在,请对数据包进行相同的操作。它将会在“/usr/share/usb_modeswitch”目录中安装配置文件,在“/lib/udev/rules.d”目录中安装udev规则文件。较早的“/etc/usb_modeswitch.d”目录被用于保存自定义配置文件(新的或修改的)。

你已经设置成功了,如果你的设备是已知的,那么你应当能够将其插入并使用。如果它不能立即使用,那么我们将会找出原因。

想要手动使用,只需要安装程序即可。在命令行界面中使用或者使用一个自定义的配置文件。如果你想要创建自己的配置,那么“device_reference”文件(请参考“下载”章节)会是一个很好的切入点。这个文件中有很多注释,会告诉你如何进行操作。

你的自定义配置文件可以用任何文件名,也可以放在任何地方;只需要用 -c 参数告诉 usb_modeswitch 如何找到这个配置文件即可。

手动使用的主要目的是测试和分析。请参考下一章。

四、如何使用

在大多数情况下,你可以不用进行任何操作(除了将设备插入)就能够使用你的设备。

如果你认为你的设备是受支持的,但是设备并没有按照预期正常工作,那么你可以首先打开日志,正如在“故障排查”章节中所述的。

若想要测试、调试你的新设备,你可以在手动模式下使用USB_ModeSwitch的二进制部分。

有两种方法:使用一个配置文件或使用命令行。

运行“usb-modeswitch -h”命令,便可列出命令行参数。如果使用了除 -W-D-I-q 之外的命令行参数,那么通过 -c 命令行参数指定的配置文件就会被忽略,你必须在命令行上提供所有的必须参数。你还可以参考内藏的使用手册页面。

想要使用某个配置文件,你可以使用“/usr/share/usb_modeswitch”目录中的小文件,或者自己创建一个文件。然后使用 -c 选项,为 usb_modeswitch 命令指定这个文件的文件名和路径。你还可以在 device_reference.txt 文档中找到一些关于型号系列的提示,以及命令行参数的解释。

重要:
USB_ModeSwitch — 就像使用 libusb 的所有程序那样 — 当手动调用这个命令时,必须以 root 身份运行(或者使用“sudo”命令)。否则,会出现奇怪的错误消息,并且设备和程序不会正常工作。当试验切换命令和策略时,可能在具有root权限的shell中进行操作会更加便利(“sudo bash”或“su -”)。

自动化方法由若干种协同工作的组件构成,以用途的逻辑顺序列出:

/lib/udev/rules.d/40-usb_modeswitch.rules — 如果识别出一个已知的设备ID(制造商/产品),那么udev规则便会启动包装器。若想要为一个新的调制解调器添加一个触发器(具有有效的配置文件),你可以新加一行,内容为它的USB ID,就像在已有条目中看到的那样。如果被切换的设备提供标准的串行端口,那么一个二级规则会再次调用包装器,然后添加一条指向正确连接端口的符号链接(见下文)。

/lib/udev/usb_modeswitch — 一个shell脚本,分叉至真实的包装器脚本。从1.1.6版本以来,脚本是和在Ubuntu中使用的“dash”shell完全兼容的,除此之外还兼容于较老的“bash”变种。为了将usb_modeswitch和udev进程分开运行,最近的版本会利用upstart或systemd特性。

/usr/sbin/usb_modeswitch_dispatcher — 这样会进行额外的设备检查,然后使用二进制文件,根据选中的设备配置文件来切换设备状态。
如果在模式切换之后,没有任何驱动程序来处理这个设备,那么分配器将会试图加载和绑定“可选的”串行驱动程序,以便于使得设备可用。

/etc/usb_modeswitch.conf — 当排查故障时,用于启用扩展日志的一个全局配置文件,或者用于禁用切换功能(主要是为了访问设备的安装部件)。

/usr/share/usb_modeswitch — 一个包含每个设备个体设置信息文件的目录,根据设备ID和可能更深入的身份标识来命名(为了解决已知的二义性)。如果你的设备ID在某个文件的文件名中出现了,那么表明你的设备是受支持的,即使它的型号或品牌并不匹配。

/etc/usb_modeswitch.d — 一个存放自定义配置文件的目录。你可以将新建的或修改的配置文件放在这儿,它们将会比 /usr/share/usb_modeswitch 目录中的配置文件被优先使用。

/usr/sbin/usb_modeswitch — 实现切换功能的二进制程序。它被设计为独立于内核或系统细节,应当可以移植到非Linux平台上,只要libusb可用即可。

在模式切换和驱动程序加载之后,系统需要负责发现新的(主要是串行的)设备。

当前的NetworkManager版本(或者它的ModemManager组件)通常非常适合于使用无线调制解调器。甚至一些已经不再使用PPP接口的新型号也能够被识别,并且能被无缝地整合。

当试图自动侦测USB调制解调器和使用它们时,使用较老版本的这些程序就很有可能发生问题。

如果你坚持使用一个较老的系统,那么请禁用NM和MM。你将能够顺利使用wvdial、UMTSmon和若干种提供PPP用户界面的工具(诸如kppp),虽然这些程序中的某些可能需要有一点基本知识。

从1.1.2版本开始,如果设备提供标准的串行端口,usb_modeswitch将会添加一条指向使用中断传输的正确端口的符号链接。这条链接的名称为 /dev/gsmmodem,如果连接了多个设备,那么在名称之后会紧跟一个编号。

你可以在连接帮助程序(诸如wvdial)中使用这个名称。注意,在很多情况下,你可能需要手动编辑配置文件。

如果你设法得到一个新型的或支持很差的设备,并且想要以手动模式正确地进行切换,那么你可以自己添加一条udev规则和一个配置文件。但是也请将其报告给我们,分享你的成果!

请查看“ 贡献 ”章节。

五、已知的适用硬件

非常重要的提示:
就个人来说,我不可能测试绝大多数的受支持设备。此处的列表 — 除了必需的数据之外 — 还要依赖于第三方团体(或用户)的报告。因此,即使你的设备在此列出,你也很有可能遇到一些问题。
也就是说,这个小工具的用户基数有着非常可观的增加,因此任何数据相关的问题通常会很快地显现出来。

迄今为止,初始化切换进程有三种已知的方法:

  1. 向存储设备发送一条很少使用或看起来怪异的标准存储命令(相当于SCSI)(例如“eject”)。

  2. 向设备发送一条或多条制造商特定的控制消息。

  3. 主动地从设备中移除(断开连接)存储驱动程序(仅适用于某些早期的设备)。

再次,如果你没有在列表中找到你设备的名称,它仍然是可能受支持的。

当然,最好能够在配置文件目录中找到你的设备的USB ID。请仔细地浏览最新的数据包(请参考“下载”章节)。

下面是受支持的设备列表,同时还有相应贡献者的信息:device_reference.txt

六、故障排查

注意:如果在遵循本页面的建议之后,你仍然需要技术支持,那么请使用论坛!

电子邮箱智能用于投稿设备/配置文件 — 不能处理技术支持问题!

已知的问题

只有版本为2.6.27以及更新版本内核的自动串口驱动程序分配才能和针对3G优化过的驱动程序协同工作。如果你的内核版本较老,并且在模式切换之后,你的调制解调器没有被任何驱动程序识别出来,那么就会使用通用的“usbserial”驱动程序作为一种备用方案。

在版本为2.6.26至2.6.28的内核中,处理ID为 19d2:2000 的设备时会遇到一些问题。这通常会影响到大多数的ZTE设备,并且会使得“usb-storage”驱动程序忽略这个ID。而这将会妨碍正确的初始化,可能会导致切换失败。你没有其他办法,只能对内核代码进行少许修改,然后重新编译你自己的内核。请参考下面内核相关的问题,以了解详细的信息。

针对于自动化系统整合的调试,请在文本编辑器中将(以root身份或者使用su命令)/etc/usb_modeswitch.conf 文件中的以下行:

  1. EnableLogging=0

修改为:

  1. EnableLogging=1

这样便使得你可以在/var/log/usb_modeswitch_<device>日志文件中看到非常详细的设备热插拔活动日志。

如果你接下来确定你的设备具有合适的取值,并且你已经遵循所有的提示(请参考“已知的适用硬件”章节)进行操作,并且USB_ModeSwitch看起来每次运行时都在做一些事情,但是却毫无效果,那么你就很有可能遇到系统相关的问题。

首先怀疑的应当是已有的用于调制解调器的系统规则,这些规则可能没有正确地处理一些东西。

如果你拥有的设备的未切换ID为 05c6:1000 ,那么它可能会在较老的系统中调用切换命令出错。有四种不同类型的切换设备,它们都具有相同的ID;在大型的发行版中,在尝试过四五次失败之后,它们都会被看做是“可选”(制造商)的型号。甚至有些手机也具有这样的ID,将这些手机连接至USB端口时,它们可能会被错误地处理。

若想要解决这样的问题,你可以尝试从 “ /lib/udev/rules.d ”目录中删除相应的规则文件,这些文件中包含对“modem-modeswitch”命令的调用。

除了USB ID之外,USB_ModeSwitch将会进行额外的检查,并且会以正确的方式处理所有已知的不明确的设备。例如,它将会对ID为 05c6:1000 的未知设备置之不理。

另一个众所周知的设备ID是 19d2:2000 。它可能会在一个已有的规则控制之下切换正常,但如果你的设备型号是新型的,这个设备的ID还尚未添加至“可选”模块中,那么系统就不会为这个设备加载驱动程序。

禁用运行“弹出”的规则,这个设备的ID将会由usb_modeswitch进行处理。

内核相关的问题

在某些较新的内核中,某些设备(上述的设备,有些是可选厂商,有些是华为的,有些是ZTE的)会在USB存储设备的代码中得到特殊处理,会立即启用切换功能。对于这些特殊的设备来说,你可能不再需要USB_ModeSwitch,从另一方面来说,你必须访问你的设备的“CD-ROM”部件。另外,特殊处理没有产生任何效果,而且被妨碍的USB_ModeSwitch后来又工作正常的情况也是存在的(ZTE设备产生错误“-2”时可能会出现这种情况)。

当发生问题时,请查看你的内核源码的“ drivers/usb/storage ”目录中的“unusual_devs.h”文件。如果你的默认设备ID(存储部件的厂商和产品ID)可以在上述文件中找到,并且当运行USB_ModeSwitch时会出现错误消息,那么首先尝试将“usb-storage”加入黑名单。

如果这么做有用,那么你应当考虑重新构建你的内核,停用“unusual_devs.h”文件中的相应条目。唯一会发生的是,以后USB存储会以默认的方式工作。

我在Gentoo的俄语版维基中找到一条提示,这条提示完全按照我刚刚的建议进行操作,使用的设备为ZTE MF626。

顺便说一下,USB开发者之间一度达成共识,如果必要的步骤可以在“用户空间”中完成,那么就会将所有未来的模式切换代码独立于内核驱动程序之外。

另一种能够影响内核行为的方法是“usb-storage”的“delay_use”参数,这个参数会设置存储设备插入系统到实际使用(可能会自动挂载)之间的延迟时间,以秒为单位。默认值为5,这个参数可能会影响某些条件下的切换结果。

若想要修改默认值,则在/etc/modeprobe.conf文件中添加以下内容:
options usb-storage delay_use=1 (or 10, or other)

老系统(例如,CentOS 5 或 Xandros 6)

如果你使用的系统比不是非常的新(内核版本低于2.6.27),那么你可能偶尔会遇到“udev”版本之间的不兼容性,它是设备管理器。如果你没有任何迹象表明usb_modeswitch正在做任何事情(没有日志文件),那么请遵循以下步骤:

检查“ /lib/udev/rules.d ”目录中,除了“40-usb_modeswitch.rules”文件之外,还有没有其他文件。
如果并非如此,那么请将文件移入“/etc/udev/rules.d”目录中。
如果仍然没有任何动作,请查看“/etc/udev/rules.d”目录中是否有其他文件包含字符串“ATTRS”。

如果并非如此,那么请编辑“40-usb_modeswitch.rules”文件,将文件中所有的“ATTR”和“ATTRS”替换为“SYSFS”。保存修改,检查当你再次插入设备时,是否有些事情发生。

在特别难解决的“没有动作”的情况下,很有可能需要分析udev的动作;你可以编辑“/etc/udev/udev.conf”文件,将日志等级修改为“debug”即可。

七、贡献

即使USB_ModeSwitch还尚未支持你自己的硬件设备,它也可以非常方便地进行实验。

第一个普遍尝试的步骤就是使用已知设备的切换方法,例如,在BandLuxe的配置“1a8d:1000”中找到的“弹出”动作序列。如果你的设备原本是由华为制造的,那么你可以尝试使用“12d1:1446”的动作序列。

不用担心,使用可能错误的动作序列几乎不可能损坏任何东西。只需要确保在每次尝试之后,重新插拔你的设备。

如果所有的这些方法都没有用,你可以尝试这种方法:

注意,设备的厂商ID和产品ID可以在“/proc/bus/usb/devices”文件中查看(也可以查看“ lsusb ”命令的输出),被分配的驱动程序通常是“usb-device”。然后,在MS Windows中监听具有相同ID的设备的USB通信,监听之前需要安装设备板载的驱动程序。设备一定会在那时切换模式,你需要将那个时刻的日志记录下来。

我推荐这个工具:“SniffUSB”

这是一个较短的版本。Mark A. Ziesemer编写过一个非常好的应用示例,如下所示:
Alltel UM175AL USB EVDO under Ubuntu Hardy Heron

请向 Mode Switch Forum 论坛提交任何改进建议、新设备信息和/或缺陷报告。
如果你不需要技术支持,你可以使用一种更加古老,更加保密的通信方式 — 电子邮件。