Работа с 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=always /proc/cpuinfo
Вывод примерно такой:
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid
Если в выводе нет флага 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-файле домена. Поэтому сначала необходимо подготовить этот файл.
Если нет необходимого вам файла конфигурации, то его можно создать командой:
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.
Ниже пример простого 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 файла для Windows 2008
<domain type='kvm'> <name>win2k8</name> <uuid>04dbbaa6-8759-465d-8a34-5c12b06270bb</uuid> <memory unit='KiB'>3145728</memory> <currentMemory unit='KiB'>3145728</currentMemory> <vcpu placement='static'>1</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type> <boot dev='hd' /> </os> <features> <acpi /> <apic /> <pae /> </features> <cpu mode='custom' match='exact'> <model fallback='allow'>core2duo</model> </cpu> <clock offset='localtime'> <timer name='rtc' tickpolicy='catchup' /> <timer name='pit' tickpolicy='delay' /> <timer name='hpet' present='no' /> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <pm> <suspend-to-mem enabled='no' /> <suspend-to-disk enabled='no' /> </pm> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='writeback' />
<target dev='sda' bus='sata' /> <address type='drive' controller='0' bus='0' target='0' unit='0' /> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw' />
<target dev='hda' bus='ide' /> <readonly /> <address type='drive' controller='0' bus='0' target='0' unit='0' /> </disk> <controller type='pci' index='0' model='pci-root' /> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1' /> </controller> <controller type='sata' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' /> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' /> </controller> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7' /> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on' /> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1' /> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2' /> </controller> <interface type='bridge'> <mac address='52:54:00:d6:74:a0' />
<model type='virtio' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' /> </interface> <serial type='pty'> <target port='0' /> </serial> <console type='pty'> <target type='serial' port='0' /> </console> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0' /> <address type='virtio-serial' controller='0' bus='0' port='1' /> </channel> <input type='tablet' bus='usb' /> <input type='mouse' bus='ps2' /> <input type='keyboard' bus='ps2' /> <graphics type='spice' autoport='yes' keymap='ru' passwd='0000' /> <video> <model type='qxl' ram='65536' vram='65536' heads='1' /> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' /> </video> <redirdev bus='usb' type='spicevmc' /> <redirdev bus='usb' type='spicevmc' /> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' /> </memballoon> </devices> </domain>
Доменный 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 Гб), а динамически увеличивается при наполнении в процессе работы виртуальной машины.
Если необходимо сделать сразу жестко заданный размер то команда будет такой:
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
Этап 6. Удаленный доступ к виртуальной машине.
Для удаленного доступа к консоли виртуальной машины вы можете использовать любой VNC-клиент.
Сначала определите номер порта VNC для виртуальной машины:
$ sudo netstat -nap | grep kvm
В этом примере номер порта для виртуальной машины 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>