MYCSS

11 грудня 2021 р.

Нотатка для себе, Proxmox QEMU agent для VM - запуск команд

Як взаємодіє гіпервізор з віртуальними машинами ?
Один з варіантів використати агент для віртуальної машини. 

У Proxmox це qemu-agent [1],  від існує для різних операційних систем.
Так для FreeBSD існує версія пакунку "qemu-guest-agent-5.0.1  QEMU guest-agent utilities", з функціоналом але дещо обмеженим.

Для роботи з агентом є команда  qm guest.

 qm guest cmd <vmid> <command>
 qm guest exec-status <vmid> <pid>
 qm guest passwd <vmid> <username> [OPTIONS]
 qm guest exec <vmid> [<extra-args>] [OPTIONS]

Manual proxmox qm :
qm guest cmd <vmid> <command>
Execute Qemu Guest Agent commands.
<vmid>: <integer> (1 - N) -  The (unique) ID of the VM.
<command>: <fsfreeze-freeze | fsfreeze-status | fsfreeze-thaw | fstrim | get-fsinfo | get-host-name | get-memory-block-info | get-memory-blocks | get-osinfo | get-time | get-timezone | get-users | get-vcpus | info | network-get-interfaces | ping | shutdown | suspend-disk | suspend-hybrid | suspend-ram>

The QGA command.

qm guest exec <vmid> [<extra-args>] [OPTIONS]
Executes the given command via the guest agent
<vmid>: <integer> (1 - N) - The (unique) ID of the VM.
<extra-args>: <array>   Extra arguments as array
--pass-stdin <boolean> (default = 0)

When set, read STDIN until EOF and forward to guest agent via input-data (usually treated as STDIN to process launched by guest agent). Allows maximal 1 MiB.
--synchronous <boolean> (default = 1)

If set to off, returns the pid immediately instead of waiting for the commmand to finish or the timeout.
--timeout <integer> (0 - N) (default = 30)

The maximum time to wait synchronously for the command to finish. If reached, the pid gets returned. Set to 0 to deactivate

qm guest exec-status <vmid> <pid>
Gets the status of the given pid started by the guest-agent
<vmid>: <integer> (1 - N) -   The (unique) ID of the VM.
<pid>: <integer> -  The PID to query

qm guest passwd <vmid> <username> [OPTIONS]
Sets the password for the given user to the given password
<vmid>: <integer> (1 - N) -  The (unique) ID of the VM.
<username>: <string>  -   The user to set the password for.
--crypted <boolean> (default = 0)
    set to 1 if the password has already been passed through crypt()

Запитаємо функціонал агента в FreeBSD обмеження мають статус disabled:

qm guest cmd 113 info
{
   "supported_commands" : [
      {
         "enabled" : true,
         "name" : "guest-get-osinfo",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-timezone",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-users",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-host-name",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-exec",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-exec-status",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-get-memory-block-info",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-set-memory-blocks",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-get-memory-blocks",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-set-user-password",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-fsinfo",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-set-vcpus",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-vcpus",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-network-get-interfaces",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-suspend-hybrid",
         "success-response" : false
      },
      {
         "enabled" : false,
         "name" : "guest-suspend-ram",
         "success-response" : false
      },
      {
         "enabled" : false,
         "name" : "guest-suspend-disk",
         "success-response" : false
      },
      {
         "enabled" : false,
         "name" : "guest-fstrim",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-fsfreeze-thaw",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-fsfreeze-freeze-list",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-fsfreeze-freeze",
         "success-response" : true
      },
      {
         "enabled" : false,
         "name" : "guest-fsfreeze-status",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-flush",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-seek",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-write",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-read",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-close",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-file-open",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-shutdown",
         "success-response" : false
      },
      {
         "enabled" : true,
         "name" : "guest-info",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-set-time",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-get-time",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-ping",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-sync",
         "success-response" : true
      },
      {
         "enabled" : true,
         "name" : "guest-sync-delimited",
         "success-response" : true
      }
   ],
   "version" : "5.0.1"
}

Виконаємо команду для  отримання змісту файлу від імені "root" !!!

qm guest exec 113 -- sh -c "cat /root/test.txt"

 

Так, якщо використати при створенні віртуальної машини параметр:  "--hookscript <string>    Script that will be executed during various steps in the vms lifetime", то можна додатково контролювати віртуальні машини через агент.

Приклад скрипту: /usr/share/doc/pve-manager/examples/vzdump-hook-script.pl 

Але використання агента віртуальної машини в неконтрольованому середовищі може бути не зовсім безпечно, коли до гіпервізора має доступ хакер.

 За матеріалами: 

  1. Proxmox Server Solutions - qm - Qemu/KVM Virtual Machine Manager 
  2. [SOLVED] - Run guest agent commands on linux VM | Proxmox Support Forum

Немає коментарів:

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready