[QEMU]USB 仿真

QEMU可以模擬PCI UHCI,OHCI,EHCI或XHCI USB控制器。您可以插入虛擬 USB 設(shè)備或真正的主機(jī) USB 設(shè)備(僅適用于某些主機(jī)操作系統(tǒng))。QEMU 將根據(jù)需要自動(dòng)創(chuàng)建和連接虛擬 USB 集線器,以連接多個(gè) USB 設(shè)備。
USB 控制器
XHCI 控制器支持
QEMU 具有 XHCI 主機(jī)適配器支持。與EHCI和UHCI相比,XHCI硬件設(shè)計(jì)對(duì)虛擬化更加友好,因此XHCI仿真使用的資源更少(尤其是CPU)。因此,如果您的來(lái)賓支持 XHCI(對(duì)于 2010 年左右或之后發(fā)布的任何操作系統(tǒng),情況應(yīng)該如此),我們建議您使用它:
qemu-device qemu-xhci
XHCI支持USB 1.1,USB 2.0和USB 3.0設(shè)備,因此這是您唯一需要的控制器。由于系統(tǒng)中只有一個(gè) USB 控制器(因此只有一個(gè) USB 總線),因此在添加 USB 設(shè)備時(shí)無(wú)需使用 bus= 參數(shù)。
超寬帶控制器支持
QEMU EHCI 適配器支持 USB 2.0 設(shè)備。它可以單獨(dú)使用,也可以與USB 1.1設(shè)備的配套控制器(UHCI,OHCI)一起使用。配套控制器設(shè)置使用起來(lái)更方便,因?yàn)樗峁┝艘粋€(gè)支持 USB 2.0 和 USB 1.1 設(shè)備的 USB 總線。有關(guān)詳細(xì)信息,請(qǐng)參閱下一節(jié)。
在獨(dú)立模式下運(yùn)行 EHCI 時(shí),您也可以為 USB 1.1 設(shè)備添加 UHCI 或 OHCI 控制器。但是,每個(gè)控制器都會(huì)創(chuàng)建自己的總線,因此有兩個(gè)完全獨(dú)立的USB總線:一個(gè)由UHCI控制器驅(qū)動(dòng)的USB 1.1總線和一個(gè)由EHCI控制器驅(qū)動(dòng)的USB 2.0總線。設(shè)備必須手動(dòng)連接到正確的控制器。
將 UHCI 控制器添加到機(jī)器的最簡(jiǎn)單方法是交換機(jī)。QEMU將創(chuàng)建UHCI控制器作為PIIX3芯片組的功能。USB 1.1總線將帶有名稱。pc
-usb
usb-bus.0
可以使用標(biāo)準(zhǔn)交換機(jī)將 EHCI 控制器添加到虛擬機(jī)。強(qiáng)烈建議為控制器指定一個(gè) ID,以便 USB 2.0 總線獲得一個(gè)單獨(dú)的名稱,例如 。這將為您提供一個(gè)名為 的USB 2.0總線。-device
-device?usb-ehci,id=ehci
ehci.0
使用交換機(jī)添加 USB 設(shè)備時(shí),可以指定它們應(yīng)連接到的總線。下面是一個(gè)完整的示例:-device
qemu-system-x86_64 -M pc ${otheroptions} ? ? ? ? ? ? ? ? ? ? ? ?\ ? ?-drive if=none,id=usbstick,format=raw,file=/path/to/image ? \ ? ?-usb ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ ? ?-device usb-ehci,id=ehci ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ ? ?-device usb-tablet,bus=usb-bus.0 ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ ? ?-device usb-storage,bus=ehci.0,drive=usbstick
這會(huì)將 USB 平板電腦連接到 UHCI 適配器,將 USB 大容量存儲(chǔ)設(shè)備連接到 EHCI 適配器。
配套控制器支持
UHCI 和 OHCI 控制器可以連接到由 EHCI 創(chuàng)建的 USB 總線作為配套控制器。這是通過(guò)指定 和 屬性來(lái)完成的。 指定控制器應(yīng)附加到的總線名稱。 指定控制器應(yīng)連接到的第一個(gè)端口,這是必需的,因?yàn)橥ǔR粋€(gè)具有六個(gè)端口的 EHCI 控制器具有三個(gè) UHCI 配套控制器,每個(gè)控制器有兩個(gè)端口。masterbus
firstport
masterbus
firstport
文檔中有一個(gè)配置文件,它將為您完成所有這些操作,您可以像這樣使用它:
qemu-system-x86_64 -readconfig docs/config/ich9-ehci-uhci.cfg
然后用于將 USB 設(shè)備分配到該總線。bus=ehci.0
將開關(guān)用于計(jì)算機(jī)將創(chuàng)建類似的 USB 控制器配置。-usb
q35
連接 USB 設(shè)備
USB 設(shè)備可以使用命令行選項(xiàng)或監(jiān)視命令進(jìn)行連接??捎迷O(shè)備包括:-device?usb-...
device_add
usb-mouse
虛擬鼠標(biāo)。激活后,這將覆蓋 PS/2 鼠標(biāo)仿真。
usb-tablet
使用絕對(duì)坐標(biāo)的指針設(shè)備(如觸摸屏)。這意味著QEMU能夠報(bào)告鼠標(biāo)位置,而無(wú)需抓住鼠標(biāo)。激活時(shí)還會(huì)覆蓋 PS/2 鼠標(biāo)仿真。
usb-storage,drive=drive_id
由drive_id支持的大容量存儲(chǔ)設(shè)備(請(qǐng)參閱《系統(tǒng)仿真用戶指南》中的“磁盤映像”一章)。這是99%的USB記憶棒使用的經(jīng)典僅批量傳輸協(xié)議。此示例顯示它連接到 XHCI USB 控制器,并具有由原始格式磁盤映像支持的驅(qū)動(dòng)器:
qemu-system-x86_64 [...] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ -drive if=none,id=stick,format=raw,file=/path/to/file.img \ -device nec-usb-xhci,id=xhci ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ -device usb-storage,bus=xhci.0,drive=stick
usb-uas
USB 連接的 SCSI 設(shè)備。這不會(huì)創(chuàng)建 SCSI 磁盤,因此您需要在命令行上顯式創(chuàng)建 or 設(shè)備,并使用該選項(xiàng)指定這些磁盤由哪些磁盤支持。一個(gè)設(shè)備可以處理多個(gè)邏輯單元(磁盤)。此示例創(chuàng)建三個(gè)邏輯單元:兩個(gè)磁盤和一個(gè) CDROM 驅(qū)動(dòng)器:
scsi-hd
scsi-cd
-drive
usb-uas
qemu-system-x86_64 [...] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ -drive if=none,id=uas-disk1,format=raw,file=/path/to/file1.img ?\ -drive if=none,id=uas-disk2,format=raw,file=/path/to/file2.img ?\ -drive if=none,id=uas-cdrom,media=cdrom,format=raw,file=/path/to/image.iso \ -device nec-usb-xhci,id=xhci ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ -device usb-uas,id=uas,bus=xhci.0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ -device scsi-hd,bus=uas.0,scsi-id=0,lun=0,drive=uas-disk1 ? ? ? \ -device scsi-hd,bus=uas.0,scsi-id=0,lun=1,drive=uas-disk2 ? ? ? \ -device scsi-cd,bus=uas.0,scsi-id=0,lun=5,drive=uas-cdrom
usb-bot
僅批量傳輸存儲(chǔ)設(shè)備。這為來(lái)賓提供了與 相同的 USB 僅批量傳輸協(xié)議接口,但 QEMU 命令行選項(xiàng)的工作方式與 類似,不會(huì)自動(dòng)為您創(chuàng)建 SCSI 磁盤。 最多支持 16 個(gè) LUN。與 不同,LUN 編號(hào)必須是連續(xù)的,即對(duì)于三個(gè)設(shè)備,必須使用 0+1+2。上面示例中的 0+1+5 編號(hào)不適用于 。
usb-storage
usb-uas
usb-bot
usb-uas
usb-uas
usb-bot
usb-mtp,rootdir=dir
媒體傳輸協(xié)議設(shè)備,使用 dir 作為呈現(xiàn)給來(lái)賓的文件樹的根。
usb-host,hostbus=bus,hostaddr=addr
通過(guò)總線和加法器標(biāo)識(shí)的主機(jī)設(shè)備
usb-host,vendorid=vendor,productid=product
通過(guò)由供應(yīng)商和產(chǎn)品 ID 標(biāo)識(shí)的主機(jī)設(shè)備
usb-wacom-tablet
虛擬 Wacom 數(shù)位筆合作伙伴平板電腦。該設(shè)備與上述設(shè)備類似,但它可以與tslib庫(kù)一起使用,因?yàn)槌擞|摸坐標(biāo)之外,它還報(bào)告觸摸壓力。
tablet
usb-kbd
標(biāo)準(zhǔn) USB 鍵盤。將覆蓋 PS/2 鍵盤(如果存在)。
usb-serial,chardev=id
串行轉(zhuǎn)換器。這模擬連接到主機(jī)字符設(shè)備ID的FTDI FT232BM芯片。
usb-braille,chardev=id
盲文設(shè)備。這將使用 BrlAPI 在 id 引用的真實(shí)或假設(shè)備上顯示盲文輸出。
usb-net[,netdev=id]
支持 CDC 以太網(wǎng)和 RNDIS 協(xié)議的網(wǎng)絡(luò)適配器。id 指定用 定義的 netdev。例如,用戶模式網(wǎng)絡(luò)可以與
-netdev?…,id=id
qemu-system-x86_64 [...] -netdev user,id=net0 -device usb-net,netdev=net0
usb-ccid
智能卡讀卡器設(shè)備
usb-audio
USB 音頻設(shè)備
u2f-{emulated,passthru}
通用第二因素設(shè)備
canokey
實(shí)現(xiàn)FIDO2,OpenPGP,PIV等的開源安全密鑰。有關(guān)詳細(xì)信息,請(qǐng)參閱?CanoKey QEMU。
物理端口尋址
對(duì)于上述所有 USB 設(shè)備,默認(rèn)情況下,QEMU 會(huì)將設(shè)備插入指定 USB 總線上的下一個(gè)可用端口,如果未顯式指定,則插入到某些可用的 USB 總線上。如果需要,還可以指定設(shè)備在來(lái)賓中顯示的物理端口。這可以使用該屬性完成。UHCI 有兩個(gè)根端口 (1,2)。EHCI 有六個(gè)根端口 (1-6),模擬 (1.1) USB 集線器有八個(gè)端口。port
將平板電腦插入 UHCI 端口 1 的工作原理如下:
-device usb-tablet,bus=usb-bus.0,port=1
將集線器插入 UHCI 端口 2 的工作原理如下:
-device usb-hub,bus=usb-bus.0,port=2
將虛擬 U 盤插入剛剛插入的集線器的端口 4,按如下方式工作:
-device usb-storage,bus=usb-bus.0,port=2.4,drive=...
在監(jiān)視器中,屬性規(guī)范。如果您也想拔下設(shè)備,則應(yīng)指定一些可用于引用設(shè)備的唯一ID。然后,您可以使用 稍后拔下設(shè)備。例如:device_add`?command?also?accepts?a?``port
device_del
(qemu) device_add usb-tablet,bus=usb-bus.0,port=1,id=my-tablet(qemu) device_del my-tablet
熱插拔 USB 存儲(chǔ)
和 設(shè)備可以熱插拔。在熱插拔的情況下,它們被添加,因此在屬性顯式設(shè)置為 true 之前,來(lái)賓將看不到設(shè)備。這允許您在使設(shè)備對(duì)客戶機(jī)可見之前連接一個(gè)或多個(gè) scsi 設(shè)備。工作流如下所示:usb-bot
usb-uas
attached?=?false
attached
device-add?usb-bot,id=foo
device-add?scsi-{hd,cd},bus=foo.0,lun=0
(可選)添加更多設(shè)備(lun 1 ...35 千米賽
scripts/qmp/qom-set?foo.attached?=?true
在 Linux 主機(jī)上使用主機(jī) USB 設(shè)備
警告:這是一項(xiàng)實(shí)驗(yàn)性功能。QEMU在使用它時(shí)會(huì)變慢。尚不支持需要實(shí)時(shí)流式傳輸?shù)?USB 設(shè)備(即 USB 攝像機(jī))。
如果使用早期的 Linux 2.4 內(nèi)核,請(qǐng)驗(yàn)證沒有 Linux 驅(qū)動(dòng)程序?qū)嶋H使用 USB 設(shè)備。一個(gè)簡(jiǎn)單的方法是通過(guò)將相應(yīng)的內(nèi)核模塊從 重命名為 來(lái)禁用它。
mydriver.o
mydriver.o.disabled
驗(yàn)證它是否正常工作(默認(rèn)情況下,大多數(shù) Linux 發(fā)行版應(yīng)啟用它)。您應(yīng)該看到類似下面的內(nèi)容:
/proc/bus/usb
ls /proc/bus/usb001 ?devices ?drivers
由于只有 root 可以直接訪問 USB 設(shè)備,因此您可以以 root 身份啟動(dòng) QEMU,也可以更改要使用的 USB 設(shè)備的權(quán)限。對(duì)于測(cè)試,以下就足夠了:
chown -R myuid /proc/bus/usb
啟動(dòng) QEMU 并在監(jiān)視器中執(zhí)行:
info usbhost ?Device 1.2, speed 480 Mb/s ? ?Class 00: USB device 1234:5678, USB DISK
你應(yīng)該會(huì)看到可以使用的設(shè)備列表(切勿嘗試使用集線器,這將不起作用)。
使用以下方法在 QEMU 中添加設(shè)備:
device_add usb-host,vendorid=0x1234,productid=0x5678
通常,來(lái)賓操作系統(tǒng)應(yīng)報(bào)告插入了新的 USB 設(shè)備。您可以使用該選項(xiàng)執(zhí)行相同的操作。
-device?usb-host,...
現(xiàn)在,您可以嘗試在 QEMU 中使用主機(jī) USB 設(shè)備。
重新啟動(dòng) QEMU 時(shí),您可能需要拔下并再次插入 USB 設(shè)備才能使其再次工作(這是一個(gè)錯(cuò)誤)。
usb-host
用于指定主機(jī)設(shè)備的屬性
上面的示例使用 和 來(lái)指定要傳遞的主機(jī)設(shè)備,但這不是指定主機(jī)設(shè)備的唯一方法。 支持以下屬性:vendorid
productid
usb-host
hostbus=<nr>
指定設(shè)備必須連接到的總線編號(hào)
hostaddr=<nr>
指定來(lái)賓操作系統(tǒng)為設(shè)備分配的設(shè)備地址
hostport=<str>
指定設(shè)備連接到的物理端口
vendorid=<hexnr>
指定設(shè)備的供應(yīng)商 ID
productid=<hexnr>
指定設(shè)備的產(chǎn)品 ID。
從理論上講,您可以根據(jù)需要組合所有這些屬性。在實(shí)踐中,只有少數(shù)組合是有用的:
vendorid
和 – 匹配特定設(shè)備,當(dāng)它出現(xiàn)在主機(jī)中的某個(gè)位置時(shí),將其傳遞給來(lái)賓。productid
hostbus
和 – 匹配主機(jī)中的特定物理端口,插入其中的任何設(shè)備都會(huì)傳遞給來(lái)賓。hostport
hostbus
和 – 對(duì)于臨時(shí)傳遞最有用,因?yàn)?hostaddr 不穩(wěn)定。下次將設(shè)備插入主機(jī)時(shí),它將獲得一個(gè)新的hostaddr。hostaddr
請(qǐng)注意,在主機(jī)上,USB 1.1 設(shè)備由 UHCI/OHCI 處理,USB 2.0 由 EHCI 處理。這意味著插入主機(jī)上相同物理端口的不同 USB 設(shè)備可能會(huì)顯示在不同的主機(jī)總線上,具體取決于速度。假設(shè)插入給定物理端口的設(shè)備在 2.0 設(shè)備上顯示為總線 1 + 端口 1,對(duì)于 1.1 設(shè)備顯示為總線 3 + 端口 1,則可以通過(guò)插入該端口的任何設(shè)備,并將其分配給 QEMU 中的正確 USB 總線,如下所示:
qemu-system-x86_64 -M pc [...] ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ ? ??
-usb ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ ? ??
-device usb-ehci,id=ehci ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ ? ??
-device usb-host,bus=usb-bus.0,hostbus=3,hostport=1 ?\ ? ??
-device usb-host,bus=ehci.0,hostbus=1,hostport=1