QEMU/KVM on ThinkPad X230T Laptop with Dual-boot: Difference between revisions

From WikiMLT
 
(9 intermediate revisions by the same user not shown)
Line 26: Line 26:
== Setup the Virtual Machine ==
== Setup the Virtual Machine ==
Within my current setup the virtual machine will use a physical SSD drive, where Windows 10 is previously installed and fully operational via the dual boot option and I want to keep this way of accessing Windows 10 too.
Within my current setup the virtual machine will use a physical SSD drive, where Windows 10 is previously installed and fully operational via the dual boot option and I want to keep this way of accessing Windows 10 too.
The first "special" thing according to my setup is that both operating systems are installed in UEFI mode, so the virtual machine should have UEFI firmware and with chipset Q35.


=== Identify the SSD ===
=== Identify the SSD ===
Line 32: Line 34:
''At first glance there is not any significant performance difference. However when you use the block device approach you can use the write cache option for the device, which will increase the speed of handling of the large files. On the other hand, when passing the SATA controller approach is in use, Windows 10 will use the same driver within the VM environment and within the native boot. In both cases the SSD shouldn't be mounted at the host's side.''
''At first glance there is not any significant performance difference. However when you use the block device approach you can use the write cache option for the device, which will increase the speed of handling of the large files. On the other hand, when passing the SATA controller approach is in use, Windows 10 will use the same driver within the VM environment and within the native boot. In both cases the SSD shouldn't be mounted at the host's side.''


The setup of the virtual machine is done via the <code>virt-manager</code> GUI. The first "special" thing according to my setup is that both operating systems are installed in UEFI mode, so the virtual machine should be UEFI with chipset Q35. In order to pass-through the physical SSD/HDD you need to do setup ad follow.
The setup of the virtual machine is done via the <code>virt-manager</code> GUI. The first "special" thing according to my setup is that both operating systems are installed in UEFI mode, so the virtual machine should be UEFI with chipset Q35.  
 
In order to pass-through the physical SSD/HDD in this context, you need to identify by using an approach as the follow some other suitable way. In this example the searched ID is for the device <code>/dev/sda</code>.<syntaxhighlight lang="shell" line="1">
ls -l /dev/disk/by-id/ | grep -Pwo "ata.*$(lsblk -d -o NAME,SERIAL | grep -oP '^sda\s+\K.*') "
</syntaxhighlight><syntaxhighlight lang="shell-session">
ata-ADATA_SU800_2I0220056120
</syntaxhighlight>
 
=== Create and Configure the Virtual machine ===
Create a virtual machine via wizard of the [[Virt-manager Setting-up Windows Virtual Machines|<code>virt-manager</code>]] GUI tool:
*Step 1/5: Choice ''"Manual Install".''
*Step 2/5: Type <code>win10</code> and choose the entry ''"Microsoft Windows 10".''
*Step 3/5: Provide suitable to your system amount of ''Memory'' and number of ''CPUs.''
*Step 4/5: Don't enable any storage devices.
*Step 5/5: Tick the checkbox '''''Customize configuration before install''''' and choose the the type of the network connection - In this particular (laptop) case I prefer to use the NAT option.
Before proceed by clicking the button Begin install (upper left corner - see {{Media-cite|v|1|QEMU/KVM on AMD Ryzen 9 Desktop with Dual-boot and Passthrough}}), choose the following options:
*Chipset: '''<code>Q35</code>''',
*Firmware: '''<code>UEFI x86_64: /usr/share/OVMF/OVMF_CODE_4M.ms.fd</code>'''
 
