Je me débats pour connecter un périphérique USB, qui est détecté correctement par l'hôte, à un VM KVM.
J'ai un serveur Ubuntu fraîchement installé 14.10 en tant qu'hôte KVM/QEMU. J'ai configuré un Ubuntu VM en utilisant cette commande:
virt-install --connect qemu:///system \
-n test01 \
-r 1024 \
--vcpus=2 \
--disk path=/vmstorage/01/test01.img,size=5 \
--vnc \
--noautoconsole \
--os-variant=ubuntuutopic \
--hvm \
--cdrom /path/to/ubuntu-14.10-server-i386.iso
Après la réussite d'une installation a virsh dumpxml test01
Retour
<domain type='kvm' id='16'>
<name>test01</name>
<uuid>f58ca825-c999-4168-9f5a-616057d9955d</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>2</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type Arch='x86_64' machine='pc-i440fx-utopic'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu mode='custom' match='exact'>
<model fallback='allow'>SandyBridge</model>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/vmstorage/01/test01.img'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<disk type='block' device='cdrom'>
<driver name='qemu' type='raw'/>
<backingStore/>
<target dev='hda' bus='ide'/>
<readonly/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<alias name='usb0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<alias name='usb0'/>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<alias name='usb0'/>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<alias name='usb0'/>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:11:b2:c1'/>
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/0'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/0'>
<source path='/dev/pts/0'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='apparmor' relabel='yes'>
<label>libvirt-f58ca825-c999-4168-9f5a-616057d9955d</label>
<imagelabel>libvirt-f58ca825-c999-4168-9f5a-616057d9955d</imagelabel>
</seclabel>
</domain>
Je veux maintenant attacher un bâton USB. Après que j'ai ----- trouvécertainssources qui suggèrent essentiellement l'approche suivante:
obtenez Vendor- et ID de produit
root@Host01:~# lsusb
Bus 002 Device 004: ID 13fe:5100 Kingston Technology Company Inc. Flash Drive
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0624:0249 Avocent Corp.
Bus 001 Device 003: ID 0624:0248 Avocent Corp.
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ajouter une nouvelle extrait de configuration à VM via virsh edit test01
<devices>
<!- ... ->
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x13fe'/>
<product id='0x5100'/>
</source>
</hostdev>
</devices/>
redémarrez vm
Après cela, le VM devrait voir le bâton via lsusb
, mais rien ne change. Si j'essaie de fixer le périphérique à une seconde virte VM, cependant, virsh start <othervm>
échoue avec error: Requested operation is not valid: USB device 002:003 is in use by driver QEMU, domain test01
[~ # ~] mais [~ # ~] Je peux toujours monter et accéder au bâton sur l'hôte. J'ai essayé différents bâtons et différents systèmes d'exploitation VM (Ubuntu et Windows), aucun succès.
Certaines instructions suggèrent d'éteindre l'APPARMOR, mais un /etc/init.d/apparmor stop
n'a rien changé.
Cela me rend fou, car je ne reçois aucune erreur ou messages de journal et je n'ai aucune idée de savoir ce qui ne va pas. Des idées sur la manière d'obtenir la clé USB connectée au VM, ou du moins, comment analyser plus loin?
C'est probablement un problème de droits d'accès. Votre démon QEMU n'est pas autorisé à accéder aux périphériques USB. Essayer:
chown libvirt-qemu /dev/bus/usb/ -R
ou quel que soit l'utilisateur votre KVM fonctionne comme. Cela devrait faire le tour.
Pour accorder un accès permanent aux nœuds de périphérique USB bruts à l'utilisateur, l'hyperviseur est exécuté, vous devez créer une règle Udev; La réponse basée sur CHEWN ne fonctionnera que jusqu'à ce que le prochain redémarrage.
Dans /lib/udev/rules.d
, créer un fichier comme 51-usb_passthrough.rules
:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{busnum}=="2" ATTRS{devpath}=="1" GROUP="kvm"
Ici, j'ai utilisé des numéros de bus physique et de port pour cibler le périphérique (comme je préfère passer à travers le port physique, quel que soit le périphérique branché plutôt que de reconfigurer mon VM chaque fois que je connecte un nouveau périphérique) , mais bien sûr, vous pouvez utiliser les attributs que vous voulez; l'argument GROUP
détermine le groupe qui possédera le nœud de périphérique, cela devrait être tout ce que l'utilisateur exécute les machines virtuelles.
Courir udevadm control --reload-rules
Pour que la nouvelle règle soit effective immédiatement (vous devez toujours déconnecter/reconnecter les périphériques USB) ou simplement redémarrer l'hôte.
Solution facile: Connectez-vous avec
nc -U socket-file
pour votre moniteur QEMU, où le fichier de socket est le chemin d'accès à surveiller. Comment trouver: PS -FA | grep qemu. Vous y trouverez à la ligne de commande.
Et exécutez la commande sur le moniteur:
device_add usb-Host,id=<ANY string>,hostbus=<BUS>,hostport=<PORT>
ceci est transmis par numéro de port. Vous pouvez transmettre n'importe quel appareil avec n'importe quel Vid/PID. Vous pouvez également passer des périphériques particuliers à l'aide de
device_add usb-Host,id=<ANY string>,vendorid=0x0461,productid= 0x0010
et ils peuvent être branchés à n'importe quel port de votre hôte.
Commandes utiles aussi:
info usbhost
info usb