]> git.proxmox.com Git - pve-docs.git/blobdiff - qm.adoc
add ivshmem documentation
[pve-docs.git] / qm.adoc
diff --git a/qm.adoc b/qm.adoc
index 154c5c192385896a433c2d33b3b4b11bda766d7f..77fec9871b5927444f439f035ed4065e1bcc24e0 100644 (file)
--- a/qm.adoc
+++ b/qm.adoc
@@ -101,7 +101,7 @@ could incur a performance slowdown, or putting your data at risk.
 General Settings
 ~~~~~~~~~~~~~~~~
 
-[thumbnail="gui-create-vm-general.png"]
+[thumbnail="screenshot/gui-create-vm-general.png"]
 
 General settings of a VM include
 
@@ -115,7 +115,7 @@ General settings of a VM include
 OS Settings
 ~~~~~~~~~~~
 
-[thumbnail="gui-create-vm-os.png"]
+[thumbnail="screenshot/gui-create-vm-os.png"]
 
 When creating a VM, setting the proper Operating System(OS) allows {pve} to
 optimize some low level parameters. For instance Windows OS expect the BIOS
@@ -158,12 +158,12 @@ each disk, instead of adding all disks to the same controller.
 is an older type of paravirtualized controller. It has been superseded by the
 VirtIO SCSI Controller, in terms of features.
 
-[thumbnail="gui-create-vm-hard-disk.png"]
+[thumbnail="screenshot/gui-create-vm-hard-disk.png"]
 On each controller you attach a number of emulated hard disks, which are backed
 by a file or a block device residing in the configured storage. The choice of
 a storage type will determine the format of the hard disk image. Storages which
 present block devices (LVM, ZFS, Ceph) will require the *raw disk image format*,
-whereas files based storages (Ext4, NFS, GlusterFS) will let you to choose
+whereas files based storages (Ext4, NFS, CIFS, GlusterFS) will let you to choose
 either the *raw disk image format* or the *QEMU image format*.
 
  * the *QEMU image format* is a copy on write format which allows snapshots, and
