【原创】rg100a使用OpenWrt,单路由实现多个3G上网卡宽带合并[2011/4/21更新]
2011/4/21 最近更新: 更新了附件最近特意买了个带电源的只支持USB1.1的HUB,3G网卡插上面能正常拨号。这样一来,上面那个USB口就可以插移动硬盘,下面那个口可以接个hub再接多个3G网卡了,脱机下载完美了 :)
本教程仅针对rg100a/db120和openwrt官方backfire 10.03固件(因为h618b刷openwrt上3G有60K的网速限制,需要自行编译、更新内核等,所以h618b还是考虑刷TT或3G专用固件更省事。)
先泼一瓢冷水,如果你要脱机下载,需注意下面几个问题:
1.关于USB口的问题。rg100a/db120下面的U口能支持USB2.0和USB1.1,而上面那个U口仅支持USB2.0且不能向下兼容USB1.1。但是大部分3G网卡都是USB1.1的,所以3G网卡只能插下面那个口。
2.如果安装了kmod-usb2(也就是同时启用USB2.0和USB1.1)。上面的U口接移动硬盘没问题,但是不能接3G网卡;下面那个U口可以接移动硬盘和3G网卡都没问题。但是想在下面那个U口插个USB-HUB(同时兼容USB2.0和USB1.1的HUB),再把3G网卡插USB-HUB上面,虽然能识别3G网卡但是不能拨号。
起初,我怀疑是供电不足,所以我又买了个带电源的USB-HUB,情况还是一样,或者买个更好的hub,再或者买个只支持USB1.1的hub??
3.如果不安装kmod-usb2(也就是只启用USB1.1)。参考第一条,上面那个U口就没用;下面的U口也可以接移动硬盘和3G网卡。在下面这个U口接个hub再接移动硬盘和N个3G网卡都没问题,但移动硬盘连接速度只能是USB1.1的了,对于脱机来说没什么大问题,但有点蛋疼啊。
所以想脱机下载又想多3G网卡合并的童鞋请注意一下!或许买个更好的USB-HUB,或许买个只支持USB1.1的HUB插下面那个U口,能解决以上问题?希望高手可以好好研究下,呵呵。
大冬天的被泼冷水了,如果你还有热情想折腾,那请继续往下看
多3G网卡宽带合并分成两种情况:一种是相同型号的网卡合并,另一种是不同型号的网卡合并。
如你是新手,请先搞定单网卡的上网,再来看这篇教程,可以参考我的上一篇教程:http://www.thinkpad.cn/forum/thread-948344-1-1.html
一、相同型号3G网卡的宽带合并
1. 3G网卡的即插即用
如果你是用的backfire10.03的固件,
建议更新chat comgt usb-modeswitch usb-modeswitch-data这几个包到最新版,trunk版一般都包含最新的软件包,地址如下:http://downloads.openwrt.org/snapshots/trunk/brcm63xx/packages/
comgt最新版新增了自动拨号脚本,很方便。
usb-modeswitch、usb-modeswitch-data最新版能监视3G网卡的接入,把网卡(USB)自动转换成串口。
装完usb-modeswitch-data后,/etc/usb_modeswitch.d目录下有很多配置文件,也就是以前的usb_modeswitch.conf。
只不过文件名的格式需要改成,很简单只要对照自己的网卡修改就ok了。
更新后基本上是全自动了,插上网卡后就可以上网了,不再需要/etc/init.d/td01脚本了。
2. 多3G网卡的宽带合并
由于型号相同,其TargetVendor和TargetProduct值也是一样的,所以/etc/modules.d/60-usb-serial内容就保留之前的值就好了。
比如:usbserial vendor=0x19d2 product=0x0003 # ZTE MU350虽然最新版的Multi-WAN已经能支持了3G网卡的宽带合并了,但我推荐用m-route,叠加效率最少90%以上,
安装m-routeopkg update
opkg install m-route编辑配置文件/etc/config/mroute
如下:config 'websettings' 'webadmin'
option 'userlevel' '1'
option 'enable' '1'
config 'mroute' 'settings'
option 'os' 'OpenWrt'
option 'debug' '0'
option 'sleeptime' '5'
option 'testip' '220.181.111.86'
option 'timeout' '2'
option 'success' '2'
option 'failure' '3'
option 'resetif' '5'
config 'wanif' 'td01'
option 'name' 'Provider1'
option 'weight' '1'
# option 'mark' '15'
# option 'ports' '25'
config 'wanif' 'evdo'
option 'name' 'Provider2'
option 'weight' '1'
# option 'mark' '16'
# option 'ports' '80 21 6666 6667 6668'
config 'lanif' 'lan'
option 'name' 'LAN'
config 'mroute' 'system'
option 'apply' '/usr/lib/lua/lua-xwrt/applys/mroute.lua'我这里加了个“evdo”的接口,也就是把“td01”和“evdo”合并,option 'testip'可以自己选一个,比如baidu.com的ip,很简单。
二、不同型号3G网卡的宽带合并
1. 同时识别不同型号的多个3G网卡
型号不一样的3G网卡,其TargetVendor/TargetProduct值也肯定不一样,系统无法根据/etc/modules.d/60-usb-serial的vendor/product值把两个模块同时装载,手动装载也不行。这样也就不能给网卡分配节点了,如ttyUSB0、ttyUSB1等。
但是请保留60-usb-serial的内容为默认的:usbserial,切记!
由于系统限制同时只能装载一个模块,所以我们需要自行修改编译usb-serial,使其支持多个不同设备的同时接入,我这里已经编译(后面会提到)好了usb-serial(只能用于2.6.32.10内核,比如:backfire 10.03),支持的网卡见附件,如果支持列表没有你的网卡型号,请把其TargetVendor/TargetProduct值贴上来,我可以帮你编译进去。
先删除官方的usb-serialopkg remove kmod-usb-serial由于安装ipk包会效验其MD5值是否和官方一致,所以先删除opkg-lists缓存rm /tmp/opkg-lists/packages再安装我提供的usb-serial
2. 给网卡分配固定的设备节点
一个3G网卡通常会有几个模块接口,每个接口会分配到一个设备节点,这样一个网卡就会被分配如:ttyUSB0、ttyUSB1、ttyUSB2,这么多节点我们真正需要的只是其中一个节点,有可能是ttyUSB0或者ttyUSB1。
由于设备节点是按照系统检测到3G网卡的顺序分配的,也就是说谁先接入系统谁就先分配到ttyUSB0,后接入的设备按顺序叠加ttyUSB1、
ttyUSB2...ttyUSB3...这时候再插入一个网卡,说不定都到了ttyUSB7、ttyUSB8...颠倒网卡的插入的顺序,会导致分配的节点也不一样。
如果同时插入两个网卡(比如断电重启路由器),也就是同时检测到两个网卡同时接入,那就会出现设备节点交替的情况,更加混乱。(虽然
两个型号一样的网卡也会出现节点交错的情况,但由于型号相同,那它们肯定是同一个版本的3G,要么都是td-scdma,要么都是wcdma...这样只需调用一个拨号脚本就好了,相对还是好控制些)
综上,我们需要给设备分配固定的节点,不然太乱了,呵呵
这里我们引入udev,理论方面请自行查找相关资料,不废话立马实施。
先安装opkg install udev插入一个网卡,查看/dev/和/sys/class/tty/目录下有没有设备节点的连接,比如:ttyUSB0、ttyUSB1...
如果没有,把前面的功课做好了再来。
如果有,运行如下命令:udevadm info -a -p /sys/class/tty/ttyUSB0当然你要判断哪个节点才你是需要的,有可能是ttyUSB1
那就运行udevadm info -a -p /sys/class/tty/ttyUSB1
运行结果如下显示:/$ udevadm info -a -p /sys/class/tty/ttyUSB0
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/platform/bcm63xx_ohci.0/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/platform/bcm63xx_ohci.0/usb1/1-1/1-1:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="generic"
ATTRS{port_number}=="0"
looking at parent device '/devices/platform/bcm63xx_ohci.0/usb1/1-1/1-1:1.0':
KERNELS=="1-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usbserial_generic"
ATTRS{bInterfaceNumber}=="00" #我们需要这个值,和ttyUSB0是对应关系
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="ff"
ATTRS{bInterfaceProtocol}=="ff"
ATTRS{modalias}=="usb:v19D2pFFF1d0000dc00dsc00dp00icFFiscFFipFF"#我们也需要这个值,细心一点会发现里面包含有这个接口的TargetVendor/TargetProduct值,也就19d2:fff1
ATTRS{supports_autosuspend}=="0"
ATTRS{interface}=="Data Interface"
looking at parent device '/devices/platform/bcm63xx_ohci.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 5"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="500mA"
ATTRS{urbnum}=="17"
ATTRS{idVendor}=="19d2"
ATTRS{idProduct}=="fff1" #这里也是TargetVendor和TargetProduct值,也说明ttyUSB0就是我们要找的节点
ATTRS{bcdDevice}=="0000"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="3"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="ZTE, Incorporated"
ATTRS{product}=="ZTE CDMA Tech"
looking at parent device '/devices/platform/bcm63xx_ohci.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}=="0mA"
ATTRS{urbnum}=="50"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="1"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.32.10 ohci_hcd"
ATTRS{product}=="BCM63XX integrated OHCI controller"
ATTRS{serial}=="bcm63xx"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/platform/bcm63xx_ohci.0':
KERNELS=="bcm63xx_ohci.0"
SUBSYSTEMS=="platform"
DRIVERS=="bcm63xx_ohci"
ATTRS{modalias}=="platform:bcm63xx_ohci"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""上面这么多信息,我们只需要其bInterfaceNumber和modalias值就行了。
同样的,我们用上面方法查看其它网卡的bInterfaceNumber和modalias值,不罗嗦了。
根据上的信息我们来写udev规则,新建一个文件:/etc/udev/rules.d/10-usb.rules
内容如下:ACTION=="add", ATTRS{modalias}=="usb:v12D1p1D09d0100dc02dsc00dp00ic02isc02ip01", ATTRS{bInterfaceNumber}=="01", SYMLINK="et128", RUN="/sbin/ifup td01"
ACTION=="add", ATTRS{modalias}=="usb:v19D2pFFF1d0000dc00dsc00dp00icFFiscFFipFF", ATTRS{bInterfaceNumber}=="00", SYMLINK="ac2746", RUN="/sbin/ifup evdo"
ACTION=="add", ATTRS{modalias}=="usb:v19D2p0003d0100dc00dsc00dp00icFFiscFFipFF", ATTRS{bInterfaceNumber}=="01", SYMLINK="mu350", RUN="/sbin/ifup td02"SYMLINK="ac2746"意思是建立一个连接(别名)如:/dev/ac2746,其指向真正的节点/dev/ttyUSBn,这样不管我们插入网卡的顺序如何,
其/dev/ac2746总是指向我们需要的那个节点。
RUN="/sbin/ifup evdo"意思是启用这个网络接口,也就是拨号啦。这样的话,新版comgt自带的自动拨号脚本/etc/hotplug.d/usb/30-3g也可
以删掉了。
然后Web管理页面Network->Interfaces新增网络接口,Modem device填入这个固定值:/dev/ac2746
当然还要新建一个启动项/etc/init.d/udev,让udev自动运行,内容如下:#!/bin/sh /etc/rc.common
# Copyright (C) 2009 OpenWrt.org
START=19
start() {
killall udevd > /dev/null 2> /dev/null
udevd --daemon
udevadm trigger
udevadm settle
sleep 5
}
stop() {
killall udevd
}设置可执行权限:chmod +x /etc/init.d/udev启用服务/etc/init.d/udev enable启用udev后,当插入一个网卡,系统会自动应用那些udev规则,如果匹配就建立一个节点的连接,并激活那个网络接口拨号。
讲了这么多,要是觉得麻烦的话,你不装udev也可以,只不过每次你都要按一定顺序插入你的所有网卡,这样设备节点也不会乱,呵呵。
最后装上前面讲的m-route就可以合并了,貌似在一个网卡掉线后,m-route不会自动更新DNS,同时各个运营商之间的DNS不能通用,所以最好自己定义DNS(在新增网络接口那里可以自定义DNS),推荐用google和opendns的。
三、自己编译usb-serial
如果我编译的usb-serial不支持你的网卡或者你的openwrt内核不是2.6.32.10,那么你需要自己编译它了。
1. 首先你得有个linux,推荐Ubuntu,因为简单方便。
2. 搭建交叉编译环境。
3. 编译Openwrt,先把usb-serial包加进去编译一次。
4. 编辑build_dir/linux-brcm63xx/linux-2.6.32.10/drivers/usb/serial/generic.c
查找:generic_device_ids.idVendor = vendor;
generic_device_ids.idProduct = product;
generic_device_ids.match_flags =
USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;在其后添加: /*ZTE MU350_MU351*/
generic_device_ids.idVendor = 0x19d2;
generic_device_ids.idProduct = 0x0003;
generic_device_ids.match_flags =
USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
/*Huawei ET128_ET128-2*/
generic_device_ids.idVendor = 0x12d1;
generic_device_ids.idProduct = 0x1d09;
generic_device_ids.match_flags =
USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;
/*ZTE AC2746*/
generic_device_ids.idVendor = 0x19d2;
generic_device_ids.idProduct = 0xfff1;
generic_device_ids.match_flags =
USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT;你有多少个网卡就加多少个,这里idVendor/idProduct都是Target值,很简单啦,自己看咯,呵呵
5. 再编译一次。
6. bin/brcm63xx/packages下面就能找到你自己编译好的usb-serial了
7. 上面1. 2. 3.不懂的请google或baidu
8. 我好累,你也好累,但总算完成了!呵呵
[ Edited byantclan on 2011-4-21 11:54 ] 沙发一下 ^,^ 一看楼主就是有文化的人 占位帮顶,再次向楼主学习 :D 这个得支持 厉害,我封你为十大杰出青年…… 杯具,不知道我的 MU351和MU350能不能算同型号3G网卡 强帖终于出来了,终于可以合并我的2张北神卡了 强帖留名,希望管理员加入精华:) 重量级技术贴。 这个得支持 忘记MU350/351了:-| 不知道ET127、ET128、ET128-2是不是也一样情况?呵呵
貌似它们的TargetVendor和TargetProduct值都是一样的
MU350关闭存储模式,可以延长被检测到的时间,再和MU351配合应该能错开设备节点分配
更准确的讲:TargetVendor和TargetProduct值一样的网卡用官方usb-serial包就行
TargetVendor和TargetProduct值不一样的网卡需要自行编译usb-serial 技术贴,前排! mark 楼主神人啊,佩服,折腾了一下db120,亏邮费退了:'( ,周一试试h618b 支持,这个要动手~~ 有3个3G网卡,有时间试试看看能不能合并。 牛人啊,对linux这么熟悉?^,^ 这个真强大呀,搞不顶呀 cmwap 也可以脱机下载?? 我顶啊,猛料又来了。。。。喜欢 楼主我安装你的usbserial
Vendor = 0x12d1;
Product = 0x1d09;
仍然是not found
回复 #22 cafield2222 的帖子
ET128?单网卡能识别不?
not found?? 详细点 我根据http://www.ibmnb.com/thread-948344-1-3.html这个帖子来的.
刷固件,安装comgt,chat等,跳过设置vlan,到"四、OpenWrt下识别3G上网卡"这步,尝试你帖子里的vender和product.
putty连接ssh到rg100a上,输入usbserial vendor=0x12d1 product=0x1d09 # Huawei ET128,系统提示not found
后又卸载掉旧的usb-serial ,安装你提供的usb-serial.ipk,输入usbserial vendor=0x12d1 product=0x1d09 # Huawei ET128_ET128-2,系统还是提示not found
就卡壳了 我就是单ET128接入OPENWRT拨号 如官方usb-serial包,则编辑/etc/modules.d/60-usb-serial 内容如下:
usbserial vendor=0x12d1 product=0x1d09 # ET128
如用我的usb-serial包,/etc/modules.d/60-usb-serial 内容默认如下就可以了:
usbserial
以上完成后都要重启路由
如果ssh手动加载模块,命令是这样的:
insmod usbserial vendor=0x12d1 product=0x1d09
不知道我讲明白没:) 强烈支持~~ 我再试试,谢谢了. 高人,测试一下。 我编辑vi /etc/config/network如下:
config 'interface' 'loopback'
option 'ifname' 'lo'
option 'proto' 'static'
option 'ipaddr' '127.0.0.1'
option 'netmask''255.0.0.0'
config 'interface' 'lan'
option 'type' 'bridge'
option 'ifname' 'eth1.0'
option 'proto' 'static'
option 'ipaddr' '192.168.0.168'
option 'netmask''255.255.255.0'
option 'gateway' '192.168.0.1'
option 'dns' '192.168.0.1'
option 'nat' '1'
config 'interface' 'wan'
option 'ifname' 'eth1.1'
option 'proto' 'dhcp'
config 'switch' 'eth1'
option 'reset' '1'
option 'enable_vlan' '1'
config 'switch' 'eth1'
option 'reset' '1'
option 'enable_vlan' '1'
config 'switch_vlan'
option 'device' 'eth1'
option 'vlan' '0'
option 'ports' '"1 2 3 5*"'
config 'switch_vlan'
option 'device' 'eth1'
option 'vlan' '1'
option 'ports' '"0 5*"'
保存重启后连不上了,指示灯正常,telnet和web都连不上,现在怎么能恢复?