USB/IP
参考资料: 不容易理解:https://blog.csdn.net/weixin_43891775/article/details/111680304 推荐:http://www.usbzh.com/article/detail-320.html
1、介绍
在资源管理的机制之中, 使用的关键的技术就是网络透明的设备共享机制, 通过该机制, 可以和其他计算机的设备进行无缝交互。
在之前的技术之中,已经提出了很多的设备的共享技术,但是设备访问接口的网络透明性并没有得到充分的解决 注:网络的透明性:指的是不关注内部的具体的传输的细节,只关注两端。
透明的设备共享机制是USB/IP, 这个机制的主要的组件是虚拟主机控制器接口驱动器, 它是作为外围总线的驱动器, 由于大多数应用程序或者是设备驱动程序在访问这些外部设备的时候, 也都是通过接口来访问的, 而且接口一般都是位于操作系统的最底层。
USB/IP的设备共享技术相比于传统的方法, 具有如下的一些的优点:
- 计算机可以访问共享设备的全部的功能
- 只需要几个额外的驱动程序即可
- 不同操作系统的设备也可以相互共享设备 在usb2.0规范之中, 主机以3种传输速度 —— 分别是1.5Mb/s, 12Mb/s, 480Mb/s和4种传输的类型 —— 控制, 批量, 中断和同步, 这些传输都是由一个硬件 —— usb host controller进行控制。
2、架构
关键的设计是:usb主机控制器和usb hcd(usb 主机控制器驱动)将为usb pdd提供输入输出数据,尽管一个usb和usb pdd是使用buffer去传输一些数据以及一些回复的数据, 但是usb hcd并不会去区分这2种数据。
在usb设备驱动之中, usb request block(即URB)是以一种独立于控制器的形式去提供usb的输入和输出, 这些输入和输出包括:
- 缓冲区
- 方向
- 速度
- 类型
- 目标的地址
- 完成处理器
PDD:perdevice driver
在Linux内核中,USBIP的源码写在drivers/usb/usbip目录下,在这些文件中,以stub开头的都是server端的代码,vhci开头的是client端的代码,其余是公共部分的代码。
3、官网
http://usbip.sourceforge.net/ 终于找到源代码地址:https://sourceforge.net/projects/usbip/files/ 在linux内核中找到源码不足:
[root@ubuntu0006:/media/hankin/vdb/kernel/linux-5.15.4/drivers/usb/usbip] #ll
总用量 248
drwxrwxr-x 2 root root 4096 11月 21 2021 ./
drwxrwxr-x 27 root root 4096 11月 21 2021 ../
-rw-rw-r-- 1 root root 2176 11月 21 2021 Kconfig
-rw-rw-r-- 1 root root 496 11月 21 2021 Makefile
-rw-rw-r-- 1 root root 12272 11月 21 2021 stub_dev.c
-rw-rw-r-- 1 root root 2414 11月 21 2021 stub.h
-rw-rw-r-- 1 root root 9085 11月 21 2021 stub_main.c
-rw-rw-r-- 1 root root 16985 11月 21 2021 stub_rx.c
-rw-rw-r-- 1 root root 11668 11月 21 2021 stub_tx.c
-rw-rw-r-- 1 root root 18851 11月 21 2021 usbip_common.c
-rw-rw-r-- 1 root root 11044 11月 21 2021 usbip_common.h
-rw-rw-r-- 1 root root 4033 11月 21 2021 usbip_event.c
-rw-rw-r-- 1 root root 3601 11月 21 2021 vhci.h
-rw-rw-r-- 1 root root 39647 11月 21 2021 vhci_hcd.c
-rw-rw-r-- 1 root root 6308 11月 21 2021 vhci_rx.c
-rw-rw-r-- 1 root root 12450 11月 21 2021 vhci_sysfs.c
-rw-rw-r-- 1 root root 6041 11月 21 2021 vhci_tx.c
-rw-rw-r-- 1 root root 12887 11月 21 2021 vudc_dev.c
-rw-rw-r-- 1 root root 3650 11月 21 2021 vudc.h
-rw-rw-r-- 1 root root 2562 11月 21 2021 vudc_main.c
-rw-rw-r-- 1 root root 5539 11月 21 2021 vudc_rx.c
-rw-rw-r-- 1 root root 6124 11月 21 2021 vudc_sysfs.c
-rw-rw-r-- 1 root root 11936 11月 21 2021 vudc_transfer.c
-rw-rw-r-- 1 root root 6461 11月 21 2021 vudc_tx.c
原来还有其他地方的代码:
[root@ubuntu0006:/media/hankin/vdb/kernel/linux-5.15.4/tools/usb/usbip/src] #ll
总用量 100
drwxrwxr-x 2 root root 4096 11月 21 2021 ./
drwxrwxr-x 6 root root 4096 11月 21 2021 ../
-rw-rw-r-- 1 root root 440 11月 21 2021 Makefile.am
-rw-rw-r-- 1 root root 4802 11月 21 2021 usbip_attach.c
-rw-rw-r-- 1 root root 4567 11月 21 2021 usbip_bind.c
-rw-rw-r-- 1 root root 3804 11月 21 2021 usbip.c
-rw-rw-r-- 1 root root 14481 11月 21 2021 usbipd.c
-rw-rw-r-- 1 root root 2320 11月 21 2021 usbip_detach.c
-rw-rw-r-- 1 root root 693 11月 21 2021 usbip.h
-rw-rw-r-- 1 root root 9190 11月 21 2021 usbip_list.c
-rw-rw-r-- 1 root root 5998 11月 21 2021 usbip_network.c
-rw-rw-r-- 1 root root 5092 11月 21 2021 usbip_network.h
-rw-rw-r-- 1 root root 1078 11月 21 2021 usbip_port.c
-rw-rw-r-- 1 root root 2892 11月 21 2021 usbip_unbind.c
-rw-rw-r-- 1 root root 1028 11月 21 2021 utils.c
-rw-rw-r-- 1 root root 264 11月 21 2021 utils.h
https://github.com/torvalds/linux/tree/master/tools/usb/usbip/src
这个地址不是:https://coral.googlesource.com/linux-imx/+/refs/heads/master/tools/usb/usbip/src/usbip_unbind.c
这个github的usbip似乎是本项目的代码: https://github.com/realthunder/usbip 不能说一模一样,简直是一个模子刻出来的。 看提交记录说提取linux3.10.10版本,下载该版本看看是不是同样的文件:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/ 下下来一看,简直就是一模一样,原来项目就是使用的linux开源代码。。。。。。
结论就是:usbip代码已经合入linux代码中进行维护。
4、个人理解
USB/IP协议的主要功能:将A机器上的一个USB设备映射到B机器上使用。
USBIP是用于将Linux系统上所识别到的USB设备通过以太网共享出来的一个工具,它可以使得USB外接设备可以跨电脑或跨服务器进行访问。在USBIP基本架构中,分服务端(Server)和客户端(Client)两种,其中服务端是指插入USB设备并将其共享出来的一端,而客户端则是连接共享USB的一端,目前USBIP已经是Linux内核的一个分支,Windows平台下也有相应的工具。 服务端的USB设备被USBIP共享出来后,如果有客户端连接这个共享USB设备成功,在网络层面上建立一个TCP连接,以满足对信令和数据的传输。
USBIP工具的相关安装包目前是已经集成在debian的软件仓库中的,并且没有其他的Linux依赖,因此我们可以直接通过“apt install usbip”命令进行安装,倘若网络环境与互联网隔离,且没有部署相应的离线仓库,也可以将外网拉取的USBIP安装包直接通过dpkg的方式进行离线安装。
将USBIP安装完成后,进入/lib/modules/5.10.101-amd64-desktop/kernel/drivers/usb/usbip(具体路径视具体的Linux内核版本为准),可以看到此时USBIP生成了四个内核模块,分别为usbip-core.ko、usbip-host.ko、usbip-vudc.ko和vhci-hcd.ko。
!()[https://img-blog.csdnimg.cn/9746a4d2bd734a94b1ddaee90382fa7f.png#pic_center]
5、实战
5-1、新的命令
[root@ubuntu0006:/media/] #apt-file search usb-devices
linux-doc: /usr/share/doc/linux-doc/ABI/testing/sysfs-bus-usb-devices-usbsevseg
usbutils: /usr/bin/usb-devices
usbutils: /usr/share/man/man1/usb-devices.1.gz
默认有usb-device、usbhid-dump、usb_modeswitch、usb_modeswitch_dispatcher、usbmuxd等命令。
新大陆usb-device真的很好用。
root@admin-CE3000F:~# usbhid-dump
001:005:001:DESCRIPTOR 1656402199.703653
05 0C 09 01 A1 01 85 01 19 00 2A 3C 02 15 00 26
3C 02 95 01 75 10 81 00 C0 05 01 09 80 A1 01 85
02 19 81 29 83 25 01 75 01 95 03 81 02 95 05 81
01 C0
其他命令有机会研究研究
apt install usbip后多了:usbip、usbip_bind_driver、usbipd命令。
额外的:
root@admin-CE3000F:~# usbreset
Usage:
usbreset PPPP:VVVV - reset by product and vendor id
usbreset BBB/DDD - reset by bus and device number
usbreset "Product" - reset by product name
Devices:
Number 002/002 ID 045b:0210
Number 001/005 ID 1a2c:2124 USB Keyboard
Number 001/002 ID 045b:0209
Number 001/003 ID 05e3:0610 USB2.0 Hub
Number 001/004 ID 093a:2532 Gaming Mouse
Number 002/003 ID 05e3:0612 USB3.0 Hub
root@admin-CE3000F:~# usb_printerid
Error: usage: usb_printerid /dev/usb/lp0
5-2、内核模块
root@admin-CE3000F:/lib/modules/5.4.18-35-generic/kernel/drivers/usb/usbip# ll
总用量 288
drwxr-xr-x 2 root root 4096 7月 22 2021 ./
drwxr-xr-x 23 root root 4096 7月 22 2021 ../
-rw-r--r-- 1 root root 65009 7月 20 2021 usbip-core.ko
-rw-r--r-- 1 root root 63417 7月 20 2021 usbip-host.ko
-rw-r--r-- 1 root root 52841 7月 20 2021 usbip-vudc.ko
-rw-r--r-- 1 root root 101817 7月 20 2021 vhci-hcd.ko
root@admin-CE3000F:/lib/modules/5.4.18-35-generic/kernel/drivers/usb/usbip# date
2022年 06月 28日 星期二 15:48:12 CST
5-3、可以使用USBIP工具使用远程USB设备
参考:https://blog.csdn.net/muxia_jhy/article/details/124952561
https://www.right.com.cn/forum/thread-1074227-1-1.html
usbipd -D usbip list -l
6、libsysfs2库
在使用apt install usbip时,这个libsysfs2库也一起安装。
在sysfsutils项目中找到libsysfs2库的源代码。
2.1.0版本:https://github.com/Distrotech/sysfsutils 2.1.1版本:https://github.com/linux-ras/sysfsutils