lundi 17 octobre 2011
Xen - Intel VT-d sur Core 5 2400 / VGA PassThrough sur Carte NVIDIA EVGA GTX 460 SE 1024
Par david techer, lundi 17 octobre 2011 à 23:16 :: Xen


Carte EVGA GTX 460 SE PCI EXPRESS 2.0 GDDR5 auquel on souhaite accéder nativement depuis une machine virtuelle sous Windows XP 32/64 bits.
Kernel 3.1.0-rc9
Profitant du support de Xen en tant que dom0 depuis la version 3.0 du kernel, j'ai donc effectué mes tests sur cette version. Voici mon fichier de configurationPour rappel, à  partir du noyau 3.1, la gestion pour VGA PassThrough est grandement simplifié.
Concernant le support pour Intel vt-d, on aura les informations suivantesroot@mercury:~# xl dmesg | grep -E '(Intel|virtualisation )' (XEN) Intel machine check reporting enabled (XEN) Intel VT-d Snoop Control not enabled. (XEN) Intel VT-d Dom0 DMA Passthrough not enabled. (XEN) Intel VT-d Queued Invalidation enabled. (XEN) Intel VT-d Interrupt Remapping enabled. (XEN) Intel VT-d Shared EPT tables not enabled. (XEN) I/O virtualisation enabledRappel: il faut que
- le processeur supporte Vt-d
- que le support soit activé dans le BIOS.
Nvflash: Extraction VGA BIOS
On pourrait utilisernvlfash
installé sur une clé USB et booter dessus. Cependant il existe une autre méthode. On procède à  l'extraction depuis un domU sous Windows XP avec la carte graphique rattachée au domU MAIS avec
gfx_passthru=0
. Ainsi la carte graphique apparaà ®t en tant que carte graphique secondaire. Dans mon fichier de configuration, '01:00.0'
correspond à  ma carte graphique NVIDIA.
builder='hvm' memory = 3072 shadow_memory = 1024 name = "mercury-xen03" vcpus='4' vif = [ 'bridge=eth0,mac=00:14:3e:00:8f:c2' ] disk = [ 'phy:/dev/xenvg/mercury-xen03-disk-6,xvda,w', 'file:/opt/Xen/CD_DVD/WindowsDeveloperPreview-64bit-English.iso,xvdc:cdrom,r', ] boot="cd" sdl=0 vnc=1 vnclisten="0.0.0.0" vncconsole=1 vncpasswd='' acpi=1 apic=1 xen_extended_power_mgmt=1 pae=1 arch='x86_64' hpet = 1 hap = 1 viridian = 1 monitor=1 serial='pty' keymap='fr' soundhw = "all" audio="on" ne2000=0 on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'restart' xen_platform_pci=1 gfx_passthru=0 pci = [ '01:00.0','00:1a.0','00:1d.0' ] pci_msitranslate = 1 pci_power_mgmt = 1
- On installe
nvlfash 5.100.0.1
sur le domU - On ouvre ensuite une fenêtre DOS et on tape nvlfash --save vgabios-pt.rom

Remarque: il faudra bien sà »r penser à  récupérer le fichier vgabios-pt.rom
Compilation
hg clone -r 23965 http://xenbits.xensource.com/hg/staging/xen-unstable.hg/ xen-test cd xen-test/tools make -j4 make clean cd ..On télécharge les patchs et on patche
root@mercury:/opt/tmp/xen-test# wget -q http://www.davidgis.fr/download/gfx_patchs_gtx-460-se-evga.tar.bz2 root@mercury:/opt/tmp/xen-test# tar xjf gfx_patchs_gtx-460-se-evga.tar.bz2 root@mercury:/opt/tmp/xen-test# for file in $(ls gfx_patchs_gtx-460-se-evga/*.patch);do patch -p1 < $file;done patching file tools/firmware/hvmloader/acpi/dsdt.asl patching file tools/firmware/hvmloader/hvmloader.c patching file tools/firmware/hvmloader/Makefile patching file tools/ioemu-remote/hw/pass-through.c patching file tools/firmware/hvmloader/pci.c
On copie le fichier vgabios-pt.rom
(voir section "Extraction VGA BIOS") Ã Â l'endroit requis en n'oubliant pas de le renommer en vgabios-pt.bin
cp /path/to/vgabios-pt.rom tools/firmware/vgabios/vgabios-pt.binOn compile et on installe
make -j4 xen tools stubdom make -j4 install-xen && make -j4 install-tools PYTHON_PREFIX_ARG= && make -j4 install-stubdom
démarrage du domU (PCI Stub)
- On récupère l'identifiant associé à  la carte graphique en utilisant
lspci
root@mercury:~# lspci |grep VGA 01:00.0 VGA compatible controller: nVidia Corporation Device 0e23 (rev a1)
- On récupère l'autre identifiant
root@mercury:~# lspci -n -s 01:00.0 01:00.0 0300: 10de:0e23 (rev a1)
- Il ne reste plus qu'Ã Â lancer le domU
root@mercury:~# echo "10de 0e23" > /sys/bus/pci/drivers/pci-stub/new_id root@mercury:~# echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind root@mercury:~# echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind root@mercury:~# xl create /etc/xen/machines/mercury-xen03.cfg