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

Материал из support.qbpro.ru

Оригинал: 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. Это можно сделать с помощью команды:

$ egrep '(vmx|svm)' --color /proc/cpuinfo

flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp
lm constant_tsc up arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid
sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept
vpid fsgsbase smep

Если в выводе нет флага 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

<img alt="добавление userID" src="/MyLDP/vm/img/kvm-debian/15432586092_64dfb867d3_z.jpg">

Если по каким-либо причинам в списке вашего 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

<img alt="настройка сетевого моста" src="/MyLDP/vm/img/kvm-debian/12804880475_4b5307bae0_z.jpg">

Этап 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" />
     <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" />
     <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' />
   </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

<img alt="дамп информации о домене существующей виртуальной машины" src="/MyLDP/vm/img/kvm-debian/12805292934_2ca685b1f8_z.jpg">

Этап 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

<img alt="проверка виртуального сетевого интерфейса" src="/MyLDP/vm/img/kvm-debian/12806555455_3617d38f9c_z.jpg">

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

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

$ sudo netstat -nap | grep kvm

<img alt="определение номера порта VNC" src="/MyLDP/vm/img/kvm-debian/12804880505_ee091b01b0_z.jpg">

В этом примере номер порта для виртуальной машины 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.

<img alt="командная строка virsh" src="/MyLDP/vm/img/kvm-debian/12804974853_cf26cf4e55_z.jpg">

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

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>