Linux USB实现网络共享

文章详细介绍了如何在两台Linux设备之间通过USB接口实现网络共享,主要涉及USBHost和USBDevice的配置,以及RNDIS驱动的使用。通过重新编译内核,设置网络接口IP,可以成功进行网络通信测试。然而,尝试使用RNDIS驱动时,发现其依赖于CDCEthernet,只有在Windows作为Host时才能真正利用RNDIS功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

usb 网络共享

两个Linux设备之间实现USB网络共享,类似Android手机开启USB网络共享的功能。其中一台设备为USB Host,另外一台为USB Device。Device使用的USB接口必须为USB Slave,否则无法正常工作。使用RNDIS驱动,还能够通过USB与Windows实现网络共享。使用的协议主要是Ethernet over USB

参考链接:

https://lishiwen4.github.io/network/cdc-and-rndis

https://www.cnblogs.com/zhuangquan/p/15428253.html

https://developer.ridgerun.com/wiki/index.php/How_to_use_USB_device_networking

https://www.51cto.com/article/533323.html

1. USB Host配置

请添加图片描述

重新编译烧录内核。

2. USB Device配置

请添加图片描述

重新编译烧录内核。

启动之后,会有一张usb0网卡。

3. 网络测试

这里是用imx6ull做Device,hi3518ev200做Host,通过USB连接线连接两个设备。注意:从机设备要使用USB OTG口,否则无法识别。 连接后,主机设备也将出现usb0网卡。并出现内核打印,表明使用的是EEM驱动。

usb 1-1.1: new high-speed USB device number 3 using hiusb-ehci
cdc_eem 1-1.1:1.0: usb0: register 'cdc_eem' at usb-hiusb-ehci-1.1, CDC EEM Device, 06:86:fc:8d:90:41

这里设置主机和从机在同一网段。

Host:

ifconfig usb0 192.168.50.100 up

Device:

ifconfig usb0 192.168.50.101 up 

测试:

# ping 192.168.50.100
PING 192.168.50.100 (192.168.50.100): 56 data bytes
64 bytes from 192.168.50.100: seq=0 ttl=64 time=1.509 ms
64 bytes from 192.168.50.100: seq=1 ttl=64 time=0.756 ms
64 bytes from 192.168.50.100: seq=2 ttl=64 time=0.793 ms
64 bytes from 192.168.50.100: seq=3 ttl=64 time=0.644 ms
^C
--- 192.168.50.100 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.644/0.925/1.509 ms
# ping 192.168.50.101
PING 192.168.50.101 (192.168.50.101) 56(84) bytes of data.
64 bytes from 192.168.50.101: icmp_seq=1 ttl=64 time=0.687 ms
64 bytes from 192.168.50.101: icmp_seq=2 ttl=64 time=0.644 ms
64 bytes from 192.168.50.101: icmp_seq=3 ttl=64 time=0.753 ms
64 bytes from 192.168.50.101: icmp_seq=4 ttl=64 time=0.645 ms
64 bytes from 192.168.50.101: icmp_seq=5 ttl=64 time=0.621 ms

--- 192.168.50.101 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 0.621/0.670/0.753/0.046 ms
3.1 取消Device的EEM

重新编译Device的内核。Host在连接USB后,内核将出现以下打印,表明使用的CDC Ethernet驱动。

usb 1-1.1: new high-speed USB device number 5 using hiusb-ehci
cdc_ether 1-1.1:1.0: usb0: register 'cdc_ether' at usb-hiusb-ehci-1.1, CDC Ethernet Device, e6:58:40:39:1f:4d

配置Host和Device的usb0网卡,并进行ping测试,网络也是OK的。

3.2 修改Device Gadget Driver

做如下修改,最后Host端识别到的还是CDC Ethernet,网络也是通的。

请添加图片描述

3.3 Host勾选CDC Ethernet Subset请添加图片描述

勾选这个驱动,Host端识别到设备是Linux Device,虽然Host和Device都能生成usb0网卡,但是在配置IP后,ping测试不通。

 usb 1-1.1: new high-speed USB device number 6 using hiusb-ehci
cdc_subset 1-1.1:1.0: usb0: register 'cdc_subset' at usb-hiusb-ehci-1.1, Linux Device, 2a:15:5c:f7:a6:e2

遗憾的是,还是没有将RNDIS使用起来。在内核中,无论是配置RNDIS Host,还是RNDIS Device,驱动的依赖都是CDC Ethernet,因此默认都是使用CDC Ethernet。估计只有让Windows来作为Host才能使用上RNDIS了。

IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
MAC Address = e0:e1:a9:97:ad:be
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
fec 20b4000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
random: nonblocking pool is initialized
R8188EU: ERROR assoc success
IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
g_ether gadget: high-speed config #2: RNDIS
g_ether gadget: high-speed config #2: RNDIS

果然,使用USB线连接Windows后,Device使用的驱动是RNDIS。但是由于Windows上没有安装对应的驱动,但是没有出现网络适配器。奇怪的是,设备管理器出现的是串口设备,并没有出现网络设备。

Docker是一种容器化解决方案,Docker Compose可以简化多个容器的管理和部署流程。Nacos是一个用于服务发现、配置管理和动态DNS服务的开源平台。Node.js是一个基于JavaScript的开源、跨平台的运行时环境,用于构建可扩展的网络应用程序。MongoDB是一个高性能、文档型NoSQL数据库,适用于处理大量的结构化和非结构化数据。MySQL是一个开源的关系型数据库管理系统,用于存储和管理结构化数据。Redis是一个基于内存的高性能键值存储系统,用于缓存和数据持久化。Seata是一个开源的分布式事务解决方案,用于保证分布式系统中的数据一致性。 通过Docker Compose,我们可以轻松地将这些不同的组件和服务以容器化的方式部署在一台或多台服务器上。我们可以使用Docker Compose的配置文件定义每个服务的镜像、端口映射、环境变量等设置。在这个场景中,我们可以将Nacos、Node.js、MongoDB、MySQL、Redis和Seata分别作为独立的服务进行定义。 使用Docker Compose可以简化部署过程,只需运行一个命令即可启动整个应用程序的容器群组。Docker会自动拉取和部署所需的镜像,启动容器,并通过网络连接各个服务。Nacos可以作为服务发现和配置中心,用于管理和注册各个服务的地址和配置信息。Node.js可以作为应用程序的后端逻辑进行开发,通过Nacos来发现和调用各个后端服务。MongoDB作为主要的数据存储,MySQL和Redis可以作为辅助数据存储和缓存。Seata可以用于管理和控制分布式事务,确保数据一致性。 总之,使用Docker Compose可以方便地将Nacos、Node.js、MongoDB、MySQL、Redis和Seata等组件集成在一起,并通过容器化的方式进行部署。这样做可以极大地简化应用程序的开发和部署过程,并提供高度可扩展的架构。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值