284 lines
11 KiB
Django/Jinja
284 lines
11 KiB
Django/Jinja
<domain type='kvm'>
|
|
<name>{{ vm.name }}</name>
|
|
<uuid>{{ vm.uuid }}</uuid>
|
|
<title>{{ vm.title }}</title>
|
|
<memory unit='GiB'>{{ vm.memory }}</memory>
|
|
<currentMemory unit='GiB'>{{ vm.memory }}</currentMemory>
|
|
<memoryBacking>
|
|
<hugepages/>
|
|
<source type='memfd'/>
|
|
<access mode='shared'/>
|
|
</memoryBacking>
|
|
<vcpu placement='static'>{{ vm.cores * vm.threads }}</vcpu>
|
|
<cputune>
|
|
{% set pairs = vm.physical_cpus.split(',') %}
|
|
{% set ns = namespace(vcpu=0) %}
|
|
{% for pair in pairs %}
|
|
{% set parts = pair.split('-') %}
|
|
<vcpupin vcpu='{{ ns.vcpu }}' cpuset='{{ parts[0] }}'/>
|
|
{% set ns.vcpu = ns.vcpu + 1 %}
|
|
<vcpupin vcpu='{{ ns.vcpu }}' cpuset='{{ parts[1] }}'/>
|
|
{% set ns.vcpu = ns.vcpu + 1 %}
|
|
{% endfor %}
|
|
<emulatorpin cpuset='{{ vm.reserved_cpus }}'/>
|
|
</cputune>
|
|
<os>
|
|
<type arch='x86_64' machine='pc-q35-8.2'>hvm</type>
|
|
<loader readonly='yes' secure='{% if vm.secure_boot %}yes{% else %}no{% endif %}' type='pflash' format='qcow2'>/usr/share/edk2/ovmf/OVMF_CODE_4M{% if vm.secure_boot %}.secboot{% endif %}.qcow2</loader>
|
|
<nvram template='/usr/share/edk2/ovmf/OVMF_VARS_4M.secboot.qcow2' templateFormat='qcow2' format='qcow2'>/var/lib/libvirt/qemu/nvram/{{ vm.name }}_VARS.fd.qcow2</nvram>
|
|
<boot dev='hd'/>
|
|
<bootmenu enable='no'/>
|
|
</os>
|
|
<features>
|
|
<acpi/>
|
|
<apic/>
|
|
{% if vm.enable_hyperv is defined %}
|
|
{% if vm.enable_hyperv | default(false) %}
|
|
<hyperv mode='custom'>
|
|
<relaxed state='on'/>
|
|
<vapic state='on'/>
|
|
<spinlocks state='on' retries='8191'/>
|
|
<vendor_id state='on' value='{{ vm.hyperv_vendor_id | default("whatever") }}'/>
|
|
</hyperv>
|
|
{% endif %}
|
|
{% endif %}
|
|
<smm state='on'/>
|
|
</features>
|
|
{% if vm.cpu is defined %}
|
|
<cpu mode='custom' match='exact' check='none'>
|
|
<model fallback='allow'>{{ vm.cpu }}</model>
|
|
{% else %}
|
|
<cpu mode='host-passthrough' check='none' migratable='on'>
|
|
{% endif %}
|
|
<topology sockets='1' dies='1' cores='{{ vm.cores }}' threads='{{ vm.threads }}'/>
|
|
</cpu>
|
|
<clock offset='localtime'>
|
|
<timer name='rtc' tickpolicy='catchup'/>
|
|
<timer name='pit' tickpolicy='delay'/>
|
|
<timer name='hpet' present='no'/>
|
|
<timer name='kvmclock' present='yes'/>
|
|
{% if vm.enable_hyperv is defined %}
|
|
{% if vm.enable_hyperv | default(false) %}
|
|
<timer name='hypervclock' present='yes'/>
|
|
{% endif %}
|
|
{% endif %}
|
|
</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>{{ vm.emulator | default("/usr/bin/qemu-system-x86_64") }}</emulator>
|
|
<disk type='file' device='disk'>
|
|
<driver name='qemu' type='qcow2' cache='writeback'/>
|
|
<source file='/var/lib/libvirt/images/{{ vm.disk_file }}'/>
|
|
<backingStore />
|
|
<target dev='sda' bus='virtio'/>
|
|
<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0' />
|
|
</disk>
|
|
{% for block_dev in vm.block_devs %}
|
|
<disk type='block' device='disk'>
|
|
<driver name='qemu' type='raw'/>
|
|
<source dev='{{ block_dev.block_dev }}'/>
|
|
<target dev='{{ block_dev.target_dev }}' bus='virtio'/>
|
|
</disk>
|
|
{% endfor %}
|
|
{% if vm.cloud_init is defined %}
|
|
{% if vm.cloud_init | default(false) %}
|
|
<disk type='file' device='disk'>
|
|
<driver name='qemu' type='raw'/>
|
|
<source file='/var/lib/libvirt/images/{{ vm.name }}-cloudinit.img'/>
|
|
<target dev='hdb' bus='virtio'/>
|
|
<readonly/>
|
|
</disk>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if vm.cdrom %}
|
|
<disk type='file' device='cdrom'>
|
|
<driver name='qemu' type='raw'/>
|
|
<target dev='hdc' bus='sata'/>
|
|
<readonly/>
|
|
<address type='drive' controller='0' bus='0' target='0' unit='2'/>
|
|
</disk>
|
|
{% endif %}
|
|
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
|
|
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0' />
|
|
</controller>
|
|
<controller type='sata' index='0'>
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2' />
|
|
</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='0x8' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'
|
|
multifunction='on' />
|
|
</controller>
|
|
<controller type='pci' index='2' model='pcie-to-pci-bridge'>
|
|
<model name='pcie-pci-bridge' />
|
|
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' />
|
|
</controller>
|
|
<controller type='pci' index='3' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='3' port='0x9' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1' />
|
|
</controller>
|
|
<controller type='pci' index='4' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='4' port='0xa' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2' />
|
|
</controller>
|
|
<controller type='pci' index='5' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='5' port='0xb' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3' />
|
|
</controller>
|
|
<controller type='pci' index='6' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='6' port='0xc' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4' />
|
|
</controller>
|
|
<controller type='pci' index='7' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='7' port='0xd' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x5' />
|
|
</controller>
|
|
<controller type='pci' index='8' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='8' port='0xe' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x6' />
|
|
</controller>
|
|
<controller type='pci' index='9' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='9' port='0xf' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x7' />
|
|
</controller>
|
|
<controller type='pci' index='10' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='10' port='0x10' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'
|
|
multifunction='on' />
|
|
</controller>
|
|
<controller type='pci' index='11' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='11' port='0x11' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1' />
|
|
</controller>
|
|
<controller type='pci' index='12' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='12' port='0x12' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2' />
|
|
</controller>
|
|
<controller type='pci' index='13' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='13' port='0x13' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3' />
|
|
</controller>
|
|
<controller type='pci' index='14' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='14' port='0x14' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4' />
|
|
</controller>
|
|
<controller type='pci' index='15' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='15' port='0x15' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5' />
|
|
</controller>
|
|
<controller type='pci' index='16' model='pcie-root-port'>
|
|
<model name='pcie-root-port' />
|
|
<target chassis='16' port='0x16' />
|
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6' />
|
|
</controller>
|
|
<controller type='virtio-serial' index='0'>
|
|
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0' />
|
|
</controller>
|
|
{% if vm.smartcard is defined %}
|
|
{% if vm.smartcard | default(false) %}
|
|
<controller type='ccid' index='0'>
|
|
<alias name='ccid0'/>
|
|
<address type='usb' bus='0' port='1'/>
|
|
</controller>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if vm.virtio_fs is defined %}
|
|
{% for fs in vm.virtio_fs %}
|
|
<filesystem type='mount' accessmode='passthrough'>
|
|
<driver type='virtiofs' queue='1024'/>
|
|
<source dir='{{ fs.source }}'/>
|
|
<target dir='{{ fs.target }}'/>
|
|
</filesystem>
|
|
{% endfor %}
|
|
{% endif %}
|
|
<interface type='bridge'>
|
|
<mac address='{{ vm.mac_address }}'/>
|
|
<source bridge='{{ vm.net_bridge | default("bridge0") }}'/>
|
|
<model type='virtio'/>
|
|
<address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0' />
|
|
</interface>
|
|
{% if vm.tablet is defined %}
|
|
{% if vm.tablet | default(false) %}
|
|
<input type='tablet' bus='usb'/>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if vm.console %}
|
|
<serial type='pty'>
|
|
<target type='isa-serial' port='0'>
|
|
<model name='isa-serial'/>
|
|
</target>
|
|
</serial>
|
|
<console type='pty'>
|
|
<target type='serial' port='0'/>
|
|
</console>
|
|
{% endif %}
|
|
<input type='mouse' bus='ps2'/>
|
|
<input type='keyboard' bus='ps2'/>
|
|
{% if vm.tpm %}
|
|
<tpm model='tpm-crb'>
|
|
<backend type='emulator' version='2.0'/>
|
|
</tpm>
|
|
{% endif %}
|
|
{% if vm.audio %}
|
|
<audio id='1' type='none'/>
|
|
{% endif %}
|
|
{% for dev in vm.host_devs %}
|
|
{% if dev.type == 'mdev' %}
|
|
<hostdev mode='subsystem' type='mdev' managed='no' model='{{ dev.model | default('vfio-pci') }}' display='{{ dev.display | default('off') }}'>
|
|
<source>
|
|
<address uuid='{{ dev.source.uuid }}'/>
|
|
</source>
|
|
{% elif dev.type == 'pci' %}
|
|
<hostdev mode='subsystem' type='pci' managed='yes'>
|
|
<source>
|
|
<address domain='{{ dev.source.address.domain }}' bus='{{ dev.source.address.bus }}'
|
|
slot='{{ dev.source.address.slot }}' function='{{ dev.source.address.function }}'/>
|
|
</source>
|
|
{% endif %}
|
|
{% if dev.address is defined %}
|
|
<address {% for key, value in dev.address.items() %}
|
|
{{ key }}='{{ value }}'{% if not loop.last %} {% endif %}
|
|
{% endfor %}/>
|
|
{% endif %}
|
|
</hostdev>
|
|
{% endfor %}
|
|
{% if vm.guest_agent is defined %}
|
|
{% if vm.guest_agent | default(false) %}
|
|
<channel type='unix'>
|
|
<source mode='bind' path='/var/lib/libvirt/qemu/{{ vm.name }}.agent'/>
|
|
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
|
|
</channel>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if vm.mem_balloon is defined %}
|
|
{% if vm.mem_balloon | default(false) %}
|
|
<memballoon model='virtio'>
|
|
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
|
|
</memballoon>
|
|
{% endif %}
|
|
{% else %}
|
|
<memballoon model='none'/>
|
|
{% endif %}
|
|
</devices>
|
|
</domain> |