Udev
Recharger les règles (sans rebooter)
udevadm control --reload-rules
Règle d'attache automatique d'un device USB à une VM via libvirt
- Récupérer les ID Vendeur et Modèle de votre device USB :
lsub Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 011 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 010 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 009 Device 005: ID 08e6:3438 Gemplus GemPC Key SmartCard Reader Bus 009 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- Créer le fichier XML de déclaration du device dans /etc/libvirt/[VM]-[device].xml :
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x08e6'/> <product id='0x3438'/> </source> <alias name='gemplus-key-smartcard'/> </hostdev>
- A l'aide du script suivant, identifier le device USB correspondant :
VENDOR=08e6 MODEL=3438 for X in /sys/bus/usb/devices/*; do if [ "$VENDOR" == "$(cat "$X/idVendor" 2>/dev/null)" -a "$MODEL" == "$(cat "$X/idProduct" 2>/dev/null)" ] then echo "$X" fi done
- Afficher toutes les informations du device vue par UDEV :
udevadm info -q all -a --path=/sys/bus/usb/devices/9-1 looking at device '/devices/pci0000:00/0000:00:13.0/usb9/9-1': KERNEL=="9-1" SUBSYSTEM=="usb" DRIVER=="usb" [...] ATTR{idVendor}=="08e6" [...] ATTR{idProduct}=="3438" [...]
- Construire la règle équivalente UDEV correspondante dans le fichier /etc/udev/rules.d/90-libvirt-usb.rules :
# [VM] - [Device] ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="08e6", ATTR{idProduct}=="3438", RUN+="/usr/bin/virsh attach-device [VM] /etc/libvirt/[VM]-[Device].xml" ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="08e6", ENV{ID_MODEL_ID}=="3438", RUN+="/usr/bin/virsh detach-device [VM] /etc/libvirt/[VM]-[Device].xml"
- Recharger les règles UDEV :
udevadm control --reload-rules
- Tester l'ajout et la suppression du device :
# udevadm test --action='add' /sys/bus/usb/devices/9-1 run_command: calling: test adm_test: version 175 This program is for debugging only, it does not run any program, specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run. parse_file: reading '/lib/udev/rules.d/42-qemu-usb.rules' as rules file [...] parse_file: reading '/etc/udev/rules.d/90-libvirt-usb.rules' as rules file [...] ACTION=add [...] DRIVER=usb ID_BUS=usb [...] ID_MODEL_ID=3438 [...] ID_VENDOR=Gemplus ID_VENDOR_ENC=Gemplus ID_VENDOR_ID=08e6 [...] PRODUCT=8e6/3438/100 SUBSYSTEM=usb [...] run: '/usr/bin/virsh attach-device [VM] /etc/libvirt/[VM]-[Device].xml' # udevadm test --action='remove' /sys/bus/usb/devices/9-1 [...] run: '/usr/bin/virsh detach-device [VM] /etc/libvirt/[VM]-[Device].xml'
Si vous avez bien la ligne run:
dans les deux cas à la fin, c'est que c'est bon.