* Then edit the XML configuration of the virtual machine as it is shown below. By default the XML is not editable, you can enable editing via ''<code>Edit</code> > <code>Preferences</code>'' from the main Manager window - [https://blog.wikichoon.com/2020/07/virt-manager-xml-editor.html reference] .  
<syntaxhighlight lang="xml" line="1" highlight="5">
<syntaxhighlight lang="xml" line="1" highlight="5">
<disk type="block" device="disk">
<disk type="block" device="disk">
Line 41: Line 62:
</disk>
</disk>
</syntaxhighlight>
</syntaxhighlight>
* In order to get the physical by id you can use the command <code>ls -l /dev/disk/by-id/</code>.
Note you don't need to type the 5-th line if your using <code>virt-manager</code> to edit the XML entry for the drive - it will be generated automatically on save.
Note you don't need to type the 5th line if your using <code>virt-manager</code> to edit the XML entry for the drive - it will be generated automatically on save.


In most how-to manuals they propose to use <code><target dev="vdX" bus="virtio"/></code>, but it is not possible to use <code>virtio</code> while there is not driver installed within the Windows 10 OS. So you need to install the driver first... or during the installation of Windows if it is a new installation.
In most how-to manuals they propose to use <code><target dev="vdX" bus="virtio"/></code>, but it is not possible to use <code>virtio</code> while there is not driver installed within the Windows 10 OS. So you need to install the driver first... or during the installation of Windows if it is a new installation.


=== Install the Guest Tools ===
=== Install the Guest Tools ===
Once the guest OS is running successfully, the final step of the setup is installing the [[QEMU/KVM Guest tools#Windows Guest tools|QEMU/KVM Guest tools for Windows]], thus the screen will be automatically resized within the SPICE client of <code>virt-manager</code>.
Once the guest OS is running successfully, the final step of the setup is installing the [[QEMU/KVM Guest tools#Windows Guest tools|QEMU/KVM Guest tools for Windows]], thus the screen will be automatically resized within the SPICE client of <code>virt-manager</code> and <code>virt-viewer</code>. And also allows you to gracefully shutdown the guest.
 
It is not mentioned anywhere above but you need to [https://christitus.com/windows-inside-linux/#enable-qemu-guest-agent '''Enable the QEMU Guest Agent'''] within the virtual machine configuration, otherwise the agent will not work and, for example, you will not be able to shutdown the VM from the host's side.


=== The final configuration of the VM ===
=== The Final Configuration of the Virtual machine ===
<syntaxhighlight lang="shell" line="1">
<syntaxhighlight lang="shell" line="1">
virsh --connect qemu:///system dumpxml "Win10.SSD.PT" | tee "Win10.SSD.PT.xml"
virsh --connect qemu:///system dumpxml "Win10.SSD.PT" | tee "Win10.SSD.PT.xml"
Line 55: Line 77:
<syntaxhighlight lang="xml" line="1" highlight="" class="mlw-pre-max-height-320">
<syntaxhighlight lang="xml" line="1" highlight="" class="mlw-pre-max-height-320">
<domain type='kvm'>
<domain type='kvm'>
   <name>Win10.SSD.PT</name>
   <name>Win10</name>
   <uuid>f45cd48b-449a-460c-bbfe-fdf06052f30e</uuid>
   <uuid>f45cd48b-449a-460c-bbfe-fdf06052f30e</uuid>
   <title>Windows 10, Physical Disk Passthrough, Q35/UEFI</title>
   <title>Windows 10, Physical Disk Passthrough, Q35/UEFI</title>
Line 64: Line 86:
     </libosinfo:libosinfo>
     </libosinfo:libosinfo>
   </metadata>
   </metadata>
   <memory unit='KiB'>3145728</memory>
   <memory unit='KiB'>8388608</memory>
   <currentMemory unit='KiB'>3145728</currentMemory>
   <currentMemory unit='KiB'>8388608</currentMemory>
   <memoryBacking>
   <memoryBacking>
     <source type='memfd'/>
     <source type='memfd'/>
Line 185: Line 207:
       <target chassis='14' port='0x1d'/>
       <target chassis='14' port='0x1d'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
    </controller>
    <controller type='pci' index='15' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='15' port='0x1e'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x6'/>
    </controller>
    <controller type='pci' index='16' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
     </controller>
     </controller>
     <controller type='sata' index='0'>
     <controller type='sata' index='0'>
Line 209: Line 240:
     <channel type='spicevmc'>
     <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
       <target type='virtio' name='com.redhat.spice.0'/>
       <address type='virtio-serial' controller='0' bus='0' port='1'/>
       <address type='virtio-serial' controller='0' bus='0' port='2'/>
    </channel>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='3'/>
     </channel>
     </channel>
     <input type='tablet' bus='usb'>
     <input type='tablet' bus='usb'>
Line 216: Line 251:
     <input type='mouse' bus='ps2'/>
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
     <graphics type='spice' autoport='yes'>
     <graphics type='spice' autoport='yes' listen='127.0.0.1'>
       <listen type='address'/>
       <listen type='address' address='127.0.0.1'/>
       <image compression='off'/>
       <image compression='off'/>
     </graphics>
     </graphics>
Line 241: Line 276:


</syntaxhighlight>
</syntaxhighlight>
==Additional Guides==
*[[Virt-manager Setting-up Windows Virtual Machines]]
*[[QEMU/KVM Guest tools#Windows Guest tools|Install QEMU/KVM Guest tools for Windows]]
*[[RDP use Remmina with Windows Account (refs)|RDP use Remmina with Windows Account]]
*[[QEMU/KVM and GPU Passthrough Troubleshooting]]
== References ==
== References ==
* [[QEMU/KVM and GPU Passthrough in Details]]
* [[QEMU/KVM and GPU Passthrough in Details]]
* [[QEMU/KVM on AMD Ryzen 9 Desktop with Dual-boot and Passthrough]]
* [[QEMU/KVM on AMD Ryzen 9 Desktop with Dual-boot and Passthrough]]
* Ubuntu Wiki: [https://help.ubuntu.com/community/KVM/Managing '''KVM Managing''']
* Ubuntu Wiki: [https://help.ubuntu.com/community/KVM/Managing '''KVM Managing''']
* Chris Titus Tech Site: [https://christitus.com/windows-inside-linux/#enable-qemu-guest-agent Setting up Windows inside Linux > '''Enable QEMU Guest Agent''']
* Ask Ubuntu: [https://askubuntu.com/questions/144894/add-physical-disk-to-kvm-virtual-machine Add physical disk to KVM virtual machine]
* Ask Ubuntu: [https://askubuntu.com/questions/144894/add-physical-disk-to-kvm-virtual-machine Add physical disk to KVM virtual machine]
* Ask Fedora: [https://ask.fedoraproject.org/t/why-does-virt-manager-ask-for-authentication-password/11100/2 Why does virt-manager ask for authentication password?]
* Ask Fedora: [https://ask.fedoraproject.org/t/why-does-virt-manager-ask-for-authentication-password/11100/2 Why does virt-manager ask for authentication password?]
Line 255: Line 297:
{{devStage  
{{devStage  
  | Прндл  = Virtual Machines
  | Прндл  = Virtual Machines
  | Стадий = 3
  | Стадий = 6
  | Фаза  = Разработване
  | Фаза  = Утвърждаване
  | Статус = Разутвърден
  | Статус = Утвърден
  | ИдтПт  = Spas
  | ИдтПт  = Spas
  | РзбПт  = {{REVISIONUSER}}
  | РзбПт  = Spas
  | АвтПт  = Spas
  | АвтПт  = Spas
  | УтвПт  = Spas
  | УтвПт  = {{REVISIONUSER}}
  | ИдтДт  = 12.08.2022
  | ИдтДт  = 12.08.2022
  | РзбДт  = {{Today}}
  | РзбДт  = 2.09.2022
  | АвтДт  = 14.08.2022
  | АвтДт  = 2.09.2022
  | УтвДт  = 14.08.2022
  | УтвДт  = {{Today}}
  | ИдтРв  = [[Special:Permalink/30117|30117]]
  | ИдтРв  = [[Special:Permalink/30117|30117]]
  | РзбРв  = {{REVISIONID}}
  | РзбРв  = [[Special:Permalink/31056|31056]]
  | АвтРв  =  
  | АвтРв  = [[Special:Permalink/31068|31068]]
  | РзАРв  = [[Special:Permalink/30155|30155]]
  | РзАРв  = [[Special:Permalink/30155|30155]]
  | УтвРв  =  
  | УтвРв  = {{REVISIONID}}
  | РзУРв  = [[Special:Permalink/30157|30157]]
  | РзУРв  = [[Special:Permalink/30157|30157]]
}}
}}
</div>
</div>
</noinclude>
</noinclude>

Latest revision as of 17:56, 28 September 2022

I was in need to ac­cess Win­dows 10 from Kali Lin­ux on my dual boot­ed Leno­vo ThinkPad X230T laptop/​​​tablet de­vice. Ac­tu­al­ly I will pass­through one of the phys­i­cal stor­age de­vices where Win­dows 10 is al­ready in­stalled. So here are the things I've done to achieve that.

Test the Vir­tu­al­iza­tion Ca­pa­bil­i­ties of the Sys­tem

Check weath­er the sys­tem sup­ports vir­tu­al­iza­tion and it is en­abled via the BIOS. The fol­low­ing com­mand must re­turn at least 1:

egrep -c '(vmx|svm)' /proc/cpuinfo

In­stall QE­MU, KVM, LIB­VIRT

With­in the old­er ver­sions of De­bian based OS, like as Ubun­tu 20.04, we was in need to in­stall the pack­ages qe­mu qe­mu-kvm, but in mot re­cent op­er­at­ing sys­tems as Kali 2022 we need to in­stall qe­mu-sys­tem-x86 in­stead.

sudo apt install qemu-system-x86 libvirt-daemon bridge-utils
sudo apt install libvirt-clients virtinst libosinfo-bin ovmf
sudo apt install virt-manager virt-viewer remmina # For desktop user

In or­der to get rid of the pass­word di­a­logue for virt-man­ag­er"Sys­tem pol­i­cy pre­vents man­age­ment of lo­cal vir­tu­al­iza­tion sys­tems" – I've added my Lin­ux user to the lib­virt group.

sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
grep "$USER" /etc/group

Set­up the Vir­tu­al Ma­chine

With­in my cur­rent set­up the vir­tu­al ma­chine will use a phys­i­cal SSD dri­ve, where Win­dows 10 is pre­vi­ous­ly in­stalled and ful­ly op­er­a­tional via the dual boot op­tion and I want to keep this way of ac­cess­ing Win­dows 10 too.

The first "spe­cial" thing ac­cord­ing to my set­up is that both op­er­at­ing sys­tems are in­stalled in UE­FI mode, so the vir­tu­al ma­chine should have UE­FI firmware and with chipset Q35.

Iden­ti­fy the SSD

There are two ways to pass the SSD as block de­vice as it is de­scribed in this sec­tion and by pass­ing the SA­TA con­troller as it is de­scribed in the ar­ti­cle QEMU/KVM on AMD Ryzen 9 Desk­top with Dual-boot and Passthrough.

At first glance there is not any sig­nif­i­cant per­for­mance dif­fer­ence. How­ev­er when you use the block de­vice ap­proach you can use the write cache op­tion for the de­vice, which will in­crease the speed of han­dling of the large files. On the oth­er hand, when pass­ing the SA­TA con­troller ap­proach is in use, Win­dows 10 will use the same dri­ver with­in the VM en­vi­ron­ment and with­in the na­tive boot. In both cas­es the SSD shouldn't be mount­ed at the host's side.

The set­up of the vir­tu­al ma­chine is done via the virt-man­ag­er GUI. The first "spe­cial" thing ac­cord­ing to my set­up is that both op­er­at­ing sys­tems are in­stalled in UE­FI mode, so the vir­tu­al ma­chine should be UE­FI with chipset Q35.

In or­der to pass-through the phys­i­cal SSD/HDD in this con­text, you need to iden­ti­fy by us­ing an ap­proach as the fol­low some oth­er suit­able way. In this ex­am­ple the searched ID is for the de­vice /​​​dev/​​​sda.

ls -l /dev/disk/by-id/ | grep -Pwo "ata.*$(lsblk -d -o NAME,SERIAL | grep -oP '^sda\s+\K.*') "
ata-ADATA_SU800_2I0220056120

Cre­ate and Con­fig­ure the Vir­tu­al ma­chine

Cre­ate a vir­tu­al ma­chine via wiz­ard of the virt-man­ag­er GUI tool:

  • Step 1/5: Choice "Man­u­al In­stall".
  • Step 2/5: Type win10 and choose the en­try "Mi­crosoft Win­dows 10".
  • Step 3/5: Pro­vide suit­able to your sys­tem amount of Mem­o­ry and num­ber of CPUs.
  • Step 4/5: Don't en­able any stor­age de­vices.
  • Step 5/5: Tick the check­box Cus­tomize con­fig­u­ra­tion be­fore in­stall and choose the the type of the net­work con­nec­tion – In this par­tic­u­lar (lap­top) case I pre­fer to use the NAT op­tion.

Be­fore pro­ceed by click­ing the but­ton Be­gin in­stall (up­per left cor­ner – see Video 1 from the ar­ti­cle QEMU/KVM on AMD Ryzen 9 Desk­top with Dual-boot and Passthrough), choose the fol­low­ing op­tions:

  • Chipset: Q35,
  • Firmware: UE­FI x86_​​​64: /usr/share/OVMF/OVMF_CODE_4M.ms.fd
  • Then ed­it the XML con­fig­u­ra­tion of the vir­tu­al ma­chine as it is shown be­low. By de­fault the XML is not ed­itable, you can en­able edit­ing via Ed­it > Pref­er­ences from the main Man­ag­er win­dow – ref­er­ence .
<disk type="block" device="disk">
  <driver name="qemu" type="raw" cache="none" discard="unmap"/>
  <source dev="/dev/disk/by-id/ata-ADATA_SU800_2I0220056120"/>
  <target dev="sda" bus="sata"/>
  <address type="drive" controller="0" bus="0" target="0" unit="0"/>
</disk>

Note you don't need to type the 5‑th line if your us­ing virt-man­ag­er to ed­it the XML en­try for the dri­ve – it will be gen­er­at­ed au­to­mat­i­cal­ly on save.

In most how-to man­u­als they pro­pose to use <tar­get dev="vdX" bus="virtio"/>, but it is not pos­si­ble to use vir­tio while there is not dri­ver in­stalled with­in the Win­dows 10 OS. So you need to in­stall the dri­ver first… or dur­ing the in­stal­la­tion of Win­dows if it is a new in­stal­la­tion.

In­stall the Guest Tools

Once the guest OS is run­ning suc­cess­ful­ly, the fi­nal step of the set­up is in­stalling the QEMU/KVM Guest tools for Win­dows, thus the screen will be au­to­mat­i­cal­ly re­sized with­in the SPICE client of virt-man­ag­er and virt-view­er. And al­so al­lows you to grace­ful­ly shut­down the guest.

It is not men­tioned any­where above but you need to En­able the QE­MU Guest Agent with­in the vir­tu­al ma­chine con­fig­u­ra­tion, oth­er­wise the agent will not work and, for ex­am­ple, you will not be able to shut­down the VM from the host's side.

The Fi­nal Con­fig­u­ra­tion of the Vir­tu­al ma­chine

virsh --connect qemu:///system dumpxml "Win10.SSD.PT" | tee "Win10.SSD.PT.xml"
<domain type='kvm'>
  <name>Win10</name>
  <uuid>f45cd48b-449a-460c-bbfe-fdf06052f30e</uuid>
  <title>Windows 10, Physical Disk Passthrough, Q35/UEFI</title>
  <description>https://wiki.metalevel.tech/wiki/QEMU/KVM_on_Kali_Linux_2022_at_ThinkPad_X230T</description>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <memoryBacking>
    <source type='memfd'/>
    <access mode='shared'/>
  </memoryBacking>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-7.0'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE_4M.ms.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/win10_VARS.fd</nvram>
    <boot dev='hd'/>
    <bootmenu enable='yes'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode='custom'>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
    <vmport state='off'/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'>
    <topology sockets='1' dies='1' cores='2' threads='1'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' discard='unmap'/>
      <source dev='/dev/disk/by-id/ata-ADATA_SU800_2I0220056120'/>
      <target dev='sda' bus='sata'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <controller type='pci' index='6' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='6' port='0x15'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
    </controller>
    <controller type='pci' index='7' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='7' port='0x16'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
    </controller>
    <controller type='pci' index='8' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='8' port='0x17'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
    </controller>
    <controller type='pci' index='9' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='9' port='0x18'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='10' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='10' port='0x19'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
    </controller>
    <controller type='pci' index='11' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='11' port='0x1a'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
    </controller>
    <controller type='pci' index='12' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='12' port='0x1b'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
    </controller>
    <controller type='pci' index='13' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='13' port='0x1c'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
    </controller>
    <controller type='pci' index='14' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='14' port='0x1d'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
    </controller>
    <controller type='pci' index='15' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='15' port='0x1e'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x6'/>
    </controller>
    <controller type='pci' index='16' model='pcie-to-pci-bridge'>
      <model name='pcie-pci-bridge'/>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </controller>
    <controller type='sata' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:e0:6e:b1'/>
      <source network='default'/>
      <model type='e1000e'/>
      <link state='up'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='2'/>
    </channel>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='3'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
      <image compression='off'/>
    </graphics>
    <sound model='ich9'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
    </sound>
    <audio id='1' type='spice'/>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Ad­di­tion­al Guides

Ref­er­ences