Консольная утилита virsh из пакета libvirt предназначена для управления гостевыми системами и гипервизором.
virsh использует libvirt API и служит альтернативой графическому менеджеру виртуальных машин (virt-manager). Непривилегированные пользователи могут выполнять доступ в только в режиме чтения. С помощью virsh можно исполнять сценарии для виртуальных машин.
С помощью virsh вы можете сохранять состояние виртуальных машин, переносить ВМ между гипервизорами и управлять виртуальными сетями
С virsh вы всегда можете получить список доступных команд или параметров, используя команду «help». «help command» даст вам дополнительную информацию по команде command.
Работа с виртуальными сетями
Просмотр действующих сетей
1 |
# virsh net-list --all |
Создание новой сети на основе XML-конфигурационного файла
1 |
# virsh net-define my-net.xml |
Запуск/активация вновь созданной сети или ранее существовавшей неактивной сети
1 |
# virsh net-start my-net |
Либо создание и запуск сети на основе XML-конфигурационного файла с помощью одной команды
1 |
# virsh net-create my-net.xml |
Добавление запуска сетевой конфигурации в автозагрузку
1 |
# virsh net-autostart my-net |
Удаление запуска сетевой конфигурации с автозагрузки
1 |
# virsh net-autostart --disable my-net |
Изменение действующей сети
1 |
# virsh net-edit my-net |
Просмотр конфигурации сети в XML-формате
1 |
# virsh net-dumpxml my-net-nat |
Остановка сети(при этом освобождаются все ресурсы используемые этой сетью – соотвествующий dnsmasq-процесс, освобождение моста)
1 |
# virsh net-destroy my-net |
Удаление сети (предварительно сеть нужно остановить указанной выше командой)
1 |
# virsh net-undefine my-net-routed |
Получение информации о сети
1 |
# virsh net-info my-net |
Иногда необходимо применить настройки на лету(без перезапуска сети)(например,добавить соответствие mac-адреса виртуалки и выдаваемого ей по DHCP IP-адреса)
Поэтому вариант с virsh-edit не подходит т.к. требует перезапуск сети для применения настроек с помощью указанных ниже комад
1 |
# virsh net-destroy my-net-nat |
1 |
# virsh net-start my-net-nat |
Но во время такого перезапуска все гостевые виртуалки потеряют соединение с хостом(нодой), поэтому правильнее будет использовать команду
1 |
# virsh net-update |
Более подробно здесь
https://wiki.libvirt.org/page/Networking
Файл создания виртуальной сети типа NAT
В настройках DHCP можно указывать соответствие MAC-адрес виртуалки и выдаваемого ей IP-адреса
1 |
# nano my-net-nat.xml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<network> <name>my-net-nat</name> <uuid>41999d54-fdb4-474a-b520-078dca8b3cab</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr1' stp='on' delay='0'/> <mac address='52:54:00:be:d0:40'/> <ip address='192.168.123.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.123.2' end='192.168.123.254'/> <host mac='52:54:00:48:17:c9' name='vm1.domain.com' ip='192.168.123.101'/> <host mac='52:54:00:b2:2f:30' name='vm2. domain.com' ip='192.168.123.102'/> <host mac='52:54:00:48:17:d9' name='vm3. domain.com' ip='192.168.123.103'/> </dhcp> </ip> </network> |
Файл создания виртуальной сети типа Internal
1 |
# nano my-net-internal.xml |
1 2 3 4 5 6 7 8 |
<network> <name>my-net-internal</name> <uuid>81596472-e74a-4d20-94a1-60ba74153d76</uuid> <bridge name='virbr2' stp='on' delay='0'/> <mac address='52:54:00:0e:61:6f'/> <ip address='192.168.124.1' netmask='255.255.255.0'> </ip> </network> |
Файл создания виртуальной сети типа Router
Где ens33-физческий интерфейс ноды, который подключен в вирт.бридж virbr4
1 |
# nano my-net-routed.xml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<network> <name>my-net-routed</name> <uuid>2649f314-43d3-11e8-b528-0b017ad293b8</uuid> <forward dev='ens33' mode='route'> <interface dev='ens33'/> </forward> <bridge name='virbr4' stp='on' delay='0'/> <mac address='52:54:00:c8:12:b5'/> <ip address='192.168.125.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.125.2' end='192.168.125.254'/> </dhcp> </ip> </network> |
Файлы конфигурации сети для гипервизора KVM находятся в
1 |
/etc/libvirt/qemu/networks/ |
Если сеть добавлена в автозагрузку,то символьная ссылка на XML-файл сети создается в
1 |
/etc/libvirt/qemu/networks/autostart/ |
1 |
# virsh net-info my-net-nat |
1 2 3 4 5 6 |
Name: my-net-nat UUID: 41999d54-fdb4-474a-b520-078dca8b3cab Active: yes Persistent: yes Autostart: yes Bridge: virbr1 |
1 |
# virsh net-info my-net-internal |
1 2 3 4 5 6 |
Name: my-net-internal UUID: 81596472-e74a-4d20-94a1-60ba74153d76 Active: yes Persistent: yes Autostart: yes Bridge: virbr2 |
1 |
# virsh net-info my-net-routed |
1 2 3 4 5 6 |
Name: my-net-routed UUID: 2649f314-43d3-11e8-b528-0b017ad293b8 Active: yes Persistent: yes Autostart: no Bridge: virbr4 |
1 |
# brctl show |
1 2 3 4 |
bridge name bridge id STP enabled interfaces virbr1 8000.525400bed040 yes virbr1-nic virbr2 8000.5254000e616f yes virbr2-nic virbr4 8000.525400c812b5 yes virbr4-nic |
При запуске виртуалки в зависимости от типа сетевого подключения, который она использует, будут создаваться сетевые интерфейсы vnet под соответствующим бриджом (virbr1,virbr2,virbr4)
Например,
1 |
# brctl show | grep -B1 vnet |
1 2 3 4 |
virbr2 8000.5254000e616f yes virbr2-nic vnet1 virbr4 8000.525400c812b5 yes virbr4-nic vnet0 |
Концепция вирутальных сетей в libvirt
https://wiki.libvirt.org/page/VirtualNetworking
Работа с виртуальными машинами
Создание новой вирт.машины из существующей
Сохранение конфигурации текущей виртуалки в файл
1 |
# virsh dumpxml vm > new_vm_name.xml |
Правка конфигурационного файла новой вирт.машины
1 |
# nano new_vm_name.xml |
Изменяем поля, значения которых должны быть уникальны для каждой виртуалки
1)Имя виртуалки
1 |
<name>myvm2</name> |
2)UUID-универсальный идентификатор
1 |
<uuid>15a7837c-43d4-11e8-a6e5-67826cb28b46</uuid> |
Идентификаторы удобно генерировать с помощью команды uuid
1 |
# apt-get install uuid |
1 |
# uuid |
1 |
15a7837c-43d4-11e8-a6e5-67826cb28b46 |
3) MAC-адрес
1 |
<mac address='52:54:00:68:34:16'/> |
4) Файл, который будет использоваться в качестве диска
1 |
<source file='/var/lib/libvirt/images/vm4.qcow2'/> |
Создание вирт.машины из файла .xml
1 |
# virsh define new_vm_name.xml |
1 |
# virsh start new_vm_name |
Или с помощью одной команды(которая выполняет то же самое(создает и запускает виртуалку), что и две указанные выше)
1 |
# virsh create new_vm_name.xml |
Альтернативным вариантом копирования виртуалки может быть использование команды virt-clone
Например, скопируем виртуалку vm4 в виртуалку vm5
Перед запуском копирования/клонирования виртуалки ее необходимо остановить
При таком клонировании система автоматически заменит все уникальные части конфигурации виртуалки со стороны хоста( т.е. имя виртуалки(name), уникальный идентификатор(uuid), mac-адрес и т.д.), а также скопирует диск
При этом содержимое виртуалки, включая статические IP-адреса, пароли останутся прежними
1 |
# virt-clone --connect qemu:///system --original vm4 --name vm5 --file "/var/lib/libvirt/images/vm5.qcow2" |
1 |
# diff -U0 /etc/libvirt/qemu/vm4.xml /etc/libvirt/qemu/vm5.xml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
--- /etc/libvirt/qemu/vm4.xml 2018-04-19 23:23:03.419404278 +0300 +++ /etc/libvirt/qemu/vm5.xml 2018-04-22 19:14:27.968573612 +0300 @@ -4 +4 @@ - virsh edit vm4 + virsh edit vm5 @@ -9,2 +9,2 @@ - <name>vm4</name> - <uuid>15a7837c-43d4-11e8-a6e5-67826cb28b46</uuid> + <name>vm5</name> + <uuid>1eb3a846-cbd1-4c92-9334-e534ac1c1a74</uuid> @@ -26 +26 @@ - <source file='/var/lib/libvirt/images/vm4.qcow2'/> + <source file='/var/lib/libvirt/images/vm5.qcow2'/> @@ -45 +45 @@ - <mac address='52:54:00:68:34:16'/> + <mac address='52:54:00:62:ae:fa'/> @@ -51 +51 @@ - <mac address='52:54:00:82:ca:39'/> + <mac address='52:54:00:56:09:1f'/> |
Получение доступа к виртуальной машине
1.Доступ пo VNC
Для доступа по VNC к виртуальной машине используем используем секцию graphics в секции devices
1 2 3 4 5 6 |
<devices> <strong>...</strong> <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='123456'> <listen type='address' address='0.0.0.0'/> ... <devices> |
Вместо прослушивания всех интерфейсов можно определить только один, например, 127.0.0.1 или внешний/внутренний IP-адрес ноды, на который есть доступ
По умолчанию VNC включен на 127.0.0.1:59000(можно изменить глобально эту настройку, в файле /etc/libvirt/qemu.conf)
Поэтому доступ к виртуалке через VNC можно через ssh туннель путем пробрасывания порта на свой компьютер
Например:
1 |
# ssh -L5900:localhost:5900 user@host |
Теперь в настройках VNC-клиента используем
127.0.0.1:5900
Можно принудительно указывать номер порта
1 2 3 4 5 6 |
<devices> ... <graphics type='vnc' port='5914' autoport='no' listen='0.0.0.0' passwd='123456'> <listen type='address' address='0.0.0.0'/> ... <devices> |
Глобально пароль для доступа по VNC можно установить в файле /etc/libvirt/qemu.conf
1 |
# grep vnc_password /etc/libvirt/qemu.conf |
1 |
#vnc_password = "XYZ12345" |
2.Доступ через консоль (с ноды)
Для доступа к виртуалке с ноды через virsh console в XML-конфигурационном файле вирт.машины используем секции serial и console в секции devices
1 2 3 4 5 6 7 8 9 10 |
<devices> ... <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> ... <devices> |
Настройка сети в файле конфигурации виртуальной машины
Для подключения вирт.машины к определенной сети
Для подключениия к сети типа NAT
1 2 3 4 5 |
<interface type='network'> <mac address='52:54:00:48:17:c9'/> <source network='my-net-nat'/> <model type='virtio'/> </interface> |
Для подключения к сети Internal(Host Only)
1 2 3 4 5 |
<interface type='network'> <mac address='52:54:00:92:ce:69'/> <source network='my-net-internal'/> <model type='virtio'/> </interface> |
Для подключения к сети route
Где virbr4 – bridge-интерфейс, к которому подключен физический интерфейс ноды
1 2 3 4 5 |
<interface type='bridge'> <mac address='52:54:00:68:34:16'/> <source bridge='virbr4'/> <model type='virtio'/> </interface> |
MAC-адреса можно не указывать, тогда они будут автоматически сгенерированы
Есть смысл указывать MAC-адреса, когда в настройках сети есть привязка MAC-адреса к IP-адресу
Чтобы виртуалка постоянно получала по DHCP один и тот же IP-адрес
Приостановка виртуальной машины
В приостановленном состоянии виртуальная машина потребляет оперативную память и не использует процессорное время, диск и сетевые подсистемы
1 |
# virsh suspend vm1 |
Возобновление работы приостановленной ранее виртуалки
1 |
# virsh resume vm1 |
Сохранение виртуальной машины
При этом виртуалка будет остановлена и данные оперативной памяти будут сохранены в файл
1 |
# virsh save vm1 /root/vm1-save.img |
1 |
Domain vm1 saved to /root/vm1-save.img |
1 |
# file /root/vm1-save.img |
1 |
/root/vm1-save.img: Libvirt QEMU Suspend Image, version 2, XML length 2476, running |
1 |
# du -hs /root/vm1-save.img |
1 |
505M /root/vm1-save.img |
Восстановление виртуальной машины
1 |
# virsh restore /root/vm1-save.img |
1 |
Domain restored from /root/vm1-save.img |
Сохраненная машина будет восстановлена из файла и перезапущена, что может занять некоторое время. Имя и идентификатор UUID виртуальной машины останутся неизменными, но будет предоставлен новый идентификатор домена.
Определение идентификатора домена виртуальной машины
1 |
# virsh domid vm1 |
1 |
3 |
Определение имени домена виртуальной машины
1 |
# virsh domname vm1 |
Определение универсального идентификатора UUID виртуальной машины
1 |
# virsh domuuid vm1 |
1 |
5f21ba11-b1a1-4017-b022-fe3dd2231b28 |
Получение информации о виртуальной машине
1 |
# virsh dominfo vm1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Id: 3 Name: vm1 UUID: 5f21ba11-b1a1-4017-b022-fe3dd2231b28 OS Type: hvm State: running CPU(s): 1 CPU time: 6.1s Max memory: 524288 KiB Used memory: 524288 KiB Persistent: yes Autostart: disable Managed save: no Security model: apparmor Security DOI: 0 Security label: libvirt-5f21ba11-b1a1-4017-b022-fe3dd2231b28 (enforcing) |
Получение инфорамции об узле
1 |
# virsh nodeinfo |
1 2 3 4 5 6 7 8 |
CPU model: x86_64 CPU(s): 1 CPU frequency: 2494 MHz CPU socket(s): 1 Core(s) per socket: 1 Thread(s) per core: 1 NUMA cell(s): 1 Memory size: 2039052 KiB |
Просмотр списка виртуальных машин и их состояния
1 |
# virsh list |
1 2 3 |
Id Name State ---------------------------------------------------- 3 vm1 running |
Можно добавить аргументы:
1 |
--inactive |
покажет список неактивных доменов (неактивным считается тот домен, который был определен, но в настоящий момент не является активным).
1 |
--all |
покажет все виртуальные машины независимо от их состояния
Столбец «Status» может содержать следующие значения:
1 2 3 4 5 6 7 |
• running — работающие виртуальные машины, то есть те машины, которые используют ресурсы процессора в момент выполнения команды. • blocked — заблокированные, неработающие машины. Такой статус может быть вызван ожиданием ввода/вывода или пребыванием машины в спящем режиме. • paused — приостановленные домены. В это состояние они переходят, если администратор нажал кнопку паузы в окне менеджера виртуальных машин или выполнил команду virsh suspend. • shutdown — виртуальные машины, завершающие свою работу. При получении виртуальной машиной сигнала завершения работы, она начнет завершать все процессы. Стоит отметить, что некоторые операционные системы не отвечают на такие сигналы. • dying — сбойные домены и домены, которые не смогли корректно завершить свою работу. • crashed — сбойные домены, работа которых была прервана. В этом состоянии домены находятся, если не была настроена их перезагрузка в случае сбоя. Получение информации о виртуальных процессорах |
1 |
# virsh vcpuinfo vm4 |
1 2 3 4 5 6 |
CPU Affinity: y VCPU: 0 CPU: 0 State: running CPU time: 43.9s CPU Affinity: y |
Настройка соответствия виртуальных процессоров физическим
1 |
# virsh vcpupin {domain-id, domain-name or domain-uuid} vcpu, cpulist |
Где vcpu — номер виртуального процессора, а список_cpu — сопоставляемые ему физические процессоры.
Изменение числа процессоров для домена
1 |
# virsh setvcpus {domain-name, domain-id or domain-uuid} count |
Обратите внимание, что заданное число не может превышать значение, определенное при создании гостевой виртуальной машины
Изменение выделенного виртуальной машине объема памяти
1 |
# virsh setmem {domain-id or domain-name} count |
Объем памяти, определяемый заданным числом, должен быть указан в килобайтах. Обратите внимание, что объем не может превышать значение, определенное при создании виртуальной машины, но в то же время не должен быть меньше 64 мегабайт. Изменение максимального объема памяти может оказать влияние на функциональность гостя только в том случае, если указанный размер меньше исходного. В таком случае использование памяти будет ограничено.
Информация о сетевых интерфейсах работающей виртуальной машины
1 |
# virsh domifstat GuestName interface-device |
Например,запущена виртуалка vm4 c двумя интерфейсами
1 |
# brctl show | grep vnet |
1 2 |
vnet1 vnet0 |
1 |
# virsh domifstat vm4 vnet0 |
1 2 3 4 5 6 7 8 |
vnet0 rx_bytes 21300 vnet0 rx_packets 359 vnet0 rx_errs 0 vnet0 rx_drop 0 vnet0 tx_bytes 12482 vnet0 tx_packets 162 vnet0 tx_errs 0 vnet0 tx_drop 0 |
1 |
# virsh domifstat vm4 vnet1 |
1 2 3 4 5 6 7 8 |
vnet1 rx_bytes 16820 vnet1 rx_packets 319 vnet1 rx_errs 0 vnet1 rx_drop 0 vnet1 tx_bytes 648 vnet1 tx_packets 8 vnet1 tx_errs 0 vnet1 tx_drop 0 |
Информация о блочных устройствах работающей виртуальной машины
1 |
# virsh domblkstat GuestName block-device |
Добавление дополнительного диска в виртуальну машину
1)Создание файла, который будет использоваться в качестве дополнительного диска в вирт.машине
1 |
# qemu-img create -f raw /var/lib/libvirt/images/mydisk2.raw 1G |
1 |
Formatting '/var/lib/libvirt/images/mydisk2.raw', fmt=raw size=1073741824 |
1 |
# qemu-img info /var/lib/libvirt/images/mydisk2.raw |
1 2 3 4 |
image: /var/lib/libvirt/images/mydisk2.raw file format: raw virtual size: 1.0G (1073741824 bytes) disk size: 0 |
До присоединения в виртуалке был только один диск
1 |
# fdisk -l | grep vd |
1 2 |
Disk /dev/vda: 2.2 GiB, 2361393152 bytes, 4612096 sectors /dev/vda1 * 2048 4610047 4608000 2.2G 83 Linux |
2) Присоединение созданного файла в качестве дополнительного диска к виртуальной машине
1 |
# virsh attach-disk vm4 --source /var/lib/libvirt/images/mydisk2.raw --target vdb --persistent |
1 |
Disk attached successfully |
В результате выполнения этой каманды в конфиг.файл виртуалки будет добавлен блок
1 2 3 4 5 6 |
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/mydisk2.raw'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </disk> |
После запуска в виртуалке появляется новый диск /dev/vdb, на котором можно создавать разделы, форматировать и монтировать.
1 |
# fdisk -l | grep vd |
1 2 3 4 |
Disk /dev/vda: 2.2 GiB, 2361393152 bytes, 4612096 sectors /dev/vda1 * 2048 4610047 4608000 2.2G 83 Linux Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors /dev/vdb1 2048 2097151 2095104 1023M 83 Linux |
Получение доступа к файлам/каталогам внутри образа диска вирт.машины
(виртуалка при этом должна быть выключена, можно монтировать диск и при запущенной виртуалки, но не рекомендуется)
1 |
# mkdir /vm |
1 |
# guestmount -a /var/lib/libvirt/images/vm1.qcow2 -m /dev/sda1 /vm |
1 |
# guestunmount /vm |
Удаление виртуалки(предварительно виртуалка должны быть остановлена)
1 |
# virsh undefine vm5 |
Указанная выше команда не удаляет тома,
Удаление томов выполняем либо через
1 |
# rm /var/lib/libvirt/images/vm5.qcow2 |
Либо с помощью команды virsh vol-delete
1 |
# virsh vol-delete /var/lib/libvirt/images/vm5.qcow2 |
Подключение CDROM
Через файл описания устройства
1 |
# nano /root/cdrom.xml |
1 2 3 4 5 6 |
<disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/config-vm4.iso'/> <target dev='hdc' bus='ide'/> <readonly/> </disk> |
1 |
# virsh attach-device vm4 /root/cdrom.xml |
Работа со Snapshot-ами
Создание снепшота виртуалки vm3
1 |
# virsh snapshot-create-as vm3 |
1 |
Domain snapshot 1524135105 created |
Просмотр списка снепшотов виртуалки vm3
1 |
# virsh snapshot-list vm3 |
1 2 3 |
Name Creation Time State ------------------------------------------------------------ 1524135105 2018-04-19 13:51:45 +0300 running |
Создание второго снепшота виртуалки vm3
1 |
# virsh snapshot-create-as vm3 |
1 |
Domain snapshot 1524140486 created |
1 |
# virsh snapshot-list vm3 |
1 2 3 4 |
Name Creation Time State ------------------------------------------------------------ 1524135105 2018-04-19 13:51:45 +0300 running 1524140486 2018-04-19 15:21:26 +0300 running |
Восстановление виртуалки со второго снепшота
1 |
# virsh snapshot-revert vm3 1524140486 |
Удаление второго снепшота виртуалки vm3
1 |
# virsh snapshot-delete vm3 1524140486 |
1 |
Domain snapshot 1524140486 deleted |
1 |
# virsh snapshot-list vm3 |
1 2 3 |
Name Creation Time State ------------------------------------------------------------ 1524135105 2018-04-19 13:51:45 +0300 running |
Свойства гипервизора
1 |
# virsh capabilities |
Работа с пулами
Просмотр доступных пулов
1 |
# virsh pool-list |
1 2 3 |
Name State Autostart ------------------------------------------- images active yes |
Получение информации о пуле
1 |
# virsh pool-info images |
1 2 3 4 5 6 7 8 |
Name: images UUID: e74b6544-d939-4f13-8fb6-a37d1077224a State: running Persistent: yes Autostart: yes Capacity: 7.84 GiB Allocation: 5.94 GiB Available: 1.90 GiB |
Список томов в пуле
1 |
# virsh vol-list images --details |
1 2 3 4 5 6 7 8 9 10 11 12 |
Name Path Type Capacity Allocation --------------------------------------------------------------------------------------------------------------- config-vm1.iso /var/lib/libvirt/images/config-vm1.iso file 366.00 KiB 368.00 KiB config-vm2.iso /var/lib/libvirt/images/config-vm2.iso file 366.00 KiB 368.00 KiB config-vm3.iso /var/lib/libvirt/images/config-vm3.iso file 366.00 KiB 368.00 KiB config-vm4.iso /var/lib/libvirt/images/config-vm4.iso file 366.00 KiB 368.00 KiB myvm.qcow2 /var/lib/libvirt/images/myvm.qcow2 file 1.00 GiB 196.00 KiB ubunut-server-16.04.qcow2 /var/lib/libvirt/images/ubunut-server-16.04.qcow2 file 2.20 GiB 276.75 MiB vm1.qcow2 /var/lib/libvirt/images/vm1.qcow2 file 2.20 GiB 734.07 MiB vm2.qcow2 /var/lib/libvirt/images/vm2.qcow2 file 2.20 GiB 305.44 MiB vm3.qcow2 /var/lib/libvirt/images/vm3.qcow2 file 2.20 GiB 1.08 GiB vm4.qcow2 /var/lib/libvirt/images/vm4.qcow2 file 2.20 GiB 304.57 MiB |
Справка ко командам virsh
1 |
# virsh help |
Источник:
https://docs-old.fedoraproject.org/ru-RU/Fedora/12/html/Virtualization_Guide/chap-Virtualization_Guide-Managing_guests_with_virsh.html
https://ru.wikibooks.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_libvirt
https://libvirt.org/sources/virshcmdref/html-single
http://itman.in/virsh-commands/#more-1168
http://lipix.ciutadella.es/wp-content/uploads/2016/09/kvm_cheatsheet.pdf