Чтобы взаимодействовать с VM внутри моей виртуализации на базе Ubuntu 18.04 Server + QEMU/KVM нужно обязательно устанавливать агента. По сути это как Vmware Tools & Virtualbox Tools, но лучше и практичнее в использовании если ты гик или ответственный системный администратор желающий докапываться. Как я понял из документации qemu-agent это демон/служба которая служит для управления виртуальной машиной. Среди возможностей которыми она может помочь в мне в дальнейшем это: Исполнение команд, Взаимодействие с файловой системой, Создание снапшотов (снимков системы), Миграции, Включение и выключение.

  • srv-server → это VM
  • srv-bionic → это Хост

Хост установлен по заметке

Шаг №1: На виртуальной машине внутри хоста QEMU+KVM устанавливаем агент:

ekzorchik@srv-server:~$ apt-cache search qemu-guest-agent

qemu-guest-agent - Guest-side qemu-system agent

ekzorchik@srv-server:~$ sudo apt-get install qemu-guest-agent -y

ekzorchik@srv-server:~$ sudo poweroff

Шаг №2: На хосте, выключаем VM и вносим изменения в шаблон виртуальной машины:

(Если VM не выключили в Шаге №1 то выключаем так:

ekzorchik@srv-bionic:~$ sudo virsh list

Id Name State

----------------------------------------------------

3 Userver1804_2 running

4 UServer1804 running — выключаем вот эту

ekzorchik@srv-bionic:~$

ekzorchik@srv-bionic:~$ sudo virsh shutdown 4

Domain 4 is being shutdown

Добавляем в свойства VM устройство:

ekzorchik@srv-bionic:~$ sudo virsh edit UServer1804

<channel type='unix'>

<target type='virtio' name='org.qemu.guest_agent.0'/>

</channel>

Сохраняем внесенные изменения и видим надпись:

Domain UServer1804 XML configuration edited.

Также добавление устройства для агента можно сделать и через «Менеджер виртуальных машин» - VM — Добавить оборудование — выбираю «Канал», затем

  • Название: org.qemu.guest_agent.0
  • Тип устройства: Сокет Unix (unix)
  • Автосокет: отмечаю галочкой

и нажимаю «Готово». Изменения активируются после включения системы если в момент добавления оборудования VM была включена.

Если посмотреть свойства VM через «Менеджер виртуальный машин»

Оборудование установленного агента в QEMU KVM

 

Отобразить все VM, как выключенные так и включенные:

ekzorchik@srv-bionic:~$ sudo virsh list --all

Id Name State

----------------------------------------------------

3 Userver1804_2 running

- UServer1804 shut off

- UServer1804_3 shut off

- W7X64 shut off

ekzorchik@srv-bionic:~$

Запускаем гостевую VM:

ekzorchik@srv-bionic:~$ sudo virsh start UServer1804

Domain UServer1804 started

Шаг №3: Подключаемся либо через оснастку «Менеджер виртуальных машин» к гостевой виртуальной машине, либо подключается к ней по SSH (предварительно должен быть установлен пакет openssh-server)

ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.2

и проверяем наличие нового устройства:

ekzorchik@srv-server:~$ ls -al /dev/virtio-ports/org.qemu.guest_agent.0

lrwxrwxrwx 1 root root 11 May 15 20:00 /dev/virtio-ports/org.qemu.guest_agent.0 -> ../vport1p2

Шаг №4: Проверяем с хоста что видим агент гостевой VM:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command UServer1804 '{"execute":"guest-ping"}'

{"return":{}}

Шаг №5: Отобразить список всех команд доступных к передаче агенту гостевой VM:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command UServer1804 '{"execute":"guest-info"}'

{"return":{"version":"2.11.1","supported_commands":[{"enabled":true,"name":"guest-sync-delimited","success-response":true},{"enabled":true,"name":"guest-sync","success-response":true},{"enabled":true,"name":"guest-suspend-ram","success-response":false},

Шаг №6: Отобразить IPадрес гостевой VM через команду найденную в предыдущем шаге:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command UServer1804 '{"execute":"guest-network-get-interfaces"}'

{"return":[{"name":"lo","ip-addresses":[{"ip-address-type":"ipv4","ip-address":"127.0.0.1","prefix":8},{"ip-address-type":"ipv6","ip-address":"::1","prefix":128}],"statistics":{"tx-packets":0,"tx-errs":0,"rx-bytes":0,"rx-dropped":0,"rx-packets":0,"rx-errs":0,"tx-bytes":0,"tx-dropped":0},"hardware-address":"00:00:00:00:00:00"},{"name":"ens3","ip-addresses":[{"ip-address-type":"ipv4","ip-address":"172.33.33.2","prefix":24},{"ip-address-type":"ipv6","ip-address":"fe80::5054:ff:fe55:4a29","prefix":64}],"statistics":{"tx-packets":23,"tx-errs":0,"rx-bytes":8823,"rx-dropped":36,"rx-packets":78,"rx-errs":0,"tx-bytes":2238,"tx-dropped":0},"hardware-address":"52:54:00:55:4a:29"}]}

в этом выводе у интерфейса ens3 значится IP-адрес 172.33.33.2

Шаг №7: Все агент установлен и может взаимодействовать с хостом, к примеру это выполнение команд внутри VM если подключиться к хосту по SSH:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command --help

NAME

qemu-agent-command - QEMU Guest Agent Command

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command UServer1804 '{"execute":"guest-exec","arguments":{"path":"/bin/mkdir","arg":["/home/ekzorchik/ekzorchik"]}}'

{"return":{"pid":621}}

Проверяем, а успешно ли отработала команда на гостевой VM:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command UServer1804 '{"execute":"guest-exec-status","arguments":{"pid":621}}'

{"return":{"exitcode":0,"exited":true}} → ответ результирует, что команда посланная на гостевую VM была выполнена успешно.

  • exited:true - говорит о том что программа закончила свое выполнение
  • exitcode:0 - указывает код возврата программы (0 как правило говорит о успешном выполнении)

Проверям на гостевой VM наличие каталога с именем ekzorchik:

ekzorchik@srv-server:~$ ls -l

total 4

drwx------ 2 root root 4096 May 15 20:33 ekzorchik

ekzorchik@srv-server:~$

Итого успешно.

Теперь кстати стало возможным корректно выключать и перезагружать гостевую VM через оснастку «Менеджер виртуальных машин» - VM — Виртуальная машина - Выключить — Перезагрузить/Выключить, а не как раньше я использовал

Перезагрузить/Выключить (принудительно).

Если я попытаюсь запустить соединение взаимодействие с другой гостевой VM (Userver1804_2 = 172.33.33.17) на которой не установлен агент, то меня ждет уведомление:

ekzorchik@srv-bionic:~$ sudo virsh qemu-agent-command Userver1804_2 '{"execute":"guest-exec","arguments":{"path":"/bin/mkdir","arg":["/home/ekzorchik/ekzorchik"]}}'

error: argument unsupported: QEMU guest agent is not configured

В целом все правильно. Но агент можно поставить и после того как система развернута, а потом когда будет оговоренное время на профилактические работы добавить в контейнер VM устройство:

ekzorchik@srv-bionic:~$ ssh -t ekzorchik@172.33.33.17 "sudo mkdir /root/1"

ekzorchik@172.33.33.17's password: указываю пароль на подключение к хосту

[sudo] password for ekzorchik: указываю пароль на повышение прав до уровня суперпользователя

Connection to 172.33.33.17 closed.

Команда успешно отрабатывает, а теперь установка агента:

ekzorchik@srv-bionic:~$ ssh -t ekzorchik@172.33.33.18 "sudo apt-get install -y qemu-guest-agent"

Проверяю, а действительно ли агент установлен:

ekzorchik@srv-bionic:~$ ssh -l ekzorchik 172.33.33.18 "dpkg -l | grep qemu-guest-agent"

ekzorchik@172.33.33.18's password:

ii qemu-guest-agent 1:2.11+dfsg-1ubuntu7.12 amd64 Guest-side qemu-system agent

ekzorchik@navy:~$

Да установился.

Что я сейчас нового узнал, а то что обязательно на гостевые VM внутри хоста QEMU+KVM на Ubuntu 18.04 Server обязательно нужно устанавливать агент если есть желание из хоста взаимодействовать с гостевыми VM. Т.е. я могу получать характеристики контейнера виртуальной машины, добавлять устройства из консоли, редактировать контейнер виртуальной машины + взаимодействовать на уровне файловой системы: создавать, удалять, переименовывать, инсталлировать, деинсталлировать. Мне пока этого достаточно, на этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.