Difference between revisions of "Libvirt"

From ArchWiki
Jump to: navigation, search
(Installing: added Package Official and Package AUR formatting; updated to better comply with new style guide; added a wiki link)
m (Installing: minor formatting fix)
Line 7: Line 7:
For servers you need the following packages from the Arch repositories: {{Package Official|libvirt}} {{Package Official|urlgrabber}} {{Package Official|qemu-kvm}} {{Package Official|dnsmasq}} {{Package Official|bridge-utils}}}
For servers you need the following packages from the Arch repositories: {{Package Official|libvirt}} {{Package Official|urlgrabber}} {{Package Official|qemu-kvm}} {{Package Official|dnsmasq}} {{Package Official|bridge-utils}}
For GUI management tools, you also need all of the following from the Arch Linux repositories: {{Package Official|virtviewer}} {{Package Official|virtinst}} {{Package Official|virt-manager}}
For GUI management tools, you also need all of the following from the Arch Linux repositories: {{Package Official|virtviewer}} {{Package Official|virtinst}} {{Package Official|virt-manager}}

Revision as of 19:53, 25 October 2011

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.

Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어

External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

libvirt is an abstraction layer and a daemon for managing virtual machines -- remote or locally, using multiple virtualization backends (QEMU/KVM, VirtualBox, Xen, etc).

This entry doesn't try to cover everything about libvirt, just the things that were not intuitive at first or not well documented.


For servers you need the following packages from the Arch repositories: Template:Package Official Template:Package Official Template:Package Official Template:Package Official Template:Package Official

For GUI management tools, you also need all of the following from the Arch Linux repositories: Template:Package Official Template:Package Official Template:Package Official

Building libvirt for Xen

The PKGBUILD for Template:Package AUR in the repositories currently disables Xen with the Template:Codeline flag during the make process. If you want to use libvirt for managing Xen, you will need grab the whole fileset to re-enable it. Furthermore, you need to make sure you have Template:Package AUR installed.

The alternative XenAPI driver is lacking a package atm?? (23.5.2010, friesoft)


Run daemon

Start the libvirtd daemon and add libvirtd to your DAEMONS array so it starts automatically on boot.

Seems that you have to start dbus and avahi-daemon before starting libvirtd.

Polkit authentication

To allow yourself to manage VMs as non-root, run this on the server:


Note: As Template:Codeline is deprecated, you have to create the following file.


Try to re-login if it doesn't work right away.

Alternatively you can only grant the monitoring rights with Template:Codeline

If logging in through ssh you will need to make sure ConsoleKit is used. Place the following in Template:Filename:


Unix File-based Permissions

Note: This is an alternative to Polkit authentication.

If you wish to use unix file-based permissions to allow some non-root users to use Template:Codeline, you can modify the config files.

First you will need to create the libvirt group and add any users you want to have access to libvirt to that group.

Template:Cli Template:Cli

Any users that are currently logged in will need to log out and back in to update their groups. Alternately the user can use the following command in the shell they will be launching libvirt from to update the group:


Then you can either enable permissions-based access by uncommenting the following line on the PKGBUILD for libvirt before running makepkg:

#  patch -Np1 -i "$srcdir"/unixperms.patch || return 1

Alternatively, you can make the changes to your permissions and config files by hand. Uncomment the following lines in Template:Filename (they are not all in the same location in the file):


Note: You may also wish to change unix_sock_ro_perms from "0777" to "0770" to disallow read-only access to people who are not members of the libvirt group.

Enable KVM acceleration for QEMU

Note: KVM will conflict with VirtualBox. You cannot use KVM and VirtualBox at the same time.

Running virtual machines with the usual QEMU emulation, without KVM, will be painfully slow. You definitely want to enable KVM support if your CPU supports it. To find out, run the following:

egrep '^flags.*(vmx|svm)' /proc/cpuinfo

To enable KVM, you need to load the Template:Codeline or Template:Codeline kernel module depending on your CPU. Run modprobe:


Usually you would also add it to the Template:Codeline line in "Template:Filename" Template:File

If KVM is not working, you will find the following message in your "Template:Filename" Template:File

More info is available from the official KVM FAQ


Installing a new VM

To create a new VM, you need some sort of installation media, which is usually a plain Template:Codeline file. Copy it to the "Template:Codeline" directory (alternatively you can create a new storage pool directory in virt-manager and copy it there)

Then run virt-manager, connect to the server, right click on the connection and choose New. Choose a name, and select Local install media. Just continue with the wizard.

On the 4th step, you may want to uncheck Allocate entire disk now -- this way you will save space when your VM isn't using all of its disk. However, this can cause increased fragmentation of the disk.

On the 5th step, open Advanced options and make sure that Virt Type is set to kvm. If the kvm choice is not available, see section Enable KVM acceleration for QEMU above.

Creating a storage pool in virt-manager

First, connect to an existing server. Once you're there, right click and choose Details. Go to Storage and press the + icon at the lower left. Then just follow the wizard. :)

Using VirtualBox with virt-manager

Note: VirtualBox support in libvirt is not quite stable yet and may cause your libvirtd to crash. Usually this is harmless and everything will be back once you restart the daemon.

virt-manager does not let you to add any VirtualBox connections from the GUI. However, you can launch it from the command line:

virt-manager -c vbox:///system

Or if you want to manage a remote system over SSH:

virt-manager -c vbox+ssh://username@host/system

Remote access to libvirt

Using unencrypted TCP/IP socket (most simple, least secure)

Note: Only for testing or use over a trusted network

Edit Template:Filename: Template:File

Warning: We do not enable SASL here, all TCP traffic is cleartext! For real world use, always enable SASL.

It is also necessary to start the server in listening mode by editing Template:Filename Template:File

Using SSH

The Template:Codeline utility is needed for remote management over SSH Template:Cli

To connect to the remote system using Template:Codeline: Template:Cli

If something goes wrong, you can get some logs using:

$ LIBVIRT_DEBUG=1 virsh -c qemu+ssh://username@host/system

To display the graphical console for a virtual machine: Template:Cli

To display the virtual machine desktop management tool: Template:Cli

Using Python

The Template:Codeline package comes with a python2 api in Template:Filename

General examples are given in Template:Filename

Unofficial example using Template:Codeline and Template:Codeline:

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import sys
import libvirt
if (__name__ == "__main__"):
   conn = libvirt.open("qemu+ssh://xxx/system")
   print "Trying to find node on xxx"
   domains = conn.listDomainsID()
   for domainID in domains:
       domConnect = conn.lookupByID(domainID)
       if domConnect.name() == 'xxx-node':
           print "Found shared node on xxx with ID " + str(domainID)
           domServ = domConnect

Bridge Networking

To use phisical ethernet from your virtual machines you have to create a bridge with your phisical ethernet (here eth0).

Host configuration

Llibvirt creates the bridge virbr0 for NAT networking so use another name such as virbr1. You have to create a new Network Profile to configure the bridge, for example (with DHCP configuration):


Guest configuration

Now we have to activate the bridge interface in our VMs. If have a recent Linux machine we can use this code in the .xml file:

 <interface type='bridge'>
   <source bridge='virbr1'/>
   <mac address='24:42:53:21:52:49'/>
   <model type='virtio' />

This code activates a virtio device on the machine so, in Windows you will have to install an additional driver (you can find it here Windows KVM VirtIO drivers) or remove the line <model type='virtio' />:

 <interface type='bridge'>
   <source bridge='virbr1'/>
   <mac address='24:42:53:21:52:49'/>