Виртуализация при помощи KVM


Предыдущая | Следующая

Установка виртуализации

 

Настройка виртуализации

mkdir /mnt/d4/kvm1
sudo virsh pool-define-as storage dir - - - - "mkdir /mnt/d4/kvm1"

sudo virsh pool-list --all

sudo virsh pool-build storage1
sudo virsh pool-start storage1
sudo virsh pool-autostart storage1

sudo virsh pool-list --all

sudo virsh pool-info storage1

virt-install \
-n deb10 \
-r 1024 \
--vcpus=2 \
-c /mnt/d4/d10.iso \
--disk pool=storage1,size=20,bus=virtio,format=qcow2,cache=writeback \
--graphics vnc,listen=0.0.0.0

dev-python/twisted net-im/pyicq

man Virsh

Группы команд:

 Domain Management (ключевое слово «domain»):
    attach-device                  подключить устройство из файла XML
    attach-disk                    подключить дисковое устройство
    attach-interface               подключить сетевой интерфейс
    autostart                      автоматический запуск домена
    blkdeviotune                   Указать или проверить параметры ввода-вывода блочного устройства.
    blkiotune                      Просмотр и изменение параметров blkio
    blockcommit                    Начинает запись изменений на блочном уровне.
    blockcopy                      Начать операцию блочного копирования.
    blockjob                       Управление активными операциями с блоками
    blockpull                      Заполнить диск данными из резервного образа.
    blockresize                    Изменить размер блочного устройства домена.
    change-media                   сменить носитель в CD-приводе или дисководе
    console                        подключиться к консоли гостевой системы
    cpu-stats                      показать статистику процессоров домена
    create                         создать домен на основании файла XML
    define                         определить (но не запускать) домен на основании данных в файле XML
    desc                           показать или изменить заголовок и описание домена
    destroy                        немедленно остановить (разрушить) домен
    detach-device                  отключить устройство из файла XML
    detach-device-alias            отсоединить устройство по альтернативному названию
    detach-disk                    отключить дисковое устройство
    detach-interface               отключить сетевой интерфейс
    domdisplay                     URI подключения к дисплею домена
    domfsfreeze                    Заморозить смонтированные файловые системы домена.
    domfsthaw                      Разморозить смонтированные файловые системы домена.
    domfsinfo                      Получить информацию о смонтированных файловых системах домена.
    domfstrim                      Вызвать fstrim на смонтированных файловых системах домена.
    domhostname                    вывести имя узла домена
    domid                          преобразовать имя домена или UUID в ID домена
    domif-setlink                  указать состояние связи виртуального интерфейса
    domiftune                      получить или изменить параметры виртуального интерфейса
    domjobabort                    прервать активное задание домена
    domjobinfo                     информация о заданиях домена
    domname                        преобразовать ID домена или UUID в имя домена
    domrename                      переименовать домен
    dompmsuspend                   перевести домен в спящий режим, уменьшив его энергопотребление
    dompmwakeup                    вывести домен из спящего режима с пониженным энергопотреблением
    domuuid                        преобразовать имя домена или ID в UUID домена
    domxml-from-native             Преобразовать конфигурацию в XML
    domxml-to-native               Преобразовать XML домена в собственную конфигурацию
    dump                           сохранить дамп памяти домена в файл для анализа
    dumpxml                        описание домена в XML
    edit                           редактировать XML-конфигурацию домена
    event                          События доменов
    get-user-sshkeys               list authorized SSH keys for given user (via agent)
    inject-nmi                     вызвать немаскируемое прерывание для гостевого домена
    iothreadinfo                   вывести список потоков ввода-вывода домена
    iothreadpin                    управление привязкой потоков ввода-вывода домена
    iothreadadd                    добавить поток ввода-вывода в гостевой домен
    iothreadset                    изменяет существующий поток ввода-вывода гостевого домена
    iothreaddel                    удалить поток ввода-вывода из гостевого домена
    send-key                       Отправить последовательность клавиш гостевой системе
    send-process-signal            отправить процессам сигналы
    lxc-enter-namespace            Пространство имён входа гостевой системы LXC
    managedsave                    сохранённое состояние домена
    managedsave-remove             удалить сохранённое состояние домена
    managedsave-edit               редактировать XML файла управляемого сохранения состояния домена
    managedsave-dumpxml            Данные домена файла XML управляемого сохранения состояния
    managedsave-define             переопределить XML для файла управляемого сохранения состояния домена
    memtune                        Просмотр и изменение параметров памяти
    perf                           Просмотр и изменение события perf
    metadata                       показать или изменить метаданные в XML домена
    migrate                        миграция домена на другой узел
    migrate-setmaxdowntime         выбрать максимально допустимое время простоя
    migrate-getmaxdowntime         получить максимально допустимое время простоя
    migrate-compcache              получить/указать размер кэша сжатия
    migrate-setspeed               Указать максимальную пропускную способность миграции
    migrate-getspeed               Получить максимальную пропускную способность миграции
    migrate-postcopy               Переключить запущенную миграцию с пред-копирования на пост-копирование
    numatune                       просмотр и изменение параметров NUMA
    qemu-attach                    Добавление QEMU
    qemu-monitor-command           Команда монитора QEMU
    qemu-monitor-event             События монитора QEMU
    qemu-agent-command             Команда агента гостевой системы QEMU
    guest-agent-timeout            Указать время ожидания данных от агента гостевой системы
    reboot                         перезагрузить домен
    reset                          сбросить состояние домена
    restore                        восстановить домен из сохранённого состояния
    resume                         возобновить работу домена
    save                           сохранить состояние домена в файл
    save-image-define              переопределить файл XML состояния домена
    save-image-dumpxml             описание сохранённого состояния домена в формате XML
    save-image-edit                редактировать XML файла сохранения состояния домена
    schedinfo                      показать или изменить параметры планировщика
    screenshot                     сделать снимок текущей консоли домена и сохранить его в файл
    set-lifecycle-action           изменить действия жизненного цикла
    set-user-sshkeys               manipulate authorized SSH keys file for given user (via agent)
    set-user-password              указать пароль пользователя в домене
    setmaxmem                      изменить максимальное ограничение памяти
    setmem                         изменить размер выделенной памяти
    setvcpus                       изменить количество виртуальных процессоров
    shutdown                       безопасно завершить работу домена
    start                          запустить неактивный домен (определение должно быть создано заранее)
    suspend                        приостановить домен
    ttyconsole                     консоль TTY
    undefine                       удалить определение домена
    update-device                  обновить устройство в соответствии с файлом XML
    vcpucount                      количество виртуальных процессоров в домене
    vcpuinfo                       подробная информация о виртуальных процессорах домена
    vcpupin                        создать соответствие между виртуальными и физическими процессорами или проверить текущие соответствия
    emulatorpin                    привязать домен к физическими процессорам или проверить текущие соответствия
    vncdisplay                     дисплей VNC
    guestvcpus                     запросить или изменить состояние виртуального процессора в гостевой системе (с помощью агента)
    setvcpu                        подключить виртуальные процессоры или группы потоков или отсоединить их
    domblkthreshold                установить пороговое значение для события «block-threshold» для заданногоблочного устройства или его элемента резервной цепочки
    guestinfo                      запросить информацию о гостевой системе (с помощью агента)

 Domain Monitoring (ключевое слово «monitor»):
    domblkerror                    Показать ошибки блочных устройств
    domblkinfo                     информация о размере блочных устройств домена
    domblklist                     список блочных устройств домена
    domblkstat                     получить статистику блочного устройства домена
    domcontrol                     состояние интерфейса управления доменом
    domif-getlink                  получить состояние связи виртуального интерфейса
    domifaddr                      Получить адреса сетевых интерфейсов для работающего домена
    domiflist                      список виртуальных интерфейсов домена
    domifstat                      получить статистику сетевого интерфейса домена
    dominfo                        информация о домене
    dommemstat                     получить статистику памяти домена
    domstate                       состояние домена
    domstats                       получение статистики доменов
    domtime                        время домена
    list                           список доменов

 Host and Hypervisor (ключевое слово «host»):
    allocpages                     Управление размером пула страниц
    capabilities                   возможности виртуализации
    cpu-baseline                   создать шаблон общих характеристик процессоров
    cpu-compare                    сравнить описание процессора в файле XML с процессором хоста
    cpu-models                     Модели процессоров
    domcapabilities                возможности домена
    freecell                       свободная память NUMA
    freepages                      свободные страницы NUMA
    hostname                       вывести имя узла гипервизора
    hypervisor-cpu-baseline        создать шаблон процессора для использования указанным гипервизором
    hypervisor-cpu-compare         сравнить процессор с процессором, созданным гипервизором в основной системе
    maxvcpus                       максимальное число виртуальных процессоров
    node-memory-tune               Просмотр и изменение параметров памяти узла
    nodecpumap                     карта процессоров узла
    nodecpustats                   возвращает статистику процессоров узла.
    nodeinfo                       информация об узле
    nodememstats                   Возвращает статистику памяти узла.
    nodesuspend                    приостановить работу хоста на определенный промежуток времени
    sysinfo                        вывести sysinfo гипервизора
    uri                            вывести канонический URI гипервизора
    version                        показать версию

 Checkpoint (ключевое слово «checkpoint»):
    checkpoint-create              Создать контрольную точку на основе XML
    checkpoint-create-as           Создать контрольную точку на основе набора аргументов
    checkpoint-delete              Удалить контрольную точку домена
    checkpoint-dumpxml             XML-дамп для контрольной точки домена
    checkpoint-edit                редактировать XML контрольной точки
    checkpoint-info                информация о контрольной точке
    checkpoint-list                Список контрольных точек домена
    checkpoint-parent              Получить имя родительского элемента контрольной точки

 Interface (ключевое слово «interface»):
    iface-begin                    создать снимок текущих параметров интерфейсов, который можно будет сохранить (iface-commit) или восстановить (iface-rollback)
    iface-bridge                   создать мост и подключить к нему существующее сетевое устройство
    iface-commit                   применить изменения, сделанные с iface-begin, и освободить точку восстановления
    iface-define                   определить неактивный постоянный интерфейс физической основной системы или изменить существующий постоянный интерфейс на основе XML-файла
    iface-destroy                  разрушить интерфейс физической основной системы (отключение / "if-down")
    iface-dumpxml                  описание интерфейса в XML
    iface-edit                     редактировать XML-конфигурацию интерфейса физической основной системы
    iface-list                     список интерфейсов физической основной системы
    iface-mac                      преобразовать имя интерфейса в MAC-адрес
    iface-name                     преобразовать MAC-адрес интерфейса в имя
    iface-rollback                 откат к предыдущей версии конфигурации, созданной при помощи iface-begin
    iface-start                    запустить интерфейс физической основной системы (активация: / "if-up")
    iface-unbridge                 отменить определение устройства моста после отсоединения его устройства/устройств
    iface-undefine                 удалить определение интерфейса физической основной системы (удалить его из конфигурации)

 Network Filter (ключевое слово «filter»):
    nwfilter-define                создать или обновить сетевой фильтр на основе файла XML
    nwfilter-dumpxml               описание сетевого фильтра в XML
    nwfilter-edit                  редактировать XML-конфигурацию сетевого фильтра
    nwfilter-list                  список сетевых фильтров
    nwfilter-undefine              удалить определение сетевого фильтра
    nwfilter-binding-create        создать привязку сетевого фильтра из файла XML
    nwfilter-binding-delete        удалить привязку сетевого фильтра
    nwfilter-binding-dumpxml       описание сетевого фильтра в XML
    nwfilter-binding-list          список привязок сетевых фильтров

 Networking (ключевое слово «network»):
    net-autostart                  автозапуск сети
    net-create                     создать сеть из файла XML
    net-define                     определить неактивную постоянную виртуальную сеть или изменить существующую постоянную виртуальную сеть на основе файла XML
    net-destroy                    разрушить (остановить) сеть
    net-dhcp-leases                вывести данные аренды для указанной сети
    net-dumpxml                    описание сети в XML
    net-edit                       редактировать XML-конфигурацию сети
    net-event                      Сетевые события
    net-info                       сетевая информация
    net-list                       список сетей
    net-name                       преобразовать UUID сети в имя сети
    net-start                      запустить заранее определенную неактивную сеть
    net-undefine                   удалить постоянное описание сети
    net-update                     обновить части существующей конфигурации сети
    net-uuid                       преобразовать имя сети в UUID
    net-port-list                  список сетевых портов
    net-port-create                создать сетевой порт из файла XML
    net-port-dumpxml               XML-описание сетевого порта
    net-port-delete                удалить указанный сетевой порт

 Node Device (ключевое слово «nodedev»):
    nodedev-create                 создать устройство из файла XML на узле
    nodedev-destroy                разрушить (остановить) устройство узла
    nodedev-detach                 отключить устройство от драйвера
    nodedev-dumpxml                информация об устройстве в XML
    nodedev-list                   перечислить устройства на узле
    nodedev-reattach               повторно подключить устройство к его драйверу
    nodedev-reset                  сброс устройства
    nodedev-event                  События устройств узла

 Secret (ключевое слово «secret»):
    secret-define                  изменить или определить секрет из файла XML
    secret-dumpxml                 атрибуты секрета в XML
    secret-event                   События секретов
    secret-get-value               Вывести значение секрета
    secret-list                    список секретов
    secret-set-value               установить значение секрета
    secret-undefine                удалить определение секрета

 Snapshot (ключевое слово «snapshot»):
    snapshot-create                Создать снимок на основе XML
    snapshot-create-as             Создать снимок на основе набора аргументов
    snapshot-current               Просмотр и изменение текущего снимка
    snapshot-delete                Удалить снимок домена
    snapshot-dumpxml               XML-дамп для снимка домена
    snapshot-edit                  редактировать XML снимка
    snapshot-info                  данные снимка
    snapshot-list                  Показать снимки домена
    snapshot-parent                Получить имя родительского элемента снимка
    snapshot-revert                Восстановить домен из снимка

 Backup (ключевое слово «backup»):
    backup-begin                   Начать резервное копирование диска запущенного домена
    backup-dumpxml                 XML-дамп для текущего задания по резервному копированию блоков домена

 Storage Pool (ключевое слово «pool»):
    find-storage-pool-sources-as   найти потенциальные источники пулов носителей
    find-storage-pool-sources      обнаружить потенциальные источники пула носителей
    pool-autostart                 автозапуск пула
    pool-build                     собрать пул
    pool-create-as                 создать пул на основе набора аргументов
    pool-create                    создать пул из файла XML
    pool-define-as                 определить пул на основе набора аргументов
    pool-define                    определить неактивный постоянный пул носителей или изменить существующий постоянный пул носителей на основе файла XML
    pool-delete                    удалить пул
    pool-destroy                   разрушить (остановить) пул
    pool-dumpxml                   описание пула в XML
    pool-edit                      редактировать XML-конфигурацию пула носителей
    pool-info                      информация о пуле носителей
    pool-list                      список пулов
    pool-name                      преобразовать UUID пула в имя
    pool-refresh                   обновить пул
    pool-start                     запустить ранее определённый неактивный пул
    pool-undefine                  удалить определение неактивного пула
    pool-uuid                      преобразовать имя пула в UUID
    pool-event                     События пула носителей
    pool-capabilities              возможности пула носителей

 Storage Volume (ключевое слово «volume»):
    vol-clone                      клонировать том.
    vol-create-as                  создать том на основе набора аргументов
    vol-create                     создать том из файла XML
    vol-create-from                создать том на основе другого тома
    vol-delete                     удалить том
    vol-download                   загрузить содержимое тома в файл
    vol-dumpxml                    описание тома в XML
    vol-info                       информация о томе хранения
    vol-key                        возвращает ключ тома для заданного имени или пути
    vol-list                       список томов
    vol-name                       возвращает том для заданного ключа или пути.
    vol-path                       возвращает путь к тому для заданного имени или ключа
    vol-pool                       возвращает пул носителей для заданного ключа тома или пути.
    vol-resize                     изменить размер тома
    vol-upload                     отправить содержимое файла в том
    vol-wipe                       очистить том

 Virsh itself (ключевое слово «virsh»):
    cd                             изменить текущий каталог
    echo                           вывести аргументы
    exit                           закрыть интерактивный терминал
    help                           печать справки
    pwd                            показать текущий каталог
    quit                           закрыть интерактивный терминал
    connect                        подключиться к гипервизору

