**Управление бэкэндом устройства камеры**

*cameradev_add*
Добавить бэкэнд камеры.

**Аргументы:**
* `id`: идентификатор устройства, должен быть уникальным.
* `driver`: тип бэкэнда камеры, например, v4l2 или demo.
* `path`: путь к файлу бэкэнда камеры, например, /dev/video0.

**Примечания:**
МикроВМ не поддерживается.

**Пример:**
```json
-> { "execute": "cameradev_add", "arguments": { "id": "cam-0", "driver": "v4l2", "path": "/dev/video0" } }
<- { "return": {} }
```

*cameradev_del*
Удалить бэкэнд камеры.

**Аргументы:**
* `id`: идентификатор устройства.

**Примечания:**
МикроВМ не поддерживается.

**Пример:**
```json
-> { "execute": "cameradev_del", "arguments": { "id": "cam-0" } }
<- { "return": {} }
```

**Управление бэкэндами символьных устройств**

В настоящее время поддерживается только стандартная ВМ.

*chardev-add*
Добавить бэкэнд символьного устройства.

**Аргументы:**
* `id`: идентификатор символьного устройства, должен быть уникальным.
* `backend`: информация о бэкэнде chardev.

**Примечания (стандартная ВМ):**
* Идентификатор в `chardev-add` должен совпадать с идентификатором в `netdev_add`.

**Пример:**
```json
-> { "execute": "chardev-add", "arguments": { "id": "chardev_id", "backend": { "type": "socket", "data": { "addr": { "type": "unix", "data": { "path": "/path/to/socket" } }, "server": false } } } }
<- { "return": {} }
```

*chardev-remove*
Удалить бэкэнд символьного устройства.

**Аргументы:**
* `id`: идентификатор символьного устройства.

**Пример:**
```json
-> { "execute": "chardev-remove", "arguments": { "id": "chardev_id" } }
<- { "return": {} }
```

**Горячее подключение**

StratoVirt поддерживает горячее подключение virtio-blk и virtio-net устройств с QMP. Стандартная ВМ поддерживает горячее подключение vfio и vhost-user сетевых устройств.

*device_add*
Добавить устройство.

**Аргументы:**
* `id`: идентификатор устройства, должен быть уникальным.
* `driver`: имя драйвера устройства.
* `addr`: адрес, по которому устройство вставляется.
* `host`: информация об устройстве PCI в системе, которая содержит домен, номер шины, номер слота и номер функции.
* `bus`: шина, на которую вставляется устройство. Только для стандартной ВМ.
* `mac`: MAC сетевого устройства.
* `netdev`: бэкэнд сетевого устройства.
* `drive`: бэкэнд блочного устройства.
* `serial`: серийный номер блочного устройства.

**Примечания (стандартная ВМ):**
В настоящее время устройство можно подключить только к устройству pcie-root-port. Поэтому перед запуском ВМ необходимо настроить корневой порт в cmdline.

Конфигурация ядра гостя: CONFIG_HOTPLUG_PCI_PCIE=y.
Не рекомендуется подключать/отключать устройства во время запуска, завершения работы или приостановки ВМ, а также когда ВМ находится под большой нагрузкой. В этом случае драйвер в ВМ может не отвечать на запросы, вызывая исключения ВМ.

**Пример:**
```json
-> { "execute": "device_add", "arguments": { "id": "net-0", "driver": "virtio-net-mmio", "addr": "0x0" } }
<- { "return": {} }
```

*device_del*
Удалить устройство из гостя.

**Аргументы:**
* `id`: идентификатор устройства.

**Примечания:**
Устройство фактически удаляется, когда вы получаете событие DEVICE_DELETED.

**Пример:**
```json
-> { "execute": "device_del", "arguments": { "id": "net-0" } } }
<- { "event": "DEVICE_DELETED", "data": { "device": "net-0", "path": "net-0" }, "timestamp": { "seconds": 1614310541, "microseconds": 554250 } }
<- { "return": {} }
```

**Жизненный цикл**

С помощью QMP вы можете управлять жизненным циклом ВМ с помощью команд stop, cont и quit, а также проверять состояние ВМ с помощью команды query-status.

*stop*
Остановить выполнение всех гостевых VCPU.

**Пример:**
```json
-> { "execute": "stop" }
<- { "event": "STOP", "data": {}, "timestamp": { "seconds": 1583908726, "microseconds": 162739 } }
<- { "return": {} }
```

*cont*
Возобновить выполнение всех гостевых VCPU.

**Пример:**
```json
-> { "execute": "cont" }
<- { "event": "RESUME", "data": {}, "timestamp": { "seconds": 1583908853, "microseconds": 411394 } }
<- { "return": {} }
```

*system_reset*
Сбросить выполнение всех гостевых VCPU.

**Пример:**
```json
-> { "execute": "system_reset" }
<- { "return": {} }
<- { "event": "RESET", "data": { "guest": true }, "timestamp": { "seconds": 1677381086, "microseconds": 432033 } }
```

