USBIP技術(shù)簡(jiǎn)介
1. USBIP 簡(jiǎn)介
在 USB 系統(tǒng)中,USB 設(shè)備和 USB 主機(jī)間通過 USB 線連接在一起。USB 線的長(zhǎng)度較短,USB 設(shè)備只能安裝到 USB 主機(jī)周邊,設(shè)備和主機(jī)的距離也就很短。USB over IP(后文簡(jiǎn)稱為 USBIP) 技術(shù)將 USB 設(shè)備接入 IP 網(wǎng)絡(luò),將 USB 設(shè)備連接到網(wǎng)絡(luò)上的遠(yuǎn)端 USB 主機(jī),也即 USB 主機(jī)能夠訪問網(wǎng)絡(luò)上的遠(yuǎn)端 USB 設(shè)備,相當(dāng)于通過網(wǎng)絡(luò)將 USB 連接延長(zhǎng)了,USBIP 的作用就是充當(dāng)長(zhǎng)距離 USB 延長(zhǎng)線。USBIP 連接示意圖如下:

2. USB 驅(qū)動(dòng)框架
在 Linux 內(nèi)核中,USB 驅(qū)動(dòng)分為兩個(gè)角色:主機(jī)側(cè)驅(qū)動(dòng)和設(shè)備側(cè)驅(qū)動(dòng)。當(dāng)運(yùn)行 Linux 系統(tǒng)的設(shè)備是作 USB 主機(jī)時(shí),它加載的驅(qū)動(dòng)就是 USB 主機(jī)側(cè)驅(qū)動(dòng);當(dāng)運(yùn)行 Linux 系統(tǒng)的設(shè)備是作 USB 設(shè)備時(shí),它加載的驅(qū)動(dòng)就是 USB 設(shè)備側(cè)驅(qū)動(dòng),內(nèi)核中設(shè)備側(cè)驅(qū)動(dòng)又叫 USB gadget 驅(qū)動(dòng)。
Linux 內(nèi)核中 USB 驅(qū)動(dòng)架構(gòu)如下所示:

USB 主機(jī)側(cè)驅(qū)動(dòng)控制的是本機(jī) USB Host 口與它所連接的 USB 設(shè)備間的通信。主機(jī)側(cè)驅(qū)動(dòng)有三層:最底層是 USB 主機(jī)控制器驅(qū)動(dòng),用于控制 USB 主機(jī)控制器硬件,稱作 HCI(Host Controller Interface, 主機(jī)控制器接口)驅(qū)動(dòng);中間層是 USB 核心層,實(shí)現(xiàn) USB 驅(qū)動(dòng)中通用與核心的功能;最上層是外接的各類設(shè)備的驅(qū)動(dòng),如鍵盤、鼠標(biāo)、攝像頭、U 盤的驅(qū)動(dòng)。
USB 設(shè)備側(cè)驅(qū)動(dòng)控制的是本機(jī) USB Device 口與它所連接的 USB 主機(jī)間的通信。設(shè)備側(cè)驅(qū)動(dòng)也有三層:最底層是 USB 設(shè)備控制器驅(qū)動(dòng),用于控制 USB 設(shè)備控制器硬件,稱作 UDC 驅(qū)動(dòng);中間層是 Gadget Function API;最上層是各類設(shè)備的 Gadget Function 驅(qū)動(dòng),如鍵盤、鼠標(biāo)、攝像頭、U 盤的驅(qū)動(dòng)。例如,當(dāng)本機(jī)加載 UMASS Gadget Function 驅(qū)動(dòng)時(shí),那么本機(jī)就是一個(gè) U 盤設(shè)備,將本機(jī)連接到一臺(tái) USB 主機(jī)時(shí),本機(jī)將被 USB 主機(jī)識(shí)別為 U 盤。
3. USBIP 原理
USBIP 是 client-server 結(jié)構(gòu),有兩個(gè)角色:USBIP server 和 USBIP client,將本機(jī)真實(shí)連接的 USB 設(shè)備分享到網(wǎng)絡(luò)上供其他主機(jī)訪問的機(jī)器是 USBIP server,server 提供 USB 設(shè)備分享服務(wù);通過網(wǎng)絡(luò)訪問遠(yuǎn)程主機(jī)上連接的 USB 設(shè)備的機(jī)器是 USBIP client,USBIP client 連接到 USBIP server 來實(shí)現(xiàn)遠(yuǎn)程 USB 設(shè)備通信。
USBIP 架構(gòu)示意圖:

需將此圖結(jié)合圖 1 來看。
圖 1 中設(shè)備 1 是 USBIP server 角色。一旦啟用 USBIP 功能,圖 1 中設(shè)備 1 左側(cè) Host 口所連的 USB 設(shè)備,它們將屬于 USBIP 類設(shè)備,使用 USBIP 的 stub driver 驅(qū)動(dòng)(位于圖 2 中的最上層驅(qū)動(dòng)),而不再使用原本的 HID 類設(shè)備驅(qū)動(dòng)和 Camera 類設(shè)備驅(qū)動(dòng)(位于圖 2 中的最上層驅(qū)動(dòng))。
圖 1 中最右側(cè)計(jì)算機(jī)(暫稱為遠(yuǎn)程主機(jī))是 USBIP client 角色,啟用 USBIP 功能后,相當(dāng)于在遠(yuǎn)程主機(jī)網(wǎng)口上實(shí)現(xiàn)了一個(gè)網(wǎng)口轉(zhuǎn) USB 的虛擬 USB 主機(jī)控制器,這個(gè)虛擬 USB 主機(jī)控制器由 USBIP 的 VHCI driver 來驅(qū)動(dòng),當(dāng) USBIP client 成功連接到 USBIP server 后,server 上的真實(shí) USB 設(shè)備將出現(xiàn)在 USBIP client 上,此時(shí)遠(yuǎn)程主機(jī)上看到了設(shè)備 1 上的真實(shí) USB 設(shè)備,這些設(shè)備就像是遠(yuǎn)程主機(jī)的本地設(shè)備一樣,它們連接在遠(yuǎn)程主機(jī)的虛擬 USB 主機(jī)控制器上,當(dāng)遠(yuǎn)程主機(jī)要和其中一個(gè)虛擬 USB 設(shè)備通信時(shí),其通信內(nèi)容將直接通過 VHCI driver 轉(zhuǎn)發(fā)到網(wǎng)絡(luò)上,再由設(shè)備 1 上的 stub driver 通過 USB 驅(qū)動(dòng)框架來實(shí)現(xiàn)和真實(shí) USB 設(shè)備的通信。
在 Linux 內(nèi)核中,USBIP 驅(qū)動(dòng)代碼位于 drivers/usb/usbip 目錄,這些源代碼文件中,以 stub 開頭的都是 USBIP server 端代碼,以 vhci 開頭的是 USBIP client 端代碼。內(nèi)核還提供了一份用戶空間代碼,來展示 USBIP 的用法,源碼位于 tools/usb/usbip 目錄。 可閱讀源碼了解細(xì)節(jié)。不詳述。
4. 參數(shù)資料
[1] Takahiro Hirofuchi, USB/IP: A Transparent Device Sharing Technology over IP Network
[2] 宋寶華,Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解:第 16 章,USB 主機(jī)、設(shè)備與 Gadget 驅(qū)動(dòng)
[3] USB 中文網(wǎng),USBIP 整體架構(gòu)
5. 修改記錄
2025-06-16 V1.0 初稿

浙公網(wǎng)安備 33010602011771號(hào)