Статья по теме виртуализации.

Мне лично проще всего думать о KVM (Kernel-based Virtual Machine), как о таком уровне абстракции над технологиями хардверной виртуализации Intel VT-x и AMD-V. Берем машину с процессором, поддерживающим одну из этих технологий, ставим на эту машину Linux, в Linux’е устанавливаем KVM, в результате получаем возможность создавать виртуалки. Так примерно и работают облачные хостинги, например, Amazon Web Services. Наряду с KVM иногда также используется и Xen, но обсуждение этой технологии уже выходит за рамки данного поста. В отличие от технологий контейнерной виртуализации, например, того же Docker, KVM позволяет запускать в качестве гостевой системы любую ОС, но при этом имеет и большие накладные расходы на виртуализацию.

Примечание: Описанные ниже действия были проверены мной на Ubuntu Linux 14.04, но по идее будут во многом справедливы как для других версий Ubuntu, так и других дистрибутивов Linux. Все должно работать как на десктопе, так и на сервере, доступ к которому осуществляется по SSH.

Установка KVM

Проверяем, поддерживается ли Intel VT-x или AMD-V нашим процессором:

grep -E '(vmx|svm)' /proc/cpuinfo

Если что-то нагреполось, значит поддерживается, и можно действовать дальше.

Устанавливаем KVM:

sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils

Что где принято хранить:

Теперь, когда KVM установлен, создадим нашу первую виртуалку.

Создание первой виртуалки

В качестве гостевой системы я выбрал FreeBSD. Качаем ISO-образ системы:

cd /var/lib/libvirt/boot/
sudo wget http://ftp.freebsd.org/path/to/some-freebsd-disk.iso

Управление виртуальными машинами в большинстве случаев производится при помощи утилиты virsh:

sudo virsh --help

Перед запуском виртуалки нам понадобится собрать кое-какие дополнительные сведения.

Смотрим список доступных сетей:

sudo virsh net-list

Просмотр информации о конкретной сети (с именем default):

sudo virsh net-info default

Смотрим список доступных оптимизаций для гостевых ОС:

sudo virt-install --os-variant list

Итак, теперь создаем виртуальную машину с 1 CPU, 1 Гб RAM и 32 Гб места на диске, подключенную к сети default:

sudo virt-install \
  --virt-type=kvm \
  --name freebsd10 \
  --ram 1024 \
  --vcpus=1 \
  --os-variant=freebsd8 \
  --hvm \
  --cdrom=/var/lib/libvirt/boot/FreeBSD-10.2-RELEASE-amd64-disc1.iso \
  --network network=default,model=virtio \
  --graphics vnc \
  --disk path=/var/lib/libvirt/images/freebsd10.img,size=32,bus=virtio