*system_powerdown*
Запрос на отключение питания гостя. **Выполнение операции отключения питания.**

```json
-> { "execute": "system_powerdown" }
<- { "return": {} }
<- { "event": "POWERDOWN", "data": {}, "timestamp": { "seconds": 1677850193, "microseconds": 617907 } }
```

**Завершение работы.**

Эта команда приводит к корректному завершению процесса StratoVirt.

```json
-> { "execute": "quit" }
<- { "return": {} }
<- { "event": "SHUTDOWN", "data": { "guest": false, "reason": "host-qmp-quit" }, "timestamp": { "ds": 1590563776, "microseconds": 519808 } }
```

**Запрос статуса.**

Запрашивает статус выполнения всех VCPU.

```json
-> {"execute": "query-status"}
<- {"return": { "running": true,"singlestep": false,"status": "running"}}
```

**Управление устройством Balloon backend.**

С помощью команды QMP можно установить целевой размер памяти гостя и получить размер памяти гостя.

**Устройство Balloon.**

Устанавливает целевой размер памяти гостя.

*Аргументы:*

* `value` — размер памяти.

Пример:

```json
-> { "execute": "balloon", "arguments": { "value": 2147483648 } }
<- { "return": {} }
```

**Запрос устройства Balloon.**

Получает размер памяти гостя.

Пример:

```json
-> { "execute": "query-balloon" }
<- { "return": { "actual": 2147483648 } }
```

**Миграция.**

**Перенос.**

Создаёт снимок виртуальной машины в указанный каталог.

*Аргументы:*

* `uri` — путь к шаблону.

Пример:

```json
-> { "execute": "migrate", "arguments": { "uri": "file:path/to/template" } }
<- { "return": {} }
```

**Запрос переноса.**

Получает состояние снимка.

Существует 5 состояний во время создания снимка:

— `None`: ресурс не подготовлен полностью.
— `Setup`: ресурс настроен, готов к созданию снимка.
— `Active`: создание снимка.
— `Completed`: создание снимка успешно завершено.
— `Failed`: создание снимка завершилось с ошибкой.

Пример:

```json
-> { "execute": "query-migrate" }
<- { "return": { "status": "completed" } }
```

**Снимок.**

**Blockdev-snapshot-internal-sync.**

Создаёт внутренний снимок диска.

*Аргументы:*

* `device` — действительное блочное устройство.
* `name` — имя снимка.

Пример:

```json
-> { "execute": "blockdev-snapshot-internal-sync", "arguments": { "device": "disk0", "name": "snapshot1" } }
<- { "return": {} }
```

**Blockdev-snapshot-delete-internal-sync.**

Удаляет внутренний снимок диска.

*Аргументы:*

* `device` — действительное блочное устройство.
* `name` — имя снимка.

Пример:

```json
-> { "execute": "blockdev-snapshot-delete-internal-sync", "arguments": { "device": "disk0", "name": "snapshot1" } }
<- { "return": { "id": "1", "name": "snapshot0", "vm-state-size": 0, "date-sec": 1000012, "date-nsec": 10, "vm-clock-sec": 100, vm-clock-nsec": 20, "icount": 220414 } }
```

**Отладка.**

**Query-vcpu-reg.**

Запрос значения регистра vCPU.

*Аргументы:*

* `addr` — адрес регистра.
* `vcpu` — идентификатор vCPU.

Примечания:

— виртуальная машина приостанавливается во время запроса, а затем возобновляется.
— сейчас поддерживается только aarch64.

Пример:

```json
-> {"execute": "query-vcpu-reg", "arguments": {"addr": "603000000013df1a", "vcpu": 0}}
<- {"return": "348531C5"}
```

**Query-mem-gpa.**

Запрос значения гостевого физического адреса.

*Аргумент:*

* `gpa` — гостевой физический адрес.

Пример:

```json
-> {"execute": "query-mem-gpa", "arguments": {"gpa": "13c4d1d00" }}
<- {"return": "B9000001"}
```

**Query-display-image.**

Запрос образа дисплея virtiogpu. В настоящее время поддерживается только stdvm и gtk.

Пример:

```json
-> { "execute": "query-display-image" }
<- { "return": { "fileDir": "/tmp/stratovirt-images", "isSuccess": true } }
```

**Trace-get-state.**

Запрос состояния трассировки.

*Аргументы:*

* `name` — шаблон для сопоставления имени трассировки.

Пример:

```json
-> { "execute": "trace-get-state", "arguments": { "name": "trace_name" } }
<- { "return": [ { "name": "trace_name", "state": "disabled" } ] }
```

**Trace-set-state.**

Установка состояния трассировки.

*Аргументы:*

* `name` — шаблон для сопоставления имени трассировки.
* `enable` — включение или отключение трассировки.

Пример:

```json
-> { "execute": "trace-set-state", "arguments": { "name": "trace_name","enable": true } }
<- { "return": {} }
```

**Прочее.**

**Getfd.**

Получение файлового дескриптора через SCM.