Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Работа с KVM в Debian или Ubuntu из командной строки

Оригинал: How to use KVM from the command line on Debian or Ubuntu
Автор: Dan Nanni
Дата публикации: 27 февраля 2014 года
Перевод: А. Кривошей
Дата перевода: декабрь 2014 г.

Есть несколько способов управлять виртуальными машинами, запущенными в гипервизоре KVM, например с помощью популярного графического фронтенда virt-manager. Однако, если вы хотите использовать KVM на сервере, графические решения вряд ли будут хорошим выбором. В этом случае удобным инструментом будет virsh - утилита командной строки для управления гостевыми виртуальными машинами. Она работает со службой libvirtd, которая может управлять несколькими различными гипервизорами, включая KVM, Xen, QEMU, LXC и OpenVZ.

Интерфейс командной строки virsh также полезен в случае, если вы хотите автоматизировать инициализацию и управление виртуальными машинами. Кроме того, способность virsh работать с различными гипервизорами обеспечивает единый интерфейс для управления виртуальными машинами различных типов.

В этом руководстве я продемонстрирую вам, как запускать KVM из командной строки с использованием virsh в Debian или Ubuntu.

Этап 1: проверка аппаратной поддержки виртуализации

В качестве первого этапа проверьте, поддерживает ли ваш процессор аппаратную виртуализацию (то есть Intel VT или AMD-V), которая требуется для KVM. Это можно сделать с помощью команды:

Если в выводе нет флага vmx или svm, это значит, что процессор не поддерживает аппаратную виртуализацию, поэтому вы не сможете использовать KVM на этом хосте. После проверки самое время установить KVM.

Этап 2: Установка KVM

Установите KVM и соответствующие пользовательские утилиты с помощью apt-get:

$ sudo apt-get install qemu-kvm libvirt-bin

Во время инсталляции будет создана группа libvirtd, и ваш userID будет автоматически добавлен в группу. Это позволит вам управлять виртуальными машинами от имени обычного пользователя. Вы можете проверить это с помощью команды id, которая выводит ваш group ID.

$ id your-userID

добавление userID

Если по каким-либо причинам в списке вашего groupID нет libvirtd, вы можете вручную добавить себя в эту группу.

$ sudo adduser [youruserID] libvirt

Перезагрузите обновленную информацию о группе, как показано ниже. Когда появится запрос, введите свой пользовательский пароль.

$ exec su -l $USER

Теперь вы можете запускать virsh как обычный пользователь. В качестве теста попробуйте приведенную ниже команду, которая выведет список доступных виртуальных машин. Если вы не получите сообщение об ошибке прав доступа, значит все в порядке.

$ virsh --connect qemu:///system list
 Id    Name                           State
----------------------------------------------------

Этап 3: Настройка сетевого моста

Один из способов получения доступа из виртуальной машины к внешним сетям - мост, встроенный в ваш хост Linux. Это называется сетевой мост. Ниже описано, как создать и настроить сетевой мост Linux br0 для мостового соединения с KVM.

Сначала установим необходимый для создания сетевого моста пакет.

$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0

Далее необходимо настроить сетевой мост в файле /etc/network/interfaces, чтобы он активировался при загрузке системы. Для использования файла /etc/network/interfaces необходимо отключить Network Manager (если он у вас используется). Как это сделать, описано здесь.

После отключения Network Manager настраиваем сетевой мост br0 в /etc/network/interfaces, как показано ниже.

#auto eth0
#iface eth0 inet dhcp

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Здесь предполагается, что главным сетевым интерфейсом, который имеет доступ к внешним сетям, является eth0. Кроме того, предполагается, что eth0 получает IP-адреса посредством DHCP. Обратите внимание, что в /etc/network/interface нет настроек для eth0, так как он подключается к сетевому мосту br0.

Перезагрузите сетевые службы и убедитесь, что сетевой мост настроен успешно. В этом случае br0 должен присвоить сетевой адрес интерфейса eth0, в свою очередь интерфейсу eth0 не должно быть присвоено сетевого адреса.

$ sudo /etc/init.d/networking restart
$ ifconfig

настройка сетевого моста

Этап 4: создание виртуальной машины из командной строки

В KVM настройки виртуальной машины хранятся в XML-файле домена. Поэтому сначала необходимо подготовить этот файл.
Ниже пример простого XML-файла для виртуальной машины. Вы можете использовать его, откорректировав в соответствии со своими потребностями.

<domain type='kvm'>
<name>alice</name>
<uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa</uuid>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>1</vcpu>
<os>
<type>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="raw"/>
<source file="/home/dev/images/alice.img"/>
<target dev="vda" bus="virtio"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="0x0"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/home/dev/iso/ubuntu-13.10-server-amd64.iso"/>
<target dev="hdc" bus="ide"/>
<readonly/>
<address type="drive" controller="0" bus="1" target="0" unit="0"/>
</disk>
<controller type="ide" index="0">
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
</controller>
<interface type='bridge'>
<mac address='52:54:aa:00:f0:51'/>
<source bridge='br0'/>
</interface>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport="yes" listen='127.0.0.1'/>
</devices>
</domain>