Вы можете увидеть:

WARNING Unable to connect to graphical console: virt-viewer not
installed. Please install the 'virt-viewer' package.

Domain installation still in progress. You can reconnect to the console
to complete the installation process.

Это нормально, так и должно быть.

Затем смотрим свойства виртуалки в формате XML:

sudo virsh dumpxml freebsd10

Тут приводится наиболее полная информация. В том числе есть, к примеру, и MAC-адрес, который понадобятся нам далее. Пока что находим информацию о VNC. В моем случае:

<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>

С помощью любимого клиента (я лично пользуюсь Rammina) заходим по VNC, при необходимости используя SSH port forwarding. Попадаем прямо в инстялятор FreeBSD. Дальше все как обычно — Next, Next, Next, получаем установленную систему.

Основные команды

Давайте теперь рассмотрим основные команды для работы с KVM.

Получение списка всех виртуалок:

sudo virsh list --all

Получение информации о конкретной виртуалке:

sudo virsh dominfo freebsd10

Запустить виртуалку:

sudo virsh start freebsd10

Остановить виртуалку:

sudo virsh shutdown freebsd10

Жестко прибить виртуалку (несмотря на название, это не удаление):

sudo virsh destroy freebsd10

Ребутнуть виртуалку:

sudo virsh reboot freebsd10