@@ -193,11 +193,21 @@ As of {pve} 5.0, replication requires the disk images to be on a storage of type
 configured requires to skip replication for this disk image.
 
 If your storage supports _thin provisioning_ (see the storage chapter in the
-{pve} guide), and your VM has a *SCSI* controller you can activate the *Discard*
-option on the hard disks connected to that controller. With *Discard* enabled,
-when the filesystem of a VM marks blocks as unused after removing files, the
-emulated SCSI controller will relay this information to the storage, which will
-then shrink the disk image accordingly.
+{pve} guide), you can activate the *Discard* option on a drive. With *Discard*
+set and a _TRIM_-enabled guest OS footnote:[TRIM, UNMAP, and discard
+https://en.wikipedia.org/wiki/Trim_%28computing%29], when the VM's filesystem
+marks blocks as unused after deleting files, the controller will relay this
+information to the storage, which will then shrink the disk image accordingly.
+For the guest to be able to issue _TRIM_ commands, you must either use a
+*VirtIO SCSI* (or *VirtIO SCSI Single*) controller or set the *SSD emulation*
+option on the drive. Note that *Discard* is not supported on *VirtIO Block*
+drives.
+
+If you would like a drive to be presented to the guest as a solid-state drive
+rather than a rotational hard disk, you can set the *SSD emulation* option on
+that drive. There is no requirement that the underlying storage actually be
+backed by SSDs; this feature can be used with physical media of any type.
+Note that *SSD emulation* is not supported on *VirtIO Block* drives.
 
 .IO Thread
 The option *IO Thread* can only be used when using a disk with the
@@ -213,7 +223,7 @@ Note that backups do not currently work with *IO Thread* enabled.
 CPU
 ~~~
 
-[thumbnail="gui-create-vm-cpu.png"]
+[thumbnail="screenshot/gui-create-vm-cpu.png"]
 
 A *CPU socket* is a physical slot on a PC motherboard where you can plug a CPU.
 This CPU can then contain one or many *cores*, which are independent
@@ -307,56 +317,110 @@ theory this will give your guests maximum performance.
 Meltdown / Spectre related CPU flags
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-There are two CPU flags related to the Meltdown and Spectre vulnerabilities
+There are several CPU flags related to the Meltdown and Spectre vulnerabilities
 footnote:[Meltdown Attack https://meltdownattack.com/] which need to be set
 manually unless the selected CPU type of your VM already enables them by default.
 
-The first, called 'pcid', helps to reduce the performance impact of the Meltdown
-mitigation called 'Kernel Page-Table Isolation (KPTI)', which effectively hides
-the Kernel memory from the user space. Without PCID, KPTI is quite an expensive
-mechanism footnote:[PCID is now a critical performance/security feature on x86
-https://groups.google.com/forum/m/#!topic/mechanical-sympathy/L9mHTbeQLNU].
-
-The second CPU flag is called 'spec-ctrl', which allows an operating system to
-selectively disable or restrict speculative execution in order to limit the
-ability of attackers to exploit the Spectre vulnerability.
-
-There are two requirements that need to be fulfilled in order to use these two
+There are two requirements that need to be fulfilled in order to use these
 CPU flags:
 
 * The host CPU(s) must support the feature and propagate it to the guest's virtual CPU(s)
 * The guest operating system must be updated to a version which mitigates the
   attacks and is able to utilize the CPU feature
 
-In order to use 'spec-ctrl', your CPU or system vendor also needs to provide a
+Otherwise you need to set the desired CPU flag of the virtual CPU, either by
+editing the CPU options in the WebUI, or by setting the 'flags' property of the
+'cpu' option in the VM configuration file.
+
+For Spectre v1,v2,v4 fixes, your CPU or system vendor also needs to provide a
 so-called ``microcode update'' footnote:[You can use `intel-microcode' /
 `amd-microcode' from Debian non-free if your vendor does not provide such an
 update. Note that not all affected CPUs can be updated to support spec-ctrl.]
 for your CPU.
 
-To check if the {pve} host supports PCID, execute the following command as root:
+
+To check if the {pve} host is vulnerable, execute the following command as root:
 
 ----
-# grep ' pcid ' /proc/cpuinfo
+for f in /sys/devices/system/cpu/vulnerabilities/*; do echo "${f##*/} -" $(cat "$f"); done
 ----
 
-If this does not return empty your host's CPU has support for 'pcid'.
+A community script is also available to detect is the host is still vulnerable.
+footnote:[spectre-meltdown-checker https://meltdown.ovh/]
 
-To check if the {pve} host supports spec-ctrl, execute the following command as root:
+Intel processors
+^^^^^^^^^^^^^^^^
 
+* 'pcid'
++
+This reduces the performance impact of the Meltdown (CVE-2017-5754) mitigation
+called 'Kernel Page-Table Isolation (KPTI)', which effectively hides
+the Kernel memory from the user space. Without PCID, KPTI is quite an expensive
+mechanism footnote:[PCID is now a critical performance/security feature on x86
+https://groups.google.com/forum/m/#!topic/mechanical-sympathy/L9mHTbeQLNU].
++
+To check if the {pve} host supports PCID, execute the following command as root:
++
 ----
-# grep ' spec_ctrl ' /proc/cpuinfo
+# grep ' pcid ' /proc/cpuinfo
 ----
++
+If this does not return empty your host's CPU has support for 'pcid'.
+
+* 'spec-ctrl'
++
+Required to enable the Spectre v1 (CVE-2017-5753) and Spectre v2 (CVE-2017-5715) fix,
+in cases where retpolines are not sufficient.
+Included by default in Intel CPU models with -IBRS suffix.
+Must be explicitly turned on for Intel CPU models without -IBRS suffix.
+Requires an updated host CPU microcode (intel-microcode >= 20180425).
++
+* 'ssbd'
++
+Required to enable the Spectre V4 (CVE-2018-3639) fix. Not included by default in any Intel CPU model.
+Must be explicitly turned on for all Intel CPU models.
+Requires an updated host CPU microcode(intel-microcode >= 20180703).
 
-If this does not return empty your host's CPU has support for 'spec-ctrl'.
 
-If you use `host' or another CPU type which enables the desired flags by
-default, and you updated your guest OS to make use of the associated CPU
-features, you're already set.
+AMD processors
+^^^^^^^^^^^^^^
+
+* 'ibpb'
++
+Required to enable the Spectre v1 (CVE-2017-5753) and Spectre v2 (CVE-2017-5715) fix,
+in cases where retpolines are not sufficient.
+Included by default in AMD CPU models with -IBPB suffix.
+Must be explicitly turned on for AMD CPU models without -IBPB suffix.
+Requires the host CPU microcode to support this feature before it can be used for guest CPUs.
+
+
+
+* 'virt-ssbd'
++
+Required to enable the Spectre v4 (CVE-2018-3639) fix.
+Not included by default in any AMD CPU model.
+Must be explicitly turned on for all AMD CPU models.
+This should be provided to guests, even if amd-ssbd is also provided, for maximum guest compatibility.
+Note that this must be explicitly enabled when when using the "host" cpu model,
+because this is a virtual feature which does not exist in the physical CPUs.
+
+
+* 'amd-ssbd'
++
+Required to enable the Spectre v4 (CVE-2018-3639) fix.
+Not included by default in any AMD CPU model. Must be explicitly turned on for all AMD CPU models.
+This provides higher performance than virt-ssbd, therefore a host supporting this should always expose this to guests if possible.
+virt-ssbd should none the less also be exposed for maximum guest compatibility as some kernels only know about virt-ssbd.
+
+
+* 'amd-no-ssb'
++
+Recommended to indicate the host is not vulnerable to Spectre V4 (CVE-2018-3639).
+Not included by default in any AMD CPU model.
+Future hardware generations of CPU will not be vulnerable to CVE-2018-3639,
+and thus the guest should be told not to enable its mitigations, by exposing amd-no-ssb.
+This is mutually exclusive with virt-ssbd and amd-ssbd.
 
-Otherwise you need to set the desired CPU flag of the virtual CPU, either by
-editing the CPU options in the WebUI, or by setting the 'flags' property of the
-'cpu' option in the VM configuration file.
 
 NUMA
 ^^^^
@@ -373,7 +437,7 @@ will allow proper distribution of the VM resources on the host system.
 This option is also required to hot-plug cores or RAM in a VM.
 
 If the NUMA option is used, it is recommended to set the number of sockets to
-the number of sockets of the host system.
+the number of nodes of the host system.
 
 vCPU hot-plug
 ^^^^^^^^^^^^^
@@ -418,32 +482,31 @@ For each VM you have the option to set a fixed size memory or asking
 host.
 
 .Fixed Memory Allocation
-[thumbnail="gui-create-vm-memory-fixed.png"]
+[thumbnail="screenshot/gui-create-vm-memory.png"]
 
-When choosing a *fixed size memory* {pve} will simply allocate what you
-specify to your VM.
+When setting memory and minimum memory to the same amount
+{pve} will simply allocate what you specify to your VM.
 
 Even when using a fixed memory size, the ballooning device gets added to the
 VM, because it delivers useful information such as how much memory the guest
 really uses.
 In general, you should leave *ballooning* enabled, but if you want to disable
 it (e.g. for debugging purposes), simply uncheck
-*Ballooning* or set
+*Ballooning Device* or set
 
  balloon: 0
 
 in the configuration.
 
 .Automatic Memory Allocation
-[thumbnail="gui-create-vm-memory-dynamic.png", float="left"]
 
 // see autoballoon() in pvestatd.pm
-When choosing to *automatically allocate memory*, {pve} will make sure that the
+When setting the minimum memory lower than memory, {pve} will make sure that the
 minimum amount you specified is always available to the VM, and if RAM usage on
 the host is below 80%, will dynamically add memory to the guest up to the
 maximum memory specified.
 
-When the host is becoming short on RAM, the VM will then release some memory
+When the host is running low on RAM, the VM will then release some memory
 back to the host, swapping running processes if needed and starting the oom
 killer in last resort. The passing around of memory between host and guest is
 done via a special `balloon` kernel driver running inside the guest, which will
@@ -453,14 +516,14 @@ footnote:[A good explanation of the inner workings of the balloon driver can be
 When multiple VMs use the autoallocate facility, it is possible to set a
 *Shares* coefficient which indicates the relative amount of the free host memory
 that each VM should take. Suppose for instance you have four VMs, three of them
-running a HTTP server and the last one is a database server. To cache more
+running an HTTP server and the last one is a database server. To cache more
 database blocks in the database server RAM, you would like to prioritize the
 database VM when spare RAM is available. For this you assign a Shares property
 of 3000 to the database VM, leaving the other VMs to the Shares default setting
 of 1000. The host server has 32GB of RAM, and is currently using 16GB, leaving 32
 * 80/100 - 16 = 9GB RAM to be allocated to the VMs. The database VM will get 9 *
 3000 / (3000 + 1000 + 1000 + 1000) = 4.5 GB extra RAM and each HTTP server will
-get 1/5 GB.
+get 1.5 GB.
 
 All Linux distributions released after 2010 have the balloon kernel driver
 included. For Windows OSes, the balloon driver needs to be added manually and can
@@ -476,7 +539,7 @@ of RAM available to the host.
 Network Device
 ~~~~~~~~~~~~~~
 
-[thumbnail="gui-create-vm-network.png"]
+[thumbnail="screenshot/gui-create-vm-network.png"]
 
 Each VM can have many _Network interface controllers_ (NIC), of four different
 types:
@@ -503,7 +566,8 @@ have direct access to the Ethernet LAN on which the host is located.
 the Qemu user networking stack, where a built-in router and DHCP server can
 provide network access. This built-in DHCP will serve addresses in the private
 10.0.2.0/24 range. The NAT mode is much slower than the bridged mode, and
-should only be used for testing.
+should only be used for testing. This mode is only available via CLI or the API,
+but not via the WebUI.
 
 You can also skip adding a network device when creating a VM by selecting *No
 network device*.
@@ -516,7 +580,7 @@ of packets transferred.
 
 //http://blog.vmsplice.net/2011/09/qemu-internals-vhost-architecture.html
 When using the VirtIO driver with {pve}, each NIC network queue is passed to the
-host kernel, where the queue will be processed by a kernel thread spawn by the
+host kernel, where the queue will be processed by a kernel thread spawned by the
 vhost driver. With this option activated, it is possible to pass _multiple_
 network queues to the host kernel for each NIC.
 
@@ -536,6 +600,39 @@ traffic increases. We recommend to set this option only when the VM has to
 process a great number of incoming connections, such as when the VM is running
 as a router, reverse proxy or a busy HTTP server doing long polling.
 
+[[qm_display]]
+Display
+~~~~~~~
+
+QEMU can virtualize a few types of VGA hardware. Some examples are:
+
+* *std*, the default, emulates a card with Bochs VBE extensions.
+* *cirrus*, this was once the default, it emulates a very old hardware module
+with all its problems. This display type should only be used if really
+necessary footnote:[https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/
+qemu: using cirrus considered harmful], e.g., if using Windows XP or earlier
+* *vmware*, is a VMWare SVGA-II compatible adapter.
+* *qxl*, is the QXL paravirtualized graphics card. Selecting this also
+enables SPICE for the VM.
+
+You can edit the amount of memory given to the virtual GPU, by setting
+the 'memory' option. This can enable higher resolutions inside the VM,
+especially with SPICE/QXL.
+
+As the memory is reserved by display device, selecting Multi-Monitor mode
+for SPICE (e.g., `qxl2` for dual monitors) has some implications:
+
+* Windows needs a device for each monitor, so if your 'ostype' is some
+version of Windows, {pve} gives the VM an extra device per monitor.
+Each device gets the specified amount of memory.
+
+* Linux VMs, can always enable more virtual monitors, but selecting
+a Multi-Monitor mode multiplies the memory given to the device with
+the number of monitors.
+
+Selecting `serialX` as display 'type' disables the VGA output, and redirects
+the Web Console to the selected serial port. A configured display 'memory'
+setting will be ignored in that case.
 
 [[qm_usb_passthrough]]
 USB Passthrough
@@ -606,6 +703,25 @@ you need to set the client resolution in the OVMF menu(which you can reach
 with a press of the ESC button during boot), or you have to choose
 SPICE as the display type.
 
+[[qm_ivshmem]]
+Inter-VM shared memory
+~~~~~~~~~~~~~~~~~~~~~~
+
+You can add a Inter-VM shared memory device (`ivshmem`) to be able to
+share memory between the host and a guest, or between multiple guests.
+
+To add such a device, you can use `qm`:
+
+  qm set <vmid> -ivshmem size=32,name=foo
+
+Where the size is in MiB. The file will be located under
+`/dev/shm/pve-shm-$name` (the default name is the vmid).
+
+A usecase for such a device is Looking Glass
+footnote:[Looking Glass: https://looking-glass.hostfission.com/]
+which enables high performance, low-latency display mirroring between
+host and guest.
+
 [[qm_startup_and_shutdown]]
 Automatic Start and Shutdown of Virtual Machines
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -619,7 +735,7 @@ the following command:
 
 .Start and Shutdown Order
 
-[thumbnail="gui-qemu-edit-start-order.png"]
+[thumbnail="screenshot/gui-qemu-edit-start-order.png"]
 
 In some case you want to be able to fine tune the boot order of your
 VMs, for instance if one of your VM is providing firewalling or DHCP
@@ -655,7 +771,7 @@ cluster-wide.
 Migration
 ---------
 
-[thumbnail="gui-qemu-migrate.png"]
+[thumbnail="screenshot/gui-qemu-migrate.png"]
 
 If you have a cluster, you can migrate your VM to another host with
 
@@ -711,7 +827,7 @@ Then the migration will copy the disk over the network to the target host.
 Copies and Clones
 -----------------
 
-[thumbnail="gui-qemu-full-clone.png"]
+[thumbnail="screenshot/gui-qemu-full-clone.png"]
 
 VM installation is usually done using an installation media (CD-ROM)
 from the operation system vendor. Depending on the OS, this can be a
@@ -732,7 +848,7 @@ migrate a VM to a totally different storage. You can also change the
 disk image *Format* if the storage driver supports several formats.
 +
 
-NOTE: A full clone need to read and copy all VM image data. This is
+NOTE: A full clone needs to read and copy all VM image data. This is
 usually much slower than creating a linked clone.
 +
 
@@ -743,7 +859,7 @@ never includes any additional snapshots from the original VM.
 
 Linked Clone::
 
-Modern storage drivers supports a way to generate fast linked
+Modern storage drivers support a way to generate fast linked
 clones. Such a clone is a writable copy whose initial contents are the
 same as the original data. Creating a linked clone is nearly
 instantaneous, and initially consumes no additional space.
@@ -760,8 +876,8 @@ can convert any VM into a read-only <<qm_templates, Template>>). Such
 templates can later be used to create linked clones efficiently.
 +
 
-NOTE: You cannot delete the original template while linked clones
-exists.
+NOTE: You cannot delete an original template while linked clones
+exist.
 +
 
 It is not possible to change the *Target storage* for linked clones,
@@ -772,7 +888,7 @@ The *Target node* option allows you to create the new VM on a
 different node. The only restriction is that the VM is on shared
 storage, and that storage is also available on the target node.
 
-To avoid resource conflicts, all network interface MAC addresses gets
+To avoid resource conflicts, all network interface MAC addresses get
 randomized, and we generate a new 'UUID' for the VM BIOS (smbios1)
 setting.
 
@@ -788,6 +904,47 @@ NOTE: It is not possible to start templates, because this would modify
 the disk images. If you want to change the template, create a linked
 clone and modify that.
 
+VM Generation ID
+----------------
+
+{pve} supports Virtual Machine Generation ID ('vmgenid') footnote:[Official
+'vmgenid' Specification
+https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/virtual-machine-generation-identifier]
+for virtual machines.
+This can be used by the guest operating system to detect any event resulting
+in a time shift event, for example, restoring a backup or a snapshot rollback.
+
+When creating new VMs, a 'vmgenid' will be automatically generated and saved
+in its configuration file.
+
+To create and add a 'vmgenid' to an already existing VM one can pass the
+special value `1' to let {pve} autogenerate one or manually set the 'UUID'
+footnote:[Online GUID generator http://guid.one/] by using it as value,
+e.g.:
+
+----
+ qm set VMID -vmgenid 1
+ qm set VMID -vmgenid 00000000-0000-0000-0000-000000000000
+----
+
+NOTE: The initial addition of a 'vmgenid' device to an existing VM, may result
+in the same effects as a change on snapshot rollback, backup restore, etc., has
+as the VM can interpret this as generation change.
+
+In the rare case the 'vmgenid' mechanism is not wanted one can pass `0' for
+its value on VM creation, or retroactively delete the property in the
+configuration with:
+
+----
+ qm set VMID -delete vmgenid
+----
+
+The most prominent use case for 'vmgenid' are newer Microsoft Windows
+operating systems, which use it to avoid problems in time sensitive or
+replicate services (e.g., databases, domain controller
+footnote:[https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/virtualized-domain-controller-architecture])
+on snapshot rollback, backup restore or a whole VM clone operation.
+
 Importing Virtual Machines and disk images
 ------------------------------------------
 
@@ -824,13 +981,13 @@ Step-by-step example of a Windows OVF import
 
 Microsoft provides
 https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/[Virtual Machines downloads]
- to get started with Windows development.We are going to use one of these 
+ to get started with Windows development.We are going to use one of these
 to demonstrate the OVF import feature.
 
 Download the Virtual Machine zip
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-After getting informed about the user agreement, choose the _Windows 10 
+After getting informed about the user agreement, choose the _Windows 10
 Enterprise (Evaluation - Build)_ for the VMware platform, and download the zip.
 
 Extract the disk image from the zip
@@ -853,7 +1010,7 @@ The VM is ready to be started.
 Adding an external disk image to a Virtual Machine
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-You can also add an existing disk image to a VM, either coming from a 
+You can also add an existing disk image to a VM, either coming from a
 foreign hypervisor, or one that you created yourself.
 
 Suppose you created a Debian/Ubuntu disk image with the 'vmdebootstrap' tool:
@@ -884,7 +1041,24 @@ Finally attach the unused disk to the SCSI controller of the VM:
 The VM is ready to be started.
 
 
+ifndef::wiki[]
 include::qm-cloud-init.adoc[]
+endif::wiki[]
+
+ifndef::wiki[]
+include::qm-pci-passthrough.adoc[]
+endif::wiki[]
+
+Hookscripts
+~~~~~~~~~~~
+
+You can add a hook script to VMs with the config property `hookscript`.
+
+ qm set 100 -hookscript local:snippets/hookscript.pl
+
+It will be called during various phases of the guests lifetime.
+For an example and documentation see the example script under
+`/usr/share/pve-docs/examples/guest-example-hookscript.pl`.
 
 Managing Virtual Machines with `qm`
 ------------------------------------
@@ -1016,6 +1190,16 @@ CAUTION: Only do that if you are sure the action which set the lock is
 no longer running.
 
 
+ifdef::wiki[]
+
+See Also
+~~~~~~~~
+
+* link:/wiki/Cloud-Init_Support[Cloud-Init Support]
+
+endif::wiki[]
+
+
 ifdef::manvolnum[]
 
 Files