libvirt
Once you have a virtual disk image ready (for more information on disk
images, see Section 27.2, “Managing Disk Images with qemu-img”), it is time to
start the related virtual machine.
Section 27.1, “Basic Installation with qemu-system-ARCH” introduced simple commands
to install and run a VM Guest. This chapter focuses on a more detailed
explanation of qemu-system-ARCH usage, and shows
solutions for more specific tasks. For a complete list of
qemu-system-ARCH's options, see its manual page
(man 1 qemu).
qemu-system-ARCH Invocation #
The qemu-system-ARCH command uses the following
syntax:
qemu-system-ARCH options1 disk_img2
| |
Path to the disk image holding the guest system you want to virtualize.
|
qemu-system-ARCH Options #
This section introduces general qemu-system-ARCH
options and options related to the basic emulated hardware, such as the
virtual machine's processor, memory, model type, or time processing
methods.
-name name_of_guest
Specifies the name of the running guest system. The name is displayed in the window caption and also used for the VNC server.
-boot options
Specifies the order in which the defined drives will be booted. Drives are represented by letters, where 'a' and 'b' stands for the floppy drives 1 and 2, 'c' stands for the first hard disk, 'd' stands for the first CD-ROM drive, and 'n' to 'p' stand for Ether-boot network adapters.
For example, qemu-system-ARCH [...] -boot order=ndc
first tries to boot from network, then from the first CD-ROM drive,
and finally from the first hard disk.
-pidfile fname
Stores the QEMU's process identification number (PID) in a file. This is useful if you run QEMU from a script.
-nodefaults
By default QEMU creates basic virtual devices even if you do not specify them on the command line. This option turns this feature off, and you must specify every single device manually, including graphical and network cards, parallel or serial ports, or virtual consoles. Even QEMU monitor is not attached by default.
-daemonize
'Daemonizes' the QEMU process after it is started. QEMU will detach from the standard input and standard output after it is ready to receive connections on any of its devices.
Seabios is the default Bios used. You can boot USB devices, any drive (CDROM, Floppy, or an hard drive disk). It has USB mouse and keyboard support and support multiple VGA cards. For more information about Seabios refer to Seabios Website (http://en.wikipedia.org/wiki/SeaBIOS).
You can specifies the type of the emulated machine. Run
qemu-system-ARCH -M help to view a list of supported
machine types.
tux > qemu-system-x86_64 -M help
Supported machines are:
pc-0.13 Standard PC (i440FX + PIIX, 1996)
pc Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.0)
pc-i440fx-2.0 Standard PC (i440FX + PIIX, 1996) (default)
pc-1.0 Standard PC (i440FX + PIIX, 1996)
pc-q35-1.7 Standard PC (Q35 + ICH9, 2009)
pc-1.1 Standard PC (i440FX + PIIX, 1996)
q35 Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.0)
pc-q35-2.0 Standard PC (Q35 + ICH9, 2009)
pc-i440fx-1.4 Standard PC (i440FX + PIIX, 1996)
pc-i440fx-1.5 Standard PC (i440FX + PIIX, 1996)
pc-0.14 Standard PC (i440FX + PIIX, 1996)
pc-0.15 Standard PC (i440FX + PIIX, 1996)
xenfv Xen Fully-virtualized PC
pc-q35-1.4 Standard PC (Q35 + ICH9, 2009)
isapc ISA-only PC
pc-0.10 Standard PC (i440FX + PIIX, 1996)
pc-1.2 Standard PC (i440FX + PIIX, 1996)
pc-0.11 Standard PC (i440FX + PIIX, 1996)
pc-i440fx-1.7 Standard PC (i440FX + PIIX, 1996)
pc-i440fx-1.6 Standard PC (i440FX + PIIX, 1996)
none empty machine
xenpv Xen Para-virtualized PC
pc-q35-1.5 Standard PC (Q35 + ICH9, 2009)
pc-q35-1.6 Standard PC (Q35 + ICH9, 2009)
pc-0.12 Standard PC (i440FX + PIIX, 1996)
pc-1.3 Standard PC (i440FX + PIIX, 1996)isapc ISA-ony-PC is an unsupported machine type.
To specify the type of the processor (CPU) model, run
qemu-system-ARCH -cpu
MODEL. Use
qemu-system-ARCH -cpu help to view a list of
supported CPU models.
tux > qemu-system-x86_64 -cpu help
x86 qemu64 QEMU Virtual CPU version 2.0.0
x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor
x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz
x86 kvm64 Common KVM processor
x86 qemu32 QEMU Virtual CPU version 2.0.0
x86 kvm32 Common 32-bit KVM processor
x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz
x86 486
x86 pentium
x86 pentium2
x86 pentium3
x86 athlon QEMU Virtual CPU version 2.0.0
x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz
x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2)
x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2)
x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7)
x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C)
x86 SandyBridge Intel Xeon E312xx (Sandy Bridge)
x86 Haswell Intel Core Processor (Haswell)
x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron)
x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron)
x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron)
x86 Opteron_G4 AMD Opteron 62xx class CPU
x86 Opteron_G5 AMD Opteron 63xx class CPU
x86 host KVM processor with all supported host features (only
available in KVM mode)
Recognized CPUID flags:
pbe ia64 tm ht ss sse2 sse fxsr mmx acpi ds clflush pn pse36 pat cmov mca
pge mtrr sep apic cx8 mce pae msr tsc pse de vme fpu
hypervisor rdrand f16c avx osxsave xsave aes tsc-deadline popcnt movbe
x2apic sse4.2|sse4_2 sse4.1|sse4_1 dca pcid pdcm xtpr cx16 fma cid ssse3
tm2 est smx vmx ds_cpl monitor dtes64 pclmulqdq|pclmuldq pni|sse3
smap adx rdseed rtm invpcid erms bmi2 smep avx2 hle bmi1 fsgsbase
3dnow 3dnowext lm|i64 rdtscp pdpe1gb fxsr_opt|ffxsr mmxext nx|xd syscall
perfctr_nb perfctr_core topoext tbm nodeid_msr tce fma4 lwp wdt skinit xop
ibs osvw 3dnowprefetch misalignsse sse4a abm cr8legacy extapic svm
cmp_legacy lahf_lm
pmm-en pmm phe-en phe ace2-en ace2 xcrypt-en xcrypt xstore-en xstore
kvm_pv_unhalt kvm_pv_eoi kvm_steal_time kvm_asyncpf kvmclock kvm_mmu
kvm_nopiodelay kvmclock
pfthreshold pause_filter decodeassists flushbyasid vmcb_clean tsc_scale
nrip_save svm_lock lbrv nptCPU flags information can be found at CPUID wikipedia (http://en.wikipedia.org/wiki/CPUID).
The following is a list of most commonly used options while launching qemu from command line. To see all options available please refer to qemu-doc manpage.
-m megabytes
Specifies how many megabytes are used for the virtual RAM size.
-balloon virtio
Specifies a paravirtualized device to dynamically change the amount
of virtual RAM memory assigned to VM Guest. The top limit is the
amount of memory specified with -m.
-smp number_of_cpus
Specifies how many CPUs will be emulated. QEMU supports up to 255 CPUs on the PC platform (up to 64 with KVM acceleration used). This option also takes other CPU-related parameters, such as number of sockets, number of cores per socket, or number of threads per core.
The following is an example of a working
qemu-system-ARCH command line:
qemu-system-x86_64 -name "SLES 11 SP3" -M pc-i440fx-2.0 -m 512 -machine accel=kvm \
-cpu kvm64 -smp 2 /images/sles.raw-no-acpi
Disables ACPI support.
-S
QEMU starts with CPU stopped. To start CPU, enter
c in QEMU monitor. For more information, see
Chapter 30, Administrating Virtual Machines with QEMU Monitor.
-readconfig cfg_file
Instead of entering the devices configuration options on the command
line each time you want to run VM Guest,
qemu-system-ARCH can read it from a file that was
either previously saved with -writeconfig or
edited manually.
-writeconfig cfg_file
Dumps the current virtual machine's devices configuration to a text
file. It can be consequently re-used with the
-readconfig option.
tux >qemu-system-ARCH -name "SLES 11 SP3" -machine accel=kvm -M pc-i440fx-2.0 -m 512 -cpu kvm64 \ -smp 2 /images/sles.raw -writeconfig /images/sles.cfg (exited)tux >more /images/sles.cfg # qemu config file [drive] index = "0" media = "disk" file = "/images/sles_base.raw"
This way you can effectively manage the configuration of your virtual machines' devices in a well-arranged way.
-rtc options
Specifies the way the RTC is handled inside a VM Guest. By default, the clock of the guest is derived from that of the host system. Therefore, it is recommended that the host system clock is synchronized with an accurate external clock (for example, via NTP service).
If you need to isolate the VM Guest clock from the host one, specify
clock=vm instead of the default
clock=host.
You can also specify a 'starting point' for VM Guest clock with the
base option:
qemu-system-ARCH [...] -rtc clock=vm,base=2010-12-03T01:02:00
Instead of a timestamp, you can specify utc or
localtime. The former instructs VM Guest to start
at the current UTC value (Coordinated Universal Time, see
http://en.wikipedia.org/wiki/UTC), while the latter
applies the local time setting.
QEMU virtual machines emulate all devices needed to run a VM Guest. QEMU supports, for example, several types of network cards, block devices (hard and removable drives), USB devices, character devices (serial and parallel ports), or multimedia devices (graphic and sound cards). This section introduces options to configure various types of supported devices.
If your device, such as -drive, needs a special
driver and driver properties to be set, specify them with the
-device option, and identify with
drive= suboption. For example:
qemu [...] -drive if=none,id=drive0,format=raw \ -device virtio-blk-pci,drive=drive0,scsi=off ...
To get help on available drivers and their properties, use
-device ? and -device
driver,?.
Block devices are vital for virtual machines. In general, these are fixed or removable storage media usually referred to as 'drives'. One of the connected hard drives typically holds the guest operating system to be virtualized.
Virtual Machine drives are defined with
-drive. This option uses many suboptions, some of
which are described in this section. For their complete list, see the
manual page (man 1 qemu).
-drive Option #file=image_fname
Specifies the path to the disk image that will be used with this drive. If not specified, an empty (removable) drive is assumed.
if=drive_interface
Specifies the type of interface to which the drive is connected.
Currently only floppy, scsi,
ide, or virtio are supported by
SUSE. virtio defines a paravirtualized disk
driver. Default is ide.
index=index_of_connector
Specifies the index number of a connector on the disk interface (see
the if option) where the drive is connected. If
not specified, the index is automatically incremented.
media=type
Specifies the type of media. Can be disk for
hard disks, or cdrom for removable CD-ROM drives.
format=img_fmt
Specifies the format of the connected disk image. If not specified,
the format is autodetected. Currently, SUSE supports
qcow2, qed and
raw formats.
cache=method
Specifies the caching method for the drive. Possible values are
unsafe, writethrough,
writeback, directsync, or
none. For the qcow2 image
format, choose writeback if you care about
performance. none disables the host page cache
and, therefore, is the safest option. Default for image files is
writeback. For more information, see
Chapter 29, KVM Disk Cache Modes.
To simplify defining of block devices, QEMU understands several
shortcuts which you may find handy when entering the
qemu-system-ARCH command line.
You can use
qemu-system-ARCH -cdrom /images/cdrom.iso
instead of
qemu-system-ARCH -drive file=/images/cdrom.iso,index=2,media=cdrom
and
qemu-system-ARCH -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \ /images/image3.raw -hdd /images/image4.raw
instead of
qemu-system-ARCH -drive file=/images/image1.raw,index=0,media=disk \ -drive file=/images/image2.raw,index=1,media=disk \ -drive file=/images/image3.raw,index=2,media=disk \ -drive file=/images/image4.raw,index=3,media=disk
As an alternative to using disk images (see
Section 27.2, “Managing Disk Images with qemu-img”) you can also use
existing VM Host Server disks, connect them as drives, and access them from
VM Guest. Use the host disk device directly instead of disk image
file names.
To access the host CD-ROM drive, use
qemu-system-ARCH [...] -drive file=/dev/cdrom,media=cdrom
To access the host hard disk, use
qemu-system-ARCH [...] -drive file=/dev/hdb,media=disk
A host drive used by a VM Guest must not be accessed concurrently by the VM Host Server or another VM Guest.
A Sparse image file is a type of disk image file that grows in size as the user adds data to it, taking up only as much disk space as is stored in it. For example, if you copy 1 GB of data inside the sparse disk image, its size grows by 1 GB. If you then delete for example 500 MB of the data, the image size does not by default decrease as expected.
That is why the discard=on option is introduced on the
KVM command line. It tells the hypervisor to automatically free the
'holes' after deleting data from the sparse guest image. Note that this
option is valid only for the if=scsi drive
interface:
qemu-system-ARCH [...] -drive file=/path/to/file.img,if=scsi,discard=on
if=scsi is not supported. This interface doesn't map
to virtio-scsi, but rather to the lsi
scsi adapter.
The virtio-blk-data-plane is a new performance feature for KVM. It enables a high-performance code path for I/O requests coming from VM Guests. More specifically, this feature introduces dedicated threads (one per virtual block device) to process I/O requests going through the virtio-blk driver. It makes use of Linux AIO (asynchronous I/O interface) support in the VM Host Server Kernel directly—without the need to go through the QEMU block layer. Therefore it can sustain very high I/O rates on storage setups.
The virtio-blk-data-plane feature can be enabled or disabled by the
x-data-plane=on|off option on the
qemu command line when starting the VM Guest:
qemu [...] -drive if=none,id=drive0,cache=none,aio=native,\ format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\ config-wce=off,x-data-plane=on [...]
As of now, the virtio-blk-data-plane has the following limitations:
Only raw image format is supported.
No support for live migration.
Block jobs and hot unplug operations fail with -EBUSY.
I/O throttling limits are ignored.
Only Linux VM Host Servers are supported because of the Linux AIO usage, but non-Linux VM Guests are supported.
The virtio-blk-data-plane feature is not yet supported in SUSE Linux Enterprise Server. It is released as a technical preview only.
For better performance of I/O-intensive applications, a new I/O path was introduced for the virtio-blk interface in kernel version 3.7. This bio-based block device driver skips the I/O scheduler, and thus shortens the I/O path in guest and has lower latency. It is especially useful for high-speed storage devices, such as SSD disks.
The driver is disabled by default. To use it, do the following:
Append virtio_blk.use_bio=1 to the kernel command
line on the guest. You can do so via
› › .
You can do it also by editing /etc/default/grub,
searching for the line that contains
GRUB_CMDLINE_LINUX_DEFAULT=, and adding the kernel
parameter at the end. Then run grub2-mkconfig
>/boot/grub2/grub.cfg to update the grub2 boot menu.
Reboot the guest with the new kernel command line active.
The bio-based virtio-blk driver does not help on slow devices such as spin hard disks. The reason is that the benefit of scheduling is larger than what the shortened bio path offers. Do not use the bio-based driver on slow devices.
This section describes QEMU options affecting the type of the emulated video card and the way VM Guest graphical output is displayed.
QEMU uses -vga to define a video card used to
display VM Guest graphical output. The -vga option
understands the following values:
none
Disables video cards on VM Guest (no video card is emulated). You can still access the running VM Guest via the serial console.
std
Emulates a standard VESA 2.0 VBE video card. Use it if you intend to use high display resolution on VM Guest.
cirrus
Emulates Cirrus Logic GD5446 video card. Good choice if you insist on high compatibility of the emulated video hardware. Most operating systems (even Windows 95) recognize this type of card.
For best video performance with the cirrus type,
use 16-bit color depth both on VM Guest and VM Host Server.
The following options affect the way VM Guest graphical output is displayed.
-display gtk
Display video output in a GTK window. This interface provides drop-down menus and other UI elements to configure and control the VM during runtime.
-display sdl
Display video output via SDL (usually in a separate graphics window; see the SDL documentation for other possibilities).
-spice option[,option[,...]]
Enables the spice remote desktop protocol.
-display vnc
Refer to Section 28.5, “Viewing a VM Guest with VNC” for more information.
-nographic
Disables QEMU's graphical output. The emulated serial port is redirected to the console.
After starting the virtual machine with
-nographic, press
Ctrl–A
H in the virtual console to view the list of other
useful shortcuts, for example, to toggle between the console and the
QEMU monitor.
tux > qemu-system-ARCH -hda /images/sles_base.raw -nographic
C-a h print this help
C-a x exit emulator
C-a s save disk data back to file (if -snapshot)
C-a t toggle console timestamps
C-a b send break (magic sysrq)
C-a c switch between console and monitor
C-a C-a sends C-a
(pressed C-a c)
QEMU 2.0.0 monitor - type 'help' for more information
(qemu)-no-frame
Disables decorations for the QEMU window. Convenient for dedicated desktop workspace.
-full-screen
Starts QEMU graphical output in full screen mode.
-no-quit
Disables the 'close' button of QEMU window and prevents it from being closed by force.
-alt-grab, -ctrl-grab
By default QEMU window releases the 'captured' mouse after
Ctrl–Alt is
pressed. You can change the key combination to either
Ctrl–Alt–Shift
(-alt-grab), or Right Ctrl
(-ctrl-grab).
There are two ways to create USB devices usable by the VM Guest in
KVM: you can either emulate new USB devices inside a VM Guest, or
assign an existing host USB device to a VM Guest. To use USB devices in
QEMU you first need to enable the generic USB driver with the
-usb option. Then you can specify individual devices
with the -usbdevice option.
SUSE currently supports the following types of USB devices:
disk, host,
serial, braille,
netmouse and
tablet.
-usbdevice option #disk
Emulates a mass storage device based on file. The optional
format option is used rather than detecting the
format.
qemu-system-ARCH [...] -usbdevice
disk:format=raw:/virt/usb_disk.rawhost
Pass through the host device (identified by bus.addr).
serial
Serial converter to a host character device.
braille
Emulates a braille device using BrlAPI to display the braille output.
net
Emulates a network adapter that supports CDC Ethernet and RNDIS protocols.
mouse
Emulates a virtual USB mouse. This option overrides the default PS/2
mouse emulation. The following example shows the hardware status of
a mouse on VM Guest started with qemu-system-ARCH [...]
-usbdevice mouse:
tux > sudo hwinfo --mouse
20: USB 00.0: 10503 USB Mouse
[Created at usb.122]
UDI: /org/freedesktop/Hal/devices/usb_device_627_1_1_if0
[...]
Hardware Class: mouse
Model: "Adomax QEMU USB Mouse"
Hotplug: USB
Vendor: usb 0x0627 "Adomax Technology Co., Ltd"
Device: usb 0x0001 "QEMU USB Mouse"
[...]tablet
Emulates a pointer device that uses absolute coordinates (such as touchscreen). This option overrides the default PS/2 mouse emulation. The tablet device is useful if you are viewing VM Guest via the VNC protocol. See Section 28.5, “Viewing a VM Guest with VNC” for more information.
To assign an existing host USB device to a VM Guest, you need to find out its host bus and device ID.
tux@vmhost:~> lsusb [...] Bus 002 Device 005: ID 12d1:1406 Huawei Technologies Co., Ltd. E1750 [...]
In the above example, we want to assign a USB stick connected to the host's USB bus number 2 with device number 5. Now run the VM Guest with the following additional options:
qemu-system-ARCH [...] -usb -device usb-host,hostbus=2,hostaddr=5
After the guest is booted, check that the assigned USB device is present on it.
tux@vmguest:~> lsusb [...] Bus 001 Device 002: ID 12d1:1406 Huawei Technologies Co., Ltd. E1750 [...]
The guest operating system must take care of mounting the assigned USB device so that it is accessible for the user.
PCI Pass-Through is a technique to give your VM Guest exclusive access to a PCI device.
To make use of PCI Pass-Through, your motherboard chipset, BIOS, and CPU must have support for IOMMU (AMD) or VT-d (Intel) virtualization technology. To make sure that your computer supports this feature, ask your supplier specifically to deliver a system that supports PCI Pass-Through.
Assigning graphics cards is not supported by SUSE.
There are some factors affecting successful PCI Pass-Through that are best
handled programmatically. If you encounter problems, consider instead
relying on libvirt to manage guests that use PCI Pass-Through devices. Refer
to Section 13.7, “Adding a PCI Device with virsh” or
Section 13.6, “Adding a PCI Device with Virtual Machine Manager” for details.
Check whether IOMMU is actively
enabled and recognized on the host. Run sudo dmesg | grep -e
DMAR -e IOMMU on Intel machines, or sudo dmesg |
grep AMD-Vi on AMD machines. If you get no output, edit your
boot loader configuration and add intel_iommu=on
(Intel machines) or iommu=pt iommu=1 (AMD
machines). Then reboot the host machine. Also make sure that
IOMMU
(VT-d) has been enabled in the
BIOS/firmware.
Identify the host PCI device to assign to the guest.
tux@vmhost:~> sudo lspci -nn [...] 00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) \ HD Audio Controller [8086:284b] (rev 02) [...]
Note down the device (00:1b.0) and vendor
(8086:284b) ID.
Unbind the device from host Kernel driver and bind it to the PCI stub driver.
tux@vmhost:~> sudo modprobe pci_stub tux@vmhost:~> sudo echo "8086 284b" > /sys/bus/pci/drivers/pci-stub/new_id tux@vmhost:~> sudo echo "0000:00:1b.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind tux@vmhost:~> sudo echo "0000:00:1b.0" > /sys/bus/pci/drivers/pci-stub/bind
Now run the VM Guest with the PCI device assigned.
qemu-system-ARCH [...] -device pci-assign,host=00:1b.0
If the PCI device shares IRQ with other devices, it cannot be assigned to a VM Guest.
KVM also supports PCI device hotplugging to a VM Guest. To achieve this, you need to switch to a QEMU monitor (see Chapter 30, Administrating Virtual Machines with QEMU Monitor for more information) and issue the following commands:
hot-add:
device_add pci-assign,host=00:1b.0,id=new_pci_device
hot-remove:
device_del new_pci_device
VFIO stands for Virtual Function I/O and is a new user-level driver framework for Linux. It is meant to replace the traditional PCI device assignment. The VFIO driver exposes direct device access to userspace in a secure memory (IOMMU) protected environment.
Compared to KVM PCI device assignment, VFIO interface has the following advantages:
Resource access is compatible with secure boot.
Device is isolated and its memory access protected.
Offers user space device driver with more flexible device ownership model.
Is independent of KVM technology, and not bound to x86 architecture only.
The IOMMU (input/output memory management unit that connects a direct memory access-capable I/O bus to the main memory) API supports the notion of groups. A group is a set of devices that can be isolated from all other devices in the system. Groups are therefore the unit of ownership used by VFIO.
To find the IOMMU group for your PCI
device, you first need to identify it. Use hwinfo or
lspci to find its bus ID. Suppose you want to find an
IOMMU group for the following
device:
01:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
Run the following to find the group:
# readlink /sys/bus/pci/devices/0000:01:10.0/iommu_group ../../../../kernel/iommu_groups/15
The IOMMU group number is 15. Now you can check the devices belonging to the same IOMMU group:
ls -l /sys/bus/pci/devices/0000:01:10.0/iommu_group/devices/0000:01:10.0 [...] 0000:00:1e.0 -> ../../../../devices/pci0000:00/0000:00:1e.0 [...] 0000:01:10.0 -> ../../../../devices/pci0000:00/0000:00:1e.0/0000:01:10.0 [...] 0000:01:10.1 -> ../../../../devices/pci0000:00/0000:00:1e.0/0000:01:10.1
To assign a device to VFIO driver, follow these steps:
Unbind the device from the device driver:
# echo 0000:01:10.0 | sudo tee \ /sys/bus/pci/devices/0000:01:10.0/driver/unbind
Find the vendor and device ID of the PCI device you want to assign to VFIO:
# lspci -n -s 01:10.0 01:10.0 0200: 8086:10ca (rev 01)
Load the vfio-pci driver:
# modprobe vfio-pci
Now bind the device to the vfio-pci driver:
# echo 8086 10ca | sudo tee \ /sys/bus/pci/drivers/vfio-pci/new_id
After the assignment is done, check the vfio device belongs to IOMMU group 15:
# ls /dev/vfio 15 vfio
qemu-system-ARCH with vfio-pci #
After you assigned the PCI device to the vfio-pci
driver, you can include it in the qemu-system-ARCH
command line:
# sudo qemu-system-ARCH [...] -device vfio-pci,host=01:10.0,id=net0
You can find more detailed information on the
VFIO driver in the
/usr/src/linux/Documentation/vfio.txt file
(package kernel-source has to be installed).
You can find a useful (but slightly outdated) presentation at http://www.linux-kvm.org/wiki/images/b/b4/2012-forum-VFIO.pdf.
Use -chardev to create a new character device. The
option uses the following general syntax:
qemu-system-ARCH [...] -chardev backend_type,id=id_string
where backend_type can be one of
null, socket,
udp, msmouse,
vc, file, pipe,
console, serial,
pty, stdio,
braille, tty, or
parport. All character devices must have a unique
identification string up to 127 characters long. It is used to identify
the device in other related directives. For the complete description of
all back-end's suboptions, see the manual page (man 1
qemu). A brief description of the available
back-ends follows:
null
Creates an empty device that outputs no data and drops any data it receives.
stdio
Connects to QEMU's process standard input and standard output.
socket
Creates a two-way stream socket. If path is specified, a Unix socket is created:
qemu-system-ARCH [...] -chardev \ socket,id=unix_socket1,path=/tmp/unix_socket1,server
The server suboption specifies that the socket is a listening socket.
If port is specified, a TCP socket is created:
qemu-system-ARCH [...] -chardev \ socket,id=tcp_socket1,host=localhost,port=7777,server,nowait
The command creates a local listening (server) TCP
socket on port 7777. QEMU will not block waiting for a client to
connect to the listening port (nowait).
udp
Sends all network traffic from VM Guest to a remote host over the UDP protocol.
qemu-system-ARCH [...] -chardev udp,id=udp_fwd,host=mercury.example.com,port=7777
The command binds port 7777 on the remote host mercury.example.com and sends VM Guest network traffic there.
vc
Creates a new QEMU text console. You can optionally specify the dimensions of the virtual console:
qemu-system-ARCH [...] -chardev vc,id=vc1,width=640,height=480 -mon chardev=vc1
The command creates a new virtual console called
vc1 of the specified size, and connects the QEMU
monitor to it.
file
Logs all traffic from VM Guest to a file on VM Host Server. The
path is required and will be created if it does
not exist.
qemu-system-ARCH [...] -chardev file,id=qemu_log1,path=/var/log/qemu/guest1.log
By default QEMU creates a set of character devices for serial and parallel ports, and a special console for QEMU monitor. You can, however, create your own character devices and use them for the just mentioned purposes. The following options will help you:
-serial char_dev
Redirects the VM Guest's virtual serial port to a character device
char_dev on VM Host Server. By default, it is a
virtual console (vc) in graphical mode, and
stdio in non-graphical mode. The
-serial understands many suboptions. See the
manual page man 1 qemu for a complete list of them.
You can emulate up to 4 serial ports. Use -serial
none to disable all serial ports.
-parallel device
Redirects the VM Guest's parallel port to a
device. This option supports the same
devices as -serial.
With SUSE Linux Enterprise Server as a VM Host Server, you can directly use the hardware parallel
port devices /dev/parportN where
N is the number of the port.
You can emulate up to 3 parallel ports. Use -parallel
none to disable all parallel ports.
-monitor char_dev
Redirects the QEMU monitor to a character device
char_dev on VM Host Server. This option supports
the same devices as -serial. By default, it is a
virtual console (vc) in a graphical mode, and
stdio in non-graphical mode.
For a complete list of available character devices back-ends, see the
man page (man 1 qemu).
Use the -net option to define a network interface and
a specific type of networking for your VM Guest. Currently, SUSE
supports the following options: none,
nic, user,
bridge, and tap. For a complete
list of -net suboptions, see the manual page
(man 1 qemu).
-net Suboptions #bridge
Uses a specified network helper to configure the TAP interface and attach it to a specified bridge. For more information, see Section 28.4.3, “Bridged Networking”.
nic
Creates a new Network Interface Card (NIC) and connects it to a specified Virtual Local Area Network (VLAN). For more information, see Section 28.4.1, “Defining a Network Interface Card”.
user
Specifies user-mode networking. For more information, see Section 28.4.2, “User-Mode Networking”.
tap
Specifies bridged or routed networking. For more information, see Section 28.4.3, “Bridged Networking”.
Use -net nic to add a new emulated network card:
qemu-system-ARCH [...] -net nic,vlan=11,macaddr=00:16:35:AF:94:4B2,\ model=virtio3,name=ncard14 -net user
Connects the network interface to VLAN number 1. You can specify your own number,—it is mainly useful for identification purpose. If you omit this suboption, QEMU uses the default 0. | |
Specifies the Media Access Control (MAC) address for the network card. It is a unique identifier and you are advised to always specify it. If not, QEMU supplies its own default MAC address and creates a possible MAC address conflict within the related VLAN. | |
Specifies the model of the network card. Use
Currently, SUSE supports the models |
The -net user option instructs QEMU to use
user-mode networking. This is the default if no networking mode is
selected. Therefore, these command lines are equivalent:
qemu-system-ARCH -hda /images/sles_base.raw
qemu-system-ARCH -hda /images/sles_base.raw -net nic -net user
This mode is useful if you want to allow the VM Guest to access the external network resources, such as the Internet. By default, no incoming traffic is permitted and therefore, the VM Guest is not visible to other machines on the network. No administrator privileges are required in this networking mode. The user-mode is also useful for doing a 'network-booting' on your VM Guest from a local directory on VM Host Server.
The VM Guest allocates an IP address from a virtual DHCP server.
VM Host Server (the DHCP server) is reachable at 10.0.2.2, while the IP
address range for allocation starts from 10.0.2.15. You can use
ssh to connect to VM Host Server at 10.0.2.2, and
scp to copy files back and forth.
This section shows several examples on how to set up user-mode networking with QEMU.
qemu-system-ARCH [...] -net user1,vlan=12,name=user_net13,restrict=yes4
Specifies user-mode networking. | |
Connects to VLAN number 1. If omitted, defaults to 0. | |
Specifies a human-readable name of the network stack. Useful when identifying it in the QEMU monitor. | |
Isolates VM Guest. It will not be able to communicate with VM Host Server and no network packets will be routed to the external network. |
qemu-system-ARCH [...] -net user,net=10.2.0.0/81,host=10.2.0.62,dhcpstart=10.2.0.203,\ hostname=tux_kvm_guest4
Specifies the IP address of the network that VM Guest sees and optionally the netmask. Default is 10.0.2.0/8. | |
Specifies the VM Host Server IP address that VM Guest sees. Default is 10.0.2.2. | |
Specifies the first of the 16 IP addresses that the built-in DHCP server can assign to VM Guest. Default is 10.0.2.15. | |
Specifies the host name that the built-in DHCP server will assign to VM Guest. |
qemu-system-ARCH [...] -net user,tftp=/images/tftp_dir1,bootfile=/images/boot/pxelinux.02
Activates a built-in TFTP (a file transfer protocol with the functionality of a very basic FTP) server. The files in the specified directory will be visible to a VM Guest as the root of a TFTP server. | |
Broadcasts the specified file as a BOOTP (a network protocol that
offers an IP address and a network location of a boot image, often
used in diskless workstations) file. When used together with
|
qemu-system-ARCH [...] -net user,hostfwd=tcp::2222-:22
Forwards incoming TCP connections to the port 2222 on the host to the
port 22 (SSH) on VM Guest.
If sshd is running on
VM Guest, enter
ssh qemu_host -p 2222
where qemu_host is the host name or IP address of
the host system, to get a SSH
prompt from VM Guest.
With the -net tap option, QEMU creates a network
bridge by connecting the host TAP network device to a specified VLAN of
VM Guest. Its network interface is then visible to the rest of the
network. This method does not work by default and has to be explicitly
specified.
First, create a network bridge and add a VM Host Server physical network
interface (usually eth0) to it:
Start and select › .
Click and select from the drop-down list in the window. Click .
Choose whether you need a dynamically or statically assigned IP address, and fill the related network settings if applicable.
In the pane, select the Ethernet device to add to the bridge.
Click . When asked about adapting an already configured device, click .
Click to apply the changes. Check if the bridge is created:
tux > brctl show
bridge name bridge id STP enabled interfaces
br0 8000.001676d670e4 no eth0
Use the following example script to connect VM Guest to the newly
created bridge interface br0. Several commands in
the script are run via the sudo mechanism because
they require root privileges.
Make sure the tunctl and
bridge-utils packages are installed on the
VM Host Server. If not, install them with zypper in tunctl
bridge-utils.
#!/bin/bash bridge=br01 tap=$(sudo tunctl -u $(whoami) -b)2 sudo ip link set $tap up3 sleep 1s4 sudo brctl addif $bridge $tap5 qemu-system-ARCH -machine accel=kvm -m 512 -hda /images/sles_base.raw \ -net nic,vlan=0,model=virtio,macaddr=00:16:35:AF:94:4B \ -net tap,vlan=0,ifname=$tap6,script=no7,downscript=no sudo brctl delif $bridge $tap8 sudo ip link set $tap down9 sudo tunctl -d $tap10
Name of the bridge device. | |
Prepare a new TAP device and assign it to the user who runs the script. TAP devices are virtual network devices often used for virtualization and emulation setups. | |
Bring up the newly created TAP network interface. | |
Make a 1-second pause to make sure the new TAP network interface is really up. | |
Add the new | |
The | |
Before | |
Deletes the TAP interface from a network bridge
| |
Sets the state of the TAP device to 'down'. | |
Deconfigures the TAP device. |
Another way to connect VM Guest to a network through a network bridge
is by means of the qemu-bridge-helper helper
program. It configures the TAP interface for you, and attaches it to
the specified bridge. The default helper executable is
/usr/lib/qemu-bridge-helper. The helper
executable is setuid root, which is only executable by the members of
the virtualization group (kvm). Therefore the
qemu-system-ARCH command itself does not have to be
run under root privileges.
You can call the helper the following way:
qemu-system-ARCH [...] -net nic,vlan=0,model=virtio -net bridge,vlan=0,br=br0
You can specify your own custom helper script that will take care of
the TAP device (de)configuration, with the
helper=/path/to/your/helper option:
qemu-system-ARCH [...] -net bridge,vlan=0,br=br1,helper=/path/to/bridge-helper
To define access privileges to qemu-bridge-helper,
inspect the /etc/qemu/bridge.conf
file. For example the following directive
allow br0
allows the qemu-system-ARCH command to connect its
VM Guest to the network bridge br0.
vhost-net #
The vhost-net module is used to accelerate
KVM's paravirtualized network drivers. It provides better latency and
greater throughput for network.
To make use of the module, verify that the host's running Kernel has
CONFIG_VHOST_NET turned on or enabled as a module:
grep CONFIG_VHOST_NET /boot/config-`uname -r`
Also verify that the guest's running Kernel has
CONFIG_PCI_MSI enabled:
grep CONFIG_PCI_MSI /boot/config-`uname -r`
If both conditions are met, use the vhost-net driver
by starting the guest with the following example command line:
qemu-system-ARCH [...] -netdev tap,id=guest0,vhost=on,script=no -net nic,model=virtio,netdev=guest0,macaddr=00:16:35:AF:94:4B
Note that guest0 is an identification string of the
vhost-driven device.
As the number of virtual CPUs increases in VM Guests, QEMU offers a way of improving the network performance using multiqueue. Multiqueue virtio-net scales the network performance by allowing VM Guest virtual CPUs to transfer packets in parallel. Multiqueue support is required on both VM Host Server and VM Guest side.
The Multiqueue virtio-net solution is most beneficial in the following cases:
Network traffic packets are large.
VM Guest has more connections active at the same time, mainly between the guest systems, or between the guest and the host, or between the guest and an external system.
The number of active queues is equal to the number of virtual CPUs in the VM Guest.
While multiqueue virtio-net increases the total network throughput, it increases CPU consumption as it makes use of the virtual CPU's power.
The following procedure lists important steps to enable the multiqueue
feature with qemu-system-ARCH. It assumes that a tap
network device with multiqueue capability (supported since kernel
version 3.8) is set up on the VM Host Server.
In qemu-system-ARCH, enable multiqueue for the tap
device:
-netdev tap,vhost=on,queues=N
where N stands for the number of queue pairs.
In qemu-system-ARCH, enable multiqueue and specify
MSI-X (Message Signaled Interrupt) vectors for the virtio-net-pci
device:
-device virtio-net-pci,mq=on,vectors=2*N+2
where the formula for the number of MSI-X vectors results from: N vectors for TX (transmit) queues, N for RX (receive) queues, one for configuration purposes, and one for possible VQ (vector quantization) control.
In VM Guest, enable multiqueue on the relevant network interface
(eth0 in this example):
ethtool -L eth0 combined 2*N
The resulting qemu-system-ARCH command line will look
similar to the following example:
qemu-system-ARCH [...] -netdev tap,id=guest0,queues=4,vhost=on \ -device virtio-net-pci,netdev=guest0,mq=on,vectors=10
Note that the id of the network device
(guest0 ) needs to be identical for both options.
Inside the running VM Guest, specify the following command as root:
ethtool -L eth0 combined 8
Now the guest system networking makes use of the multiqueue support from
the qemu-system-ARCH hypervisor.
By default QEMU uses a GTK (a cross-platform toolkit library) window to
display the graphical output of a VM Guest.
With the -vnc option specified, you can make QEMU
listen on a specified VNC display and redirect its graphical output to
the VNC session.
When working with QEMU's virtual machine via VNC session, it is useful
to work with the -usbdevice tablet option.
Moreover, if you need to use another keyboard layout than the default
en-us, specify it with the -k
option.
The first suboption of -vnc must be a
display value. The -vnc option
understands the following display specifications:
host:display
Only connections from host on the display number
display will be accepted. The TCP port on which the
VNC session is then running is normally a 5900 +
display number. If you do not specify
host, connections will be accepted from any host.
unix:path
The VNC server listens for connections on Unix domain sockets. The
path option specifies the location of the related
Unix socket.
none
The VNC server functionality is initialized, but the server itself is not started. You can start the VNC server later with the QEMU monitor. For more information, see Chapter 30, Administrating Virtual Machines with QEMU Monitor.
Following the display value there may be one or more option flags separated by commas. Valid options are:
reverse
Connect to a listening VNC client via a reverse connection.
websocket
Opens an additional TCP listening port dedicated to VNC Websocket connections. By definition the Websocket port is 5700+display.
password
Require that password-based authentication is used for client connections.
tls
Require that clients use TLS when communicating with the VNC server.
x509=/path/to/certificate/dir
Valid if TLS is specified. Require that x509 credentials are used for negotiating the TLS session.
x509verify=/path/to/certificate/dir
Valid if TLS is specified. Require that x509 credentials are used for negotiating the TLS session.
sasl
Require that the client uses SASL to authenticate with the VNC server.
acl
Turn on access control lists for checking of the x509 client certificate and SASL party.
lossy
Enable lossy compression methods (gradient, JPEG, ...).
non-adaptive
Disable adaptive encodings. Adaptive encodings are enabled by default.
share=[allow-exclusive|force-shared|ignore]
Set display sharing policy.
For more details about the display options, see the qemu-doc man page.
An example VNC usage:
tux >qemu-system-ARCH [...] -vnc :5 (on the client:)wilber >:~> vinagre venus:5905 &
The default VNC server setup does not use any form of authentication. In the previous example, any user can connect and view the QEMU VNC session from any host on the network.
There are several levels of security that you can apply to your VNC client/server connection. You can either protect your connection with a password, use x509 certificates, use SASL authentication, or even combine some of these authentication methods in one QEMU command.
See Section B.2, “Generating x509 Client/Server Certificates” for more information about
the x509 certificates generation. For more information about configuring
x509 certificates on a VM Host Server and the client, see
Section 11.3.2, “Remote TLS/SSL Connection with x509 Certificate (qemu+tls or xen+tls)” and
Section 11.3.2.3, “Configuring the Client and Testing the Setup”.
The Vinagre VNC viewer supports advanced authentication mechanisms.
Therefore, it will be used to view the graphical output of VM Guest in
the following examples. For this example, let us assume that the server
x509 certificates ca-cert.pem,
server-cert.pem, and
server-key.pem are located in the
/etc/pki/qemu directory on the host, while the
client's certificates are distributed in the following locations on the
client:
/etc/pki/CA/cacert.pem
|
/etc/pki/libvirt-vnc/clientcert.pem
|
/etc/pki/libvirt-vnc/private/clientkey.pem
|
qemu-system-ARCH [...] -vnc :5,password -monitor stdio
Starts the VM Guest graphical output on VNC display number 5 (usually
port 5905). The password suboption initializes a
simple password-based authentication method. There is no password set
by default and you have to set one with the change vnc
password command in QEMU monitor:
QEMU 2.0.0 monitor - type 'help' for more information (qemu) change vnc password Password: ****
You need the -monitor stdio option here, because you
would not be able to manage the QEMU monitor without redirecting its
input/output.
The QEMU VNC server can use TLS encryption for the session and x509 certificates for authentication. The server asks the client for a certificate and validates it against the CA certificate. Use this authentication type if your company provides an internal certificate authority.
qemu-system-ARCH [...] -vnc :5,tls,x509verify=/etc/pki/qemu
You can combine the password authentication with TLS encryption and x509 certificate authentication to create a two-layer authentication model for clients. Remember to set the password in the QEMU monitor after you run the following command:
qemu-system-ARCH [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu -monitor stdio
Simple Authentication and Security Layer (SASL) is a framework for authentication and data security in Internet protocols. It integrates several authentication mechanisms, like PAM, Kerberos, LDAP and more. SASL keeps its own user database, so the connecting user accounts do not need to exist on VM Host Server.
For security reasons, you are advised to combine SASL authentication with TLS encryption and x509 certificates:
qemu-system-ARCH [...] -vnc :5,tls,x509,sasl -monitor stdio
VM Guests usually run in a separate computing space—they are provided their own memory range, dedicated CPUs, and file system space. The ability to share parts of the VM Host Server's file system makes the virtualization environment more flexible by simplifying mutual data exchange. Network file systems, such as CIFS and NFS, have been the traditional way of sharing folders. But as they are not specifically designed for virtualization purposes, they suffer from major performance and feature issues.
KVM introduces a new optimized method called VirtFS (sometimes referred to as a “file system pass-through”). VirtFS uses a paravirtual file system driver, which avoids converting the guest application file system operations into block device operations, and then again into host file system operations.
You typically use VirtFS for the following situations:
To access a shared folder from several guests, or to provide guest-to-guest file system access.
To replace the virtual disk as the root file system to which the guest's ramdisk connects during the guest boot process.
To provide storage services to different customers from a single host file system in a cloud environment.
In QEMU, the implementation of VirtFS is facilitated by defining two types of devices:
virtio-9p-pci device which transports protocol
messages and data between the host and the guest.
fsdev device which defines the export file system
properties, such as file system type and security model.
qemu-system-ARCH [...] -fsdev local,id=exp11,path=/tmp/2,security_model=mapped3 -device virtio-9p-pci,fsdev=exp14,mount_tag=v_tmp5
Identification of the file system to be exported. | |
File system path on the host to be exported. | |
Security model to be used— | |
The exported file system ID defined before with | |
Mount tag used later on the guest to mount the exported file system. |
Such an exported file system can be mounted on the guest like this
sudo mount -t 9p -o trans=virtio v_tmp /mnt
where v_tmp is the mount tag defined earlier with
-device mount_tag= and /mnt is
the mount point where you want to mount the exported file system.
Kernel SamePage Merging (KSM) is a Linux Kernel feature that merges identical memory pages from multiple running processes into one memory region. Because KVM guests run as processes under Linux, KSM provides the memory overcommit feature to hypervisors for more efficient use of memory. Therefore, if you need to run multiple virtual machines on a host with limited memory, KSM may be helpful to you.
For more information on the meaning of the
/sys/kernel/mm/ksm/* files, see
/usr/src/linux/Documentation/vm/ksm.txt (package
kernel-source).