Склонировать виртуалку:

sudo virt-clone -o freebsd10 -n freebsd10-clone \
  --file /var/lib/libvirt/images/freebsd10-clone.img

Включить/выключить автозапуск:

sudo virsh autostart freebsd10
sudo virsh autostart --disable freebsd10

Запуск virsh в диалоговом режиме (все команды в диалоговом режиме — как описано выше):

sudo virsh

Редактирование свойств виртуалки в XML, в том числе здесь можно изменить ограничение на количество памяти и тд:

sudo virsh edit freebsd10

Важно! Комментарии из отредактированного XML, к сожалению, удаляются.

Когда виртуалка остановлена, диск тоже можно ресайзить:

sudo qemu-img resize /var/lib/libvirt/images/freebsd10.img -2G
sudo qemu-img info /var/lib/libvirt/images/freebsd10.img

Важно! Вашей гостевой ОС, скорее всего, не понравится, что диск внезапно стал больше или меньше. В лучшем случае, она загрузится в аварийном режиме с предложением переразбить диск. Скорее всего, вы не должны хотеть так делать. Куда проще может оказаться завести новую виртуалку и смигрировать на нее все данные.

Резервное копирование и восстановление производятся довольно просто. Достаточно сохранить куда-то вывод dumpxml, а также образ диска, а потом восстановить их. На YouTube удалось найти видео с демонстрацией этого процесса, все и вправду несложно.

