Puissance Athlon XP | Ce topic m'ayant bien aidé dans ma config, à mon tour de partager  Le résultat : - Hôte ubuntu 14.04, avec le kernel 3.15.0-rc7 non patché, qemu-kvm installé depuis apt - VM Windows 7 avec une Radeon 7850 en primary passthrough - VM FreeNAS avec le controller SAS en passthrough - Pas de config bizarre dans Grub, juste l'activation de l'iommu - Le tout géré depuis virt-manager La config hardware : - Supermicro X10SL7-F (+chipset graphique Aspeed AST2400 + LSI SAS 2308) - Xeon 1230v3 - Radeon 7850 Sapphire - La première étape est d'installer le kernel 3.15.0-rc2 prépackagé pour trusty, afin de pouvoir en récuperer la config comme point de départ.
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.15-rc2-trusty/linux-headers-3.15.0-031500rc2_3.15.0-031500rc2.201404201435_all.deb wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.15-rc2-trusty/linux-headers-3.15.0-031500rc2-generic_3.15.0-031500rc2.201404201435_amd64.deb wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.15-rc2-trusty/linux-image-3.15.0-031500rc2-generic_3.15.0-031500rc2.201404201435_amd64.deb sudo dpkg -i linux-image-3.15.0-031500rc2-generic_3.15.0-031500rc2.201404201435_amd64.deb sudo dpkg -i linux-headers-3.15.0-031500rc2_3.15.0-031500rc2.201404201435_all.deb sudo dpkg -i linux-headers-3.15.0-031500rc2-generic_3.15.0-031500rc2.201404201435_amd64.deb sudo reboot
| - On télécharge ensuite le dernier kernel
wget https://www.kernel.org/pub/linux/kernel/v3.x/testing/linux-3.15-rc7.tar.gz dest=/home/adrien/linux-3.15-rc7.tar.gz tar -xzvf linux-3.15-rc7.tar.gz
| - On copie la config du kernel rc2 et on la met à jour avec les nouveaux flags du rc7 (en sélectionnant les valeurs par défaut)
cp /boot/config-3.15.0-031500rc2-generic linux-3.15-rc7/.config cd linux-3.15-rc7 yes '' | make oldconfig cd .. | - On édite ensuite le fichier .config avec les valeurs suivantes
CONFIG_VIRTUALIZATION=y CONFIG_KVM=y CONFIG_KVM_INTEL=y # CONFIG_KVM_AMD is not set CONFIG_PCI_STUB=y CONFIG_VFIO_IOMMU_TYPE1=y CONFIG_VFIO=y CONFIG_VFIO_PCI=y CONFIG_VFIO_PCI_VGA=y CONFIG_VHOST_NET=m CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y CONFIG_PREEMPT=y CONFIG_HZ_1000=y # CONFIG_HZ_250 is not set CONFIG_HZ=1000 | - Pour la compilation, il y a un bug dans kernel-package qui oblige à la lancer en root (voir ici). Un deb fixé est disponible, on va donc l'installer :
wget https://launchpad.net/ubuntu/+source/kernel-package/13.003/+build/5980712/+files/kernel-package_13.003_all.deb sudo dpkg -i kernel-package_13.003_all.deb | - C'est parti pour la compilation du kernel
cd linux-3.15.0-rc7 yes '' | make oldconfig CONCURRENCY_LEVEL=9 fakeroot make-kpkg --initrd --append-to-version=-passthrough.1 kernel-image kernel-headers cd .. dpkg -i linux-image-3.15.0-rc7-passthrough.1_3.15.0-rc7-passthrough.1-10.00.Custom_amd64.deb dpkg -i linux-headers-3.15.0-rc7-passthrough.1_3.15.0-rc7-passthrough.1-10.00.Custom_amd64.deb | - À ce moment là, au boot, le nouveau kernel est en deuxième position (car le kernel rc2 a une version 031500rc2 qui passe devant dans l'ordre alphabetique). Il faut donc modifier la config de grub. On en profite pour activer l'iommu. Dans /etc/default/grub :
sudo nano /etc/default/grub # GRUB_CMDLINE_LINUX="iommu=1 intel_iommu=on nomodeset" # GRUB_DEFAULT="1>2" sudo update-grub
| - Avant de redémarrer, on installe lsgroup, vfio-bind, et le service qui va bien pour le lancer au démarrage
- /usr/bin/lsgroup
#!/bin/sh BASE="/sys/kernel/iommu_groups" for i in $(find $BASE -maxdepth 1 -mindepth 1 -type d); do GROUP=$(basename $i) echo "### Group $GROUP ###" for j in $(find $i/devices -type l); do DEV=$(basename $j) echo -n " " lspci -s $DEV done done
|
- /usr/bin/vfio-bind
#!/bin/bash modprobe vfio-pci for dev in "$@"; do vendor=$(cat /sys/bus/pci/devices/$dev/vendor) device=$(cat /sys/bus/pci/devices/$dev/device) if [ -e /sys/bus/pci/devices/$dev/driver ]; then echo $dev > /sys/bus/pci/devices/$dev/driver/unbind fi echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id done
|
- /etc/init/vfio-bind.conf
description "bind your devices to vfio on startup" version "1.0" start on starting libvirt-bin stop on stopped libvirt-bin script # source the config file . /etc/vfio-bind.cfg /usr/bin/vfio-bind $DEVICES end script
| - /etc/vfio-bind.cfg DEVICES="0000:07:00.0 0000:07:00.1 0000:02:00.0"
| - Ne pas oublier de setter les permissions
sudo chmod 0755 /usr/bin/lsgroup sudo chmod 0755 /usr/bin/vfio-bind sudo chmod 0644 /etc/init/vfio-bind.conf sudo chmod 0644 /etc/vfio-bind.conf sudo chown root:root /usr/bin/lsgroup sudo chown root:root /usr/bin/vfio-bind sudo chown root:root /etc/init/vfio-bind.conf sudo chown root:root /etc/vfio-bind.conf
| - On blackliste le module radeon (pas testé sans, ça ne mange pas de pain), et on installe virt-manager et kvm
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf sudo apt-get install virt-manager qemu-kvm | - Afin de pouvoir utiliser libvirt avec des périphériques passés en vfio, la premiere étape est de désactiver apparmor
ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ ln -s /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper /etc/apparmor.d/disable/ apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd apparmor_parser -R /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper | - Il faut ensuite donner plus de permissions à libvirt (lancement en root + accès à /dev/vfio/votre_groupe). Dans /etc/libvirt/qemu.conf :
user = root group = root clear_emulator_capabilities = 0 # Suppression des commentaires de cgroup_acl + ajout des devices correspondant à vos groupes vfio (faire lsgroup pour avoir le chiffre) "/dev/vfio/13", "/dev/vfio/1"
| - À ce moment là, après un reboot, vous devriez pouvoir importer (par virsh define mon_fichier.xml) la VM dotée du XML suivant. (Je n'ai pas parlé de la config réseau et des histoires de drivers vfio)
<domain type='kvm' id='8' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name>HTPC</name> <uuid>dda812ca-3de2-adac-a6c3-0914760ca54a</uuid> <memory unit='KiB'>4194304</memory> <currentMemory unit='KiB'>4194304</currentMemory> <vcpu placement='static'>2</vcpu> <resource> <partition>/machine</partition> </resource> <os> <type arch='x86_64' machine='pc-q35-2.0'>hvm</type> <loader>/usr/share/qemu/bios.bin</loader> <boot dev='cdrom'/> <boot dev='hd'/> <bootmenu enable='yes'/> </os> <features> <acpi/> <apic/> </features> <cpu mode='custom' match='exact'> <model fallback='allow'>Haswell</model> <vendor>Intel</vendor> <feature policy='require' name='tm2'/> <feature policy='require' name='est'/> <feature policy='require' name='vmx'/> <feature policy='require' name='osxsave'/> <feature policy='require' name='smx'/> <feature policy='require' name='ss'/> <feature policy='require' name='ds'/> <feature policy='require' name='vme'/> <feature policy='require' name='dtes64'/> <feature policy='require' name='abm'/> <feature policy='require' name='ht'/> <feature policy='require' name='acpi'/> <feature policy='require' name='pbe'/> <feature policy='require' name='tm'/> <feature policy='require' name='pdcm'/> <feature policy='require' name='pdpe1gb'/> <feature policy='require' name='ds_cpl'/> <feature policy='require' name='rdrand'/> <feature policy='require' name='f16c'/> <feature policy='require' name='xtpr'/> <feature policy='require' name='monitor'/> </cpu> <clock offset='localtime'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='vmdk'/> <source file='/var/lib/libvirt/images/HTPC.vmdk'/> <target dev='vdb' bus='virtio'/> <alias name='virtio-disk1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x06' function='0x0'/> </disk> <controller type='usb' index='0'> <alias name='usb0'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x02' function='0x0'/> </controller> <controller type='pci' index='0' model='pcie-root'> <alias name='pcie.0'/> </controller> <controller type='pci' index='1' model='dmi-to-pci-bridge'> <alias name='pci.1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/> </controller> <controller type='pci' index='2' model='pci-bridge'> <alias name='pci.2'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x01' function='0x0'/> </controller> <controller type='sata' index='0'> <alias name='sata0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/> </controller> <interface type='bridge'> <mac address='52:54:00:55:1d:18'/> <source bridge='br1'/> <target dev='vnet0'/> <model type='virtio'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/> </interface> <memballoon model='virtio'> <alias name='balloon0'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x03' function='0x0'/> </memballoon> </devices> <seclabel type='none'/> <qemu:commandline> <qemu:arg value='-display'/> <qemu:arg value='none'/> <qemu:arg value='-device'/> <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/> <qemu:arg value='-device'/> <qemu:arg value='vfio-pci,host=07:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on'/> <qemu:arg value='-device'/> <qemu:arg value='vfio-pci,host=07:00.1,bus=root.1,addr=00.1'/> </qemu:commandline> </domain> | J'espère que ça pourra aider certains d'entre vous. Avec cette méthode j'ai ma VM Windows qui tourne avec un passthrough de la CG + mon clavier passé en USB. Je n'arrive pas à passer en USB ma carte son, mais ça ira pour l'instant À noter qu'il n'est pas possible de passer deux devices appartenant au même groupe à deux VMs différentes, ce qui m'a empêché de passer ma carte USB (elle est dans le même groupe que mon controller SAS, dont j'ai besoin pour ma VM Nas) Et donc également une VM FreeNAS avec le controller SAS en passthrough, fonctionne également sans problème Voilà, n'hésitez pas si vous avez des questions Message édité par Puissance Athlon XP le 30-05-2014 à 18:08:37
|