Le lien du tuto avant tout :
https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA-Gaming-using-Ubuntu-14-04-KVM-585/
Comme tous les tutos, ça parait simple ! Cependant pour améliorer mes connaissances, je me suis lancé ce défi de réussir ce tuto soit la création d'une vm avec CG passthrough.
J'ai eu des soucis pour l'isolement de la carte graphique mais en lisant les autres posts de la communauté, j'ai pu m'en sortir et réussir à blacklister mon driver ( ben oui, c clair , même ça j'ai eu un peu de mal. mais j'obtiens bien :
internet@internet-All-Series:~$ dmesg | grep pci-stub
[ 2.253893] pci-stub: add 1002:6898 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 2.253901] pci-stub 0000:06:00.0: claimed by stub
[ 2.253904] pci-stub: add 1002:AA50 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 2.253917] pci-stub 0000:06:00.1: claimed by stub
internet@internet-All-Series:~$
Souhaitant réaliser la vm avec la RADEON hd5870, je me dis que je suis donc sur le bon chemin.
Je fais un lspci pour vous montrer le matériel, je fais au plus court pour le post ne soit pas trop long.
internet@internet-All-Series:~$ lspci -nn | grep VGA
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF110 [GeForce GTX 580] [10de:1080] (rev a1)
06:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cypress XT [Radeon HD 5870] [1002:6898]
Je vous indique ce que j'ai fait suivant le tuto de puget, ce qui donne
step1. "Ubuntu modules and bootloader"
internet@internet-All-Series:~$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel
internet@internet-All-Series:~$ /etc/modules
Puis la modif du grub :
internet@internet-All-Series:~$ cat /etc/default/grub | grep GRUB_
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"
GRUB_CMDLINE_LINUX=""
Step 2. Blacklist de la CG
(je l'ai montré plus haut avec le dmesg | grep pci-stub)
J'ai fait la modif de /etc/initramfs-tools/modules comme demandé ce qui donne :
internet@internet-All-Series:~$ cat /etc/initramfs-tools/modules | grep pci_
pci_stub ids=1002:6898,1002:aa50
Step3. la creation du fichier vfio.cfg //
J'ai donc ce fichier là :
internet@internet-All-Series:~$ cat /etc/vfio-pci1.cfg
0000:06:00.0
0000:06:00.1
internet@internet-All-Series:~$
Step4. Creation du disk image.
internet@internet-All-Series:~$ dd if=/dev/zero of=/home/internet/puget/windows.img bs=1M seek=100000 count=0
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000150446 s, 0,0 kB/s
internet@internet-All-Series:~$
Je ne vois pas d'erreur mais bon.
Step5. creation du script de lancement de la machine virtuelle.
internet@internet-All-Series:/usr$ cat windows
#!/bin/bash
configfile=/etc/vfio-pci1.cfg
vfiobind() {
dev="$1"
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
}
modprobe vfio-pci
cat $configfile | while read line;do
echo $line | grep ^# >/dev/null 2>&1 && continue
vfiobind $line
done
sudo qemu-system-x86_64 -enable-kvm -M q35 -m 4096 -cpu host \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin -vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=06:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=06:00.1,bus=root.1,addr=00.1 \
-drive file=/home/puget/windows.img,id=disk,format=raw -device ide-hd,bus=ide.0,drive=disk \
-drive file=/home/Téléchargements/iso/windows64.iso,id=isocd -device ide-cd,bus=ide.1,drive=isocd \
-boot menu=on
exit 0
internet@internet-All-Series:/usr$
Alors voilà maintenant les erreurs générées ; j'ai fait 2 lancement de scripts un normal et l'autre en sudo
internet@internet-All-Series:/usr$ ./windows
./windows: ligne 12: /sys/bus/pci/drivers/vfio-pci/new_id: Permission non accordée
./windows: ligne 12: /sys/bus/pci/drivers/vfio-pci/new_id: Permission non accordée
cat: /sys/bus/pci/devices//vendor: Aucun fichier ou dossier de ce type
cat: /sys/bus/pci/devices//device: Aucun fichier ou dossier de ce type
./windows: ligne 12: /sys/bus/pci/drivers/vfio-pci/new_id: Permission non accordée
qemu-system-x86_64: -drive file=/home/puget/windows.img,id=disk,format=raw: Could not open '/home/puget/windows.img': No such file or directory
internet@internet-All-Series:/usr$ sudo ./windows
cat: /sys/bus/pci/devices//vendor: Aucun fichier ou dossier de ce type
cat: /sys/bus/pci/devices//device: Aucun fichier ou dossier de ce type
./windows: ligne 12 : echo: erreur d'écriture : Argument invalide
qemu-system-x86_64: -drive file=/home/puget/windows.img,id=disk,format=raw: Could not open '/home/puget/windows.img': No such file or directory
internet@internet-All-Series:/usr$
Voilà, j'ai modifié ce1er post comme me l'avait indiqué le modérateur pour y mettre du BBcode. En espérant y être correctement parvenu.
Si vous voyez des erreurs évidentes que je ne verrais pas , je serais heureux que la comunauté me guide :-)
Merci, à la communauté !
éphi.
Modération : merci à l'avenir d'utiliser les balises code (explications ici).