Comment virtualiser Windows 10 avec un périphérique USB avec KVM

Intro

J'ai un scanner usb Canon CanoScan 4400F et je n'ai pas trouvé le moyen de le faire fonctionner depuis GNU/Linux. Donc je scanne a traver une VM Windows 10 via l'hyperviseur KVM.

Configuration

Droits sur le périphérique

Depuis mon système, le scanner est monté avec les droits root. Donc pour pouvoir l'utiliser avec la machine virtuelle KVM, nous devons changer les droits de root à simple utilisateur (puisque le KVM sera lancé avec les droits utilisateur).

[user@host ~]$ lsusb | grep "Canon"
Bus 002 Device 002: ID 04a9:2228 Canon, Inc. CanoScan 4400F
[user@host ~]$ ls -l /dev/bus/usb/002/002
crw-rw-r-- 1 root root 189, 129 31 oct.  09:20 /dev/bus/usb/002/002

Solution temporaire

La solution temporaire consiste à changer manuellement les droits avec la commande chown. Le problème est que nous devrons entrer la commande après chaque redémarrage.

root@host:~# chown user:user /dev/bus/usb/002/002

Solution permanente

Pour que la modification soit définitive nous allons créer une règle udev.

root@host:~# udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/bus/usb/002/002)
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb2/2-10':
    KERNEL=="2-10"
    SUBSYSTEM=="usb"
[...]
    ATTR{idProduct}=="2228"
    ATTR{idVendor}=="04a9"
[...]

Une fois les attributs récupérés nous allons pouvoir créer notre règle udev.

KERNEL=="2-10", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ATTR{idProduct}=="2228", OWNER="user", GROUP="user"
root@host:~# udevadm control --reload
root@host:~# udevadm test $(udevadm info --query=path --name=/dev/bus/usb/002/002) | less
[...]
Reading rules file: /etc/udev/rules.d/80-scanner.rules
[...]
[user@host ~]$ ls -l /dev/bus/usb/002/002
crw-rw-r-- 1 user user 189, 129 31 oct.  09:20 /dev/bus/usb/002/002

Configuration de l'hyperviseur KVM

Installation

root@host:~# pacman -S qemu; modprobe virtio

Création du disque virtuel

root@host:~# qemu-img create -f raw WIN_HDD01 20G

Augmentation de l'espace disque

root@host:~# qemu-img resize -f raw WIN_HDD01 +30G

Télécharger les drivers virtio

Ces pilotes permettent de voir le disque et d'obtenir de meilleurs performances.

Lien ici : Drivers

root@host:~# wget 'https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso'

Installer Windows

[user@host ~]$ qemu-system-x86_64 -smp 2 -net nic,model=e1000,macaddr=52:54:00:12:34:56 -net user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,hostfwd=tcp::5555-:3389 -cpu host -vga cirrus -m 4096 -cdrom /data/en_windows_10_enterprise_ltsc_2019_x64_dvd_74865958.iso -enable-kvm -boot order=d -drive file=/data/WIN_10_LTSB_HDD01,index=0,media=disk,if=virtio,format=raw -drive file=/tmp/virtio-win.iso,media=cdrom,index=3

Charger les drivers

Démarrer la VM avec le périphérique USB

[user@host ~]$ lsusb | grep "Canon"
Bus 001 Device 003: ID 04a9:2228 Canon, Inc. CanoScan 4400F
[user@host ~]$ qemu-system-x86_64 -smp 2 -net nic,model=e1000,macaddr=52:55:01:11:34:53 -net user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9 -cpu host -vga cirrus -m 4096 -enable-kvm -boot order=d -drive file=/vdisks/WIN_HDD01,index=0,media=disk,if=virtio,format=raw -device nec-usb-xhci -device usb-host,hostbus=1,hostaddr=3

Accès distant

Il sera plus facile d'utiliser notre machine virtuelle depuis un client RDP.

Démarrer notre VM avec la redirection RDP et l'USB

[user@host ~]$ qemu-system-x86_64 -smp 2 -net nic,model=e1000,macaddr=52:55:01:11:34:53 -net user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,hostfwd=tcp::5555-:3389 -cpu host -vga cirrus -m 4096 -enable-kvm -boot order=d -drive file=/vdisks/WIN_HDD01,index=0,media=disk,if=virtio,format=raw -device nec-usb-xhci -device usb-host,hostbus=1,hostaddr=3

Les commandes pour les clients RDP to the VM with a shared folder with xfreerdp or rdesktop

Ici deux exemples avec rdesktop et xfreerdp.

Les commandes activent la redirection de dossier, c'est-à-dire que le dossier /tmp/share sera visible depuis Windows :

[user@host ~]$ mkdir /tmp/share;rdesktop 127.1:5555 -r disk:docs=/tmp/share -0 -r sound:remote
[user@host ~]$ mkdir /tmp/share;xfreerdp /v:127.0.0.1:5555 /w:1900 /h:1024 /cert-ignore /drive:share,/tmp/share
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :