在分析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)。