linux usb usbip驅動詳解(一)

在分析usbip驅動前,咱們先來學習一下usb總線在linux系統下的表示。html

咱們知道在linux中,/proc和/sys這個兩個文件系統包含了不少有用的信息,因此usb的信息天然也少不了利用他們來展現。linux

1,咱們在《linux usb gadget驅動詳解(三)》知道了ls /sys/class/udc 能查看系統註冊了的udc驅動。git

2,cat /proc/devices能查看當前系統註冊了哪些驅動,linux系統爲每一個已註冊的設備驅動分配一個「主設備號」:github

Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 21 sg
 29 fb
 89 i2c
 90 mtd
128 ptm
136 pts
180 usb
189 usb_device
204 ttyAMA
218 himedia
251 ubi2
252 ubi1
253 ubi0
254 bsg

Block devices:
  1 ramdisk
259 blkext
  8 sd
...
...

跟usb相關的有這兩個:數據庫

180 usb
189 usb_device
ubuntu

它們表明的驅動是有區別的。並且並非全部usb設備驅動(USB接口驅動)都分配一個主設備號,有些是掛接在一些子系統內,如USB HID鍵鼠設備,就掛接在input子系統內。建議你們把《Linux那些事兒之我是USB》書看爛,裏面有描述。windows

3,ls /sys/bus/usb/devices/也包含了不少信息:bash

1-0:1.0    2-1        2-1.1:1.0  usb1
2-0:1.0    2-1.1      2-1:1.0    usb2

其中usb一、usb2表明系統註冊了2條usb總線,即有2個USB主機控制器,1和2用於區分不一樣總線,是USB的總線號。socket

每插入一個usb設備,/sys/bus/usb/devices/就有新的文件夾生成。其中「2-1:1.0」表明usb總線號爲2,devpath爲1,配置號爲1,接口號爲0,即2號總線的1號端口的設備,使用的是1號配置,接口號爲0。而「2-1:1.0」表明的是一個hub設備,可根據下面得知:tcp

/sys/bus/usb/devices # cat 2-1:1.0/bInterfaceClass
09(其中09表明Hub,又如,08表明mass storage等)

       那麼當hub的端口上又接入usb設備,那麼在linux下又怎麼表示呢?咱們能夠看到還有一個「2-1.1:1.0」,這就是利用了devpath的做用,頂級設備的devpath就是其連在Root Hub上的端口號,而次級的設備就是其父hub的devpath後面加上其端口號,即2-1:1.0是一個Hub,那麼它下面的1號端口的設備就是的上面的「2-1.1:1.0」,2號端口的設備就能夠是「2-1.2:1.0」等。

      OK,如今能夠開始講述usbip了。

