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

  • OS : Arch Linux
  • qemu : 5.1.0
  • VM : Windows 10 LTSC x64

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).

  • Obtenir le chemin du périphérique :
[user@host ~]$ lsusb | grep "Canon"
Bus 002 Device 002: ID 04a9:2228 Canon, Inc. CanoScan 4400F
  • Vérifier le propriétaire du périphérique :
[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.

  • Premièrement, nous allons récupérer les attributs du périphérique :
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.

  • Créer et éditer le fichier /etc/udev/rules.d/80-scanner.rules :
KERNEL=="2-10", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ATTR{idProduct}=="2228", OWNER="user", GROUP="user"
  • Recharger les règles udev :
root@host:~# udevadm control --reload
  • Et on vérifie les règles udev :
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

  • À adapter selon sa distribution, ici pour Arch Linux :
root@host:~# pacman -S qemu; modprobe virtio

Création du disque virtuel

  • Ici nous créons un disque de 20Go :
root@host:~# qemu-img create -f raw WIN_HDD01 20G

Augmentation de l'espace disque

  • Si besoin, nous pouvons augmenter la taille du disque, ici de 30Go supplémentaire :
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

  • Windows 10 ISO : /data/en_windows_10_enterprise_ltsc_2019_x64_dvd_74865958.iso
  • virtio drivers ISO : /tmp/virtio-win.iso
[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

  • Browse
  • viostor > w10 > amd64
  • Suivant

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

  • Obtenir le chemin du périphérique :
[user@host ~]$ lsusb | grep "Canon"
Bus 001 Device 003: ID 04a9:2228 Canon, Inc. CanoScan 4400F
  • Démarrer la machine virtuelle :
[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 :