Настройки сети

Интересный вопрос — как определить, какой IP-адрес получила виртуалка после загрузки? В KVM это делается хитро. Я в итоге написал такой скрипт на Python:

#!/usr/bin/env python3

# virt-ip.py script
# (c) 2016 Aleksander Alekseev
# http://eax.me/

import sys
import re
import os
import subprocess
from xml.etree import ElementTree

def eprint(str):
    print(str, file=sys.stderr)

if len(sys.argv) < 2:
    eprint("USAGE: " + sys.argv[0] + " <domain>")
    eprint("Example: " + sys.argv[0] + " freebsd10")
    sys.exit(1)

if os.geteuid() != 0:
    eprint("ERROR: you shold be root")
    eprint("Hint: run `sudo " + sys.argv[0] + " ...`");
    sys.exit(1)

if subprocess.call("which arping 2>&1 >/dev/null", shell = True) != 0:
    eprint("ERROR: arping not found")
    eprint("Hint: run `sudo apt-get install arping`")
    sys.exit(1)

domain = sys.argv[1]

if not re.match("^[a-zA-Z0-9_-]*$", domain):
    eprint("ERROR: invalid characters in domain name")
    sys.exit(1)

domout = subprocess.check_output("virsh dumpxml "+domain+" || true",
                                 shell = True)
domout = domout.decode('utf-8').strip()

if domout == "":
    # error message already printed by dumpxml
    sys.exit(1)

doc = ElementTree.fromstring(domout)

# 1. list all network interfaces
# 2. run `arping` on every interface in parallel
# 3. grep replies
cmd = "(ifconfig | cut -d ' ' -f 1 | grep -E '.' | " + \
      "xargs -P0 -I IFACE arping -i IFACE -c 1 {} 2>&1 | " + \
      "grep 'bytes from') || true"

for child in doc.iter():
     if child.tag == "mac":
         macaddr = child.attrib["address"]
         macout = subprocess.check_output(cmd.format(macaddr),
                                          shell = True)
         print(macout.decode("utf-8"))

