**Управление бэкэндом устройства камеры** *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.