Этот XML-файл определяет следующую виртуальную машину:

1 Гб оперативной памяти, один CPU и один жесткий диск.
Образ диска: /home/dev/images/alice.img.
Загрузка с CD: (/home/dev/iso/ubuntu-13.10-server-amd64.iso).
Сеть: сетевой мост br0.

Строка UUID между тегами <uuid></uuid> может быть сгенерирована случайным образом. Для этого используется утилита командной строки uuid.

$ sudo apt-get install uuid
$ uuid

Доменный XML-файл можно также создать, сделав дамп информации о домене существующей виртуальной машины:

$ virsh --connect qemu:///system dumpxml alice > bob.xml

дамп информации о домене существующей виртуальной машины

Этап 5: запуск виртуальной машины из командной строки.

Перед запуском виртуальной машины необходимо создать образ диска для нее. Для этого можно воспользоваться командой qemu-img, входящей в пакет qemu-kvm.

$ qemu-img create -f qcow2 /home/dev/images/alice.img 5G

Преимущество опции qcow2 в том, что создаваемый при ее использовании образ диска не резервирует сразу весь свой свой объем (5 Гб), а динамически увеличивается при наполнении в процессе работы виртуальной машины.
Теперь вы готовы к запуску виртуальной машины с использованием созданного ранее доменного XML-файла. Это делается с помощью приведенной ниже команды:

$ virsh --connect qemu:///system create alice.xml
Domain alice created from alice.xml

Проверьте, что домен создан успешно.

$ virsh --connect qemu:///system list
 Id    Name                           State
----------------------------------------------------
 3     alice                          running

Кроме того, проверьте, что виртуальный сетевой интерфейс для виртуальной машины (то есть vnet0) успешно добавлен в созданный ранее сетевой мост br0.

$ sudo brctl show

проверка виртуального сетевого интерфейса

Этап 6. Удаленный доступ к виртуальной машине.

Для удаленного доступа к консоли виртуальной машины вы можете использовать любой VNC-клиент.
Сначала определите номер порта VNC для виртуальной машины:

$ sudo netstat -nap | grep kvm

определение номера порта VNC

В этом примере номер порта для виртуальной машины alice 5900.

Затем запустите VNC-клиент и подключитесь к VNC-серверу, работающему по адресу KVM-host-IP:5900.

Управление виртуальной машиной с помощью virsh

Ниже список наиболее часто употребляемых команд virsh.

Для создания нового гостевого домена и запуска виртуальной машины:

$ virsh --connect qemu:///system create alice.xml

Для остановки виртуальной машины и уничтожения гостевого домена:

$ virsh --connect qemu:///system destroy alice

Для выключения виртуальной машины (без уничтожения домена):

$ virsh --connect qemu:///system shutdown alice

Для приостановки виртуальной машины:

$ virsh --connect qemu:///system suspend alice

Для возобновления работы виртуальной машины:

$ virsh --connect qemu:///system resume alice

Для автозапуска виртуальной машины после загрузки хоста:

$ virsh --connect qemu:///system autostart alice

Для получения информации о домене виртуальной машины:

$ virsh --connect qemu:///system dominfo alice

Вы можете также управлять виртуальными машинами из сессии virsh. Для создания новой сессии virsh и входа в нее, просто введите:

$ virsh --connect qemu:///system

В командной строке вы можете использовать любые команды virsh.

командная строка virsh

Решение проблем

1. Я получил ошибку, когда попытался создать виртуальную машину:

error: internal error: no supported architecture for os type 'hvm'

Вы получите эту ошибку, если ваш процессор не поддерживает аппаратную виртуализацию (то есть Intel VT или AMD-V), которая требуется для работы KVM. Если же вы получили эту ошибку с процессором, поддерживающим Intel VT или AMD-V, возможные решения этой проблемы:

Во-первых, проверьте, загружены ли требуемые модули ядра.

$ lsmod | grep kvm

Если модуль kvm не загружен, вам необходимо загрузить его:

$ sudo modprobe kvm_intel (для процессоров Intel)
$ sudo modprobe kvm_amd (для процессоров AMD)

Второе решение - добавление аргумента "--connect qemu:///system" к команде virsh, как показано ниже. Этот аргумент может потребоваться, если вы используете более одного гипервизора (то есть VMware, VirtualBox) на сервере.

$ virsh --connect qemu:///system create alice.xml

2. Я получил ошибку, когда пытался запустить консоль своей виртуальной машины:

$ virsh console alice

error: internal error: cannot find character device <null>

Эта ошибка возникает потому, что вы не определили устройство консоли в XML-файле виртуальной машины. Добавьте приведенные ниже строки в раздел "device" XML-файла.

<console type='pty'>
<target port='0'/>
</console>