usbip驅動提供了linux下USB透傳(bypass)的功能,或者說usb over tcp,利用以太網,將usb設備共享到另一端。usbip剛開始是一個獨立的項目(http://usbip.sourceforge.net/),後來合併到linux主分支中,源碼在drivers/usb/usbip下,由linux usb子模塊的那幫大牛維護。

盜用usbip項目的圖:

      usbip分爲兩端:server端和client端,它們分別運行在不一樣的linux主機中,其中運行server端驅動的PC插入usb設備(如U盤等),用於共享。此時client端PC就能夠attach到server端,此時client端的主機PC就能看到u盤,它覺得真的有一個u盤插入本機,併爲其安裝驅動,效果跟在本機上直接插入U盤無異,實現了u盤共享,或者USB延長器的功效。

在分析usbip代碼前,咱們來玩一下usbip,感覺一下:

材料準備:兩臺裝有ubuntu系統的PC,或者虛擬機,兩臺PC能相互ping通,ubuntu版本爲16.04。

      由於ubuntu16.04的內核版本爲linux4.4以上,因此usbip的用戶態工具不能使用apt-get install來安裝,用apt安裝獲得的是配套舊版本的usbip驅動,因此咱們須要uname -a查看ubuntu當前使用了什麼版本的kernel,而後在https://www.kernel.org/下找到對應版本的kernel版本,下載源碼,解壓後,進入內核的根目錄下tools/usb/usbip,這個是應用程序,用來配置usbip驅動的,在編譯前ubuntu須要安裝依賴:

sudo apt-get install autoconf automake libtool libudev-dev

而後就能夠在源碼目錄運行./autogen.sh,生成configure了。

最後就是經典的「三部曲」:
./configure
make
make install


      ok,此時獲得了usbip的配置工具了(注意不要使用apt-get install來安裝usbip工具,由這種途徑獲得的工具版本是配套舊版本的usbip驅動(linux3.x之前的版本),在linux4.x版本的usbip驅動上沒法正常配置),但usbip工具要求咱們在/usr/share/hwdata/下放入usb.ids數據庫,usb.ids文件能夠到usb.org下載,裏面包含了各類廠商的VID和描述信息,能夠作實驗了:

在server端PC上:

sudo modprobe usbip-host
usbipd -D

加載驅動,運行usbipd程序,該守護進程用於創建TCP socket鏈接等。

插入一個U盤/鼠標,此時usbip list -l應該能列舉出設備,用於查看busid

usbip list -l
 - busid 2-1.1 (046d:c077)
   Logitech, Inc. : M105 Optical Mouse (046d:c077)

咱們找到busid是2-1.1的羅技鼠標爲咱們將要共享的設備。咱們須要綁定它,以便於共享,有complete字眼說明綁定成功:

usbip bind -b 2-1.1
usbip: info: bind device on busid 2-1.1: complete

而usbip unbind -b 2-1.1則是解綁,用於關閉usb的共享。

在client端PC上:

modprobe vhci-hcd
#usbip list –r <server端ip地址>
usbip list -r 192.168.100.191
#usbip attach -r <server端ip地址> -b <busid>
usbip attach -r 192.168.100.191 -b 2-1.1

也須要加載驅動,ubuntu默認是不主動安裝usbip驅動的,但它自帶了,不須要咱們自行編譯,因此直接使用modprobe加載便可。其中192.168.100.191是server端PC的ip地址。usbip list -r 192.168.100.191能列舉出server端已經導出的usb設備,這裏咱們導出了2-1.1設備,還能看出是羅技的。運行「usbip attach -r 192.168.100.191 -b 2-1.1」 就能將遠程的usb設備attach到本地,此時就能若是是U盤就能讀寫U盤,這裏是鼠標,此時就是一個KVM的遠程鼠標控制功能了。使用./usbip detach -p 0能夠斷開usb設備。

      總的來講usbip在必定程度上實現「usb延長器」功能,但存在必定問題(缺陷):

            1,兼容性問題,我測試過usb攝像頭支持得很差。

            2,穩定性問題,插拔usb後恢復得不是很好,有待提升。

            3,缺少長期測試,沒有用於真實產品。

      市面上的USB網線延長器(能過交換機那種)就是利用以太網幀傳輸usb數據的,但它是利用硬件實現,兼容性、穩定性會更好,我曾設想過使用"FPGA+ usb phy(UPLI接口)+Ethernet phy(RGMII接口)"來實現usb延長器功能,但遲遲沒動手。畢竟usb硬件抓包就是利用FPGA+usb phy來實現抓包的(開源硬件USB抓包及協議分析工具分享),既然能抓包,就能把數據原樣傳輸出去,理論上是可行的,但從USB協議規範能夠知道,usb對時間要求挺高的,不少狀態轉移均由時間超時相關,因此要想作得好,FPGA須要處理的東西仍是挺多的,不然可能傳着傳着就識別不到usb設備(usb設備掛起)了。

      須要說明的是,usbip驅動是用於linux操做系統的。對於windows下,也有相似的開源項目。但我精力有限,沒有測試過,有興趣的朋友能夠自行編譯+測試。github路徑爲https://github.com/cezanne/usbip-win 。windows下的client端我以爲用途更大一點,畢竟很常見的一個情景是,在嵌入式linux設備(server)上插入U盤/加密狗,須要在windows(client)下獲取u盤內容/加密狗驗證。

      最後,不得不說,windows下有好用的、但收費的專用usb共享軟件。譬如usb over network (http://www.usb-over-network.com/),好像能夠無償使用導出一個設備,想要導出多個設備須要花錢購買。功能挺強大的,我測試過能共享 USB 1080p高清攝像頭,很穩定,延時也不大。吾愛破解網貌似有大神破解了,有興趣的能夠試下(https://www.52pojie.cn/thread-982233-1-1.html)。

相關文章
相關標籤/搜索