¿Recuperar información del serial port de un dominio libvirt?

Estoy tratando de recuperar la información del serial port, también conocida como Source Path de acceso de un dominio libvirt (usando la máquina qemu / KVM):

 Serial Device 1 (Primary Console) Device type: pty Source path: /dev/pts/2 

Pero revisé la reference de la API aquí y no parece ser compatible con una Source Path .

¿Hay algún command como VBoxManage que pueda listr dicha información directamente?


Extraño, estoy en el grupo libvirt , puedo controlar (iniciar, detener, etc.) la máquina KVM con virt-manager , virsh también muestra un indicador de virsh # .

Pero no puedo ver nada con virsh list --all command, todavía tengo que ejecutar eso con privilegios de root.

KVM es una API kernel para virtualización. No trata con puertos serie . qemu es un emulador de máquina (PC y otro) que puede usar kvm para mejorar el performance de virtualización. Puede emular un puerto serial 8250 UART estándar ( isa-serial ) o un serial port paravirtualizado ( virtio-serial ).

En qemu, defines tu máquina con arguments de command-line que especifican qué dispositivo agregar a tu máquina y qué backend asignan esos dispositivos (por ejemplo disco duro emulado a un file de image, adaptadores de networking a un dispositivo tap …).

Para los puertos seriales, por lo general asigna eso a lo que qemu llama a chardevs .

Hay muchos posibles diferentes, por lo general cualquier cosa que pueda enviar y recibir bytes, como tuberías, conectores, descriptores de files, pseudo-terminales.

Por ejemplo, si ejecuta qemu como:

 qemu ... -device isa-serial,chardev=c,id=s -chardev pty,id=c 

qemu asigna un pseudo-terminal, informa que en stdout al inicio:

 char device networkingirected to /dev/pts/18 (label c) 

y lo mapea a un nuevo puerto serial isa agregado a la VM. Si arranca una máquina virtual Linux, verá en sus loggings del kernel:

 [ 3.636092] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled [ 3.658666] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A 

Y si escribe algo en /dev/ttyS0 en el invitado, podrá leerlo en /dev/pts/18 en el host.

Después de que se inicia una VM qemu, puede controlarla con lo que qemu llama interfaces de monitor . Hay dos types de interfaces de monitor :

  • Monitor humano: una CLI similar a un intérprete de commands
  • Machine monitor: una interfaz más amigable para la máquina que implementa un protocolo de text (json) llamado qemu machine protocol (QMP).

Si no especifica nada y utiliza la console SDL pnetworkingeterminada, obtendrá un monitor humano en la console SDL presionando Ctrl + Alt + 2 .

Pero también puedes especificar cualquier back end de chardev (pty, socket, stdio …) para eso. Normalmente, utilizo stdio allí:

 qemu ... -monitor stdio 

Para get el monitor en el terminal, empiezo qemu desde cuando ejecuto qemu para las testings.

En esa interfaz de monitor , puede ejecutar el command info qtree para get información sobre los dispositivos de su máquina:

 (qemu) info qtree bus: main-system-bus [...] dev: i440FX-pcihost, id "" [...] bus: pci.0 [...] dev: PIIX3, id "" class ISA bridge, addr 00:01.0, pci id 8086:7000 (sub 1af4:1100) bus: isa.0 type ISA dev: isa-serial, id "s" index = 0 (0) iobase = 1016 (0x3f8) irq = 4 (0x4) chardev = "c" 

Arriba, ves el dispositivo isa-serial que creé antes y que se asigna a la chardev "c" .

Puede get información de ese chardev usando info chardev :

 (qemu) info chardev parallel0: filename=vc c: filename=pty:/dev/pts/18 compat_monitor0: filename=stdio 

Usted ve c maps a /dev/pts/18 pty .

Puede get la misma información programáticamente con un monitor QMP. Si inicia su máquina virtual con -qmp stdio , puede pasar los commands allí:

 {"execute":"qmp_capabilities"} # enable commands {"return": {}} # return value {"execute":"qom-list","arguments":{"path":"/machine/peripheral/s"}} {"return": [{"name": "parent_bus", "type": "link<bus>"}, {"name": "wakeup", "type": "uint32"}, {"name": "chardev", "type": "str"}, {"name": "irq", "type": "uint32"}, {"name": "iobase", "type": "uint32"}, {"name": "index", "type": "uint32"}, {"name": "hotpluggable", "type": "bool"}, {"name": "realized", "type": "bool"}, {"name": "type", "type": "string"}]} # query chardev for "s": {"execute":"qom-get","arguments":{"path":"/machine/peripheral/s","property":"chardev"}} {"return": "c"} # query chardevs: {"execute":"query-chardev"} {"return": [{"filename": "vc", "label": "parallel0"}, {"filename": "pty:/dev/pts/18", "label": "c"}, {"filename": "stdio", "label": "compat_monitor0"}]} 

(vea cómo esas qom-list y qom-get (qom representa el model de object qemu) son una reminiscencia de hacer ls y cat in /sys en la máquina Linux).

Ahora su pregunta sugiere que no está llamando a qemu directamente a mano, sino que usa libvirt . libvirt es una de las muchas infraestructuras de gestión de virtualización. Puede administrar máquinas virtuales qemu (con o sin kvm), xen o virtualbox (al less).

Para las VM de qemu, cuando se define una VM en libvirt (con virt-manager u otro), eso se traducirá en arguments que se pasarán a un command qemu, y libvirt normalmente usará un monitor qmp para controlar una VM después de que se haya iniciado.

Para un dominio libvirt , puede get la configuration actual de un dominio con:

 virsh dumpxml the-domain 

Que vuelca la configuration como XML. Puede extraer información de eso usando xmllint o xmlstarlet o cualquier solución de análisis XML de su elección.

 $ virsh dumpxml domain | xmllint --xpath '//serial' - <serial type="pty"> <source path="/dev/pts/4"/> <target port="0"/> <alias name="serial0"/> </serial><serial type="pty"> <source path="/dev/pts/5"/> <target port="1"/> <alias name="serial1"/> </serial><serial type="pty"> <source path="/dev/pts/6"/> <target port="2"/> <alias name="serial2"/> </serial> $ virsh dumpxml domain | xmllint --xpath 'string(//serial[target/@port=0]/source/@path)' - /dev/pts/4 

Los equivalentes con xmlstarlet :

 sudo virsh dumpxml domain | xmlstarlet sel -t -c '//serial' sudo virsh dumpxml domain | xmlstarlet sel -t -v '//serial[target/@port=0]/source/@path' 

Tenga en count que también puede pasar commands al monitor virsh qemu-monitor-command con el virsh qemu-monitor-command command.

Por ejemplo:

 $ virsh qemu-monitor-command domain '{"execute":"qom-get","arguments": {"path":"/machine/peripheral/serial0","property":"chardev"}}' {"return":"charserial0","id":"libvirt-84"}