Работа с 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

Group-id.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

Br-utils.jpg

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

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

virt-install --name=guest_name --arch=x86_64 --vcpus=1 --ram=512 --os-type=linux --os-variant=rhel5 --hvm 
--connect=qemu:///system --network bridge:br0 --cdrom=/var/lib/libvirt/images/rhel5-x86_64.iso 
--disk path=/mnt/virtual_machines/guest_name.img,size=20 --accelerate --vnc --noautoconsole --keymap=es
  • Описание краткое команды ENG тут:
   Explanation of the params:

       name: name of the guest.
       arch: architecture of the guest.
       vcpus: number of CPUs assigned to the guest.
       ram: MB of RAM assigned to the guest.
       os-type and os-variant: available options can be checked using man virt-install.
       hvm: use full virtualization.
       connect: connect to the hypervisor.
       network bridge: the bridge to use for the guest.
       cdrom: the ISO of the operating system to install.
       disk path=x,size=y: path and size of the image file for the guest.
       accelerate: make use of the KVM acceleration capabilities if available.
       vnc: export a virtual console over VNC to the guest.
       noautoconsole: Don’t automatically try to connect to the guest console.
       keymap: keyboard layout for the VNC console
   Use a VNC client to connect to the guest (port 5900 or 5901 if you already have a VNC server listening on port 5900)
   and install the operating system.
I’ll write another post soon explaining all the operations which can be done with KVM virtual machines using virsh.

Ниже пример простого 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

Virsh0.jpg

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

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

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

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

qemu-img create -q /home/dev/images/alice.img 5G

Теперь вы готовы к запуску виртуальной машины с использованием созданного ранее доменного 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

Ifconfig-br0.jpg

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

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

$ sudo netstat -nap | grep kvm

Net-kvm.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.
Virsh-connect.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>