Работа с 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. Это можно сделать с помощью команды:
$ 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
Если по каким-либо причинам в списке вашего 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" />
<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
Этап 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
<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.
Решение проблем
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>