Скрипт работает как с default сетью, так и с bridged сетью, настройку которой мы рассмотрим далее. Однако на практике куда удобнее настроить KVM так, чтобы он всегда назначал гостевым системам одни и те же IP-адреса. Для этого правим настройки сети:

sudo virsh net-edit default

… примерно таким образом:

<dhcp>
  <range start='192.168.122.2' end='192.168.122.254'/>
  <!-- добавляем вот эту строчку: -->
  <host mac='52:54:00:59:96:00' name='freebsd10' ip='192.168.122.184'/>
</dhcp>

После внесения этих правок необходимо выполнить команды:

sudo virsh net-destroy default
sudo virsh net-start default
sudo service libvirt-bin restart

Теперь перезагружаем несколько раз гостевую систему и убеждаемся, что она всегда получает адрес 192.168.122.184.

По умолчанию виртуальные машины могут ходить в интернет, а также к ним можно приконнектится из хост-системы. В общем и целом все выглядит так, словно гостевые системы находятся за NAT. На практике же часто бывает куда удобнее иметь bridged сеть. Как она настраивается на хост-системе ранее мы уже рассматривали в заметках Туториал по контейнеризации при помощи LXC и Контейнерная виртуализация при помощи OpenVZ.

После окончания настройки правим конфиг гостевой системы. Находим в нем что-то вроде:

<interface type='network'>
   <source network='default'/>
   <!-- остальное не важно -->
</interface>

… и заменяем на что-то вроде:

<interface type='bridge'>
  <source bridge='br0'/>
  <!-- прочее оставляем как есть -->
</interface>

Перезагружаем гостевую систему и проверяем, что она получила IP по DHCP от роутера. Если же вы хотите, чтобы гостевая система имела статический IP-адрес, это настраивается как обычно внутри самой гостевой системы.

Программа virt-manager

Вас также может заинтересовать программа virt-manager:

sudo apt-get install virt-manager
sudo usermod -a -G libvirtd USERNAME

Так выглядит ее главное окно:

Работа с KVM при помощи virt-manager

Как видите, virt-manager представляет собой не только GUI для виртуалок, запущенных локально. С его помощью можно управлять виртуальными машинами, работающими и на других хостах, а также смотреть на красивые графички в реальном времени. Я лично нахожу особенно удобным в virt-manager то, что не нужно искать по конфигам, на каком порту крутится VNC конкретной гостевой системы. Просто находишь виртуалку в списке, делаешь двойной клик, и получаешь доступ к монитору.

Еще при помощи virt-manager очень удобно делать вещи, которые иначе потребовали бы трудоемкого редактирования XML-файлов и в некоторых случаях выполнения дополнительных команд. Например, переименование виртуальных машин, настройку CPU affinity и подобные вещи. Кстати, использование CPU affinity существенно снижает эффект шумных соседей и влияние виртуальных машин на хост-систему. По возможности используйте его всегда.

Если вы решите использовать KVM в качестве замены VirtualBox, примите во внимание, что хардверную виртуализацию они между собой поделить не смогут. Чтобы KVM заработал у вас на десктопе, вам не только придется остановить все виртуалки в VirtualBox и Vagrant, но и перезагрузить систему. Я лично нахожу KVM намного удобнее VirtualBox, как минимум, потому что он не требует выполнять команду sudo /sbin/rcvboxdrv setup после каждого обновления ядра, адекватно работает c Unity, и вообще позволяет спрятать все окошки.

Заключение

По традиции, немного ссылок по теме:

В целом, KVM произвел на меня исключительно положительное впечатление. Теперь я не понимаю, зачем все это время я мучился с Vagrant и VirtualBox, когда все уже есть в KVM и сделано куда лучше. Ну, почти. Кое-какие косяки все же имеются. Так, например, в htop гостевой системы вы можете видеть, что утилизируете CPU на 30%, хотя на хост-системе вы утилизируете все 100%. Однако мой опыт работы с виртуальными машинами свидетельствует о том, что такого рода проблемы и прочие шумные соседи возникают всегда, и еще один минорный баг в общем-то не делает в этом плане все сильно хуже.

https://eax.me/kvm/