¿Cuál es la forma correcta de utilizar la función de socket de QEMU?

¿Cuál es la forma correcta de utilizar la función de socket de QEMU?

Parece que no puedo encontrar mucha documentación sobre el uso del -serial unix:/path/to/some/fileargumento to qemu-system-XXXX, así que espero que alguien aquí pueda arrojar algo de luz sobre esto. Específicamente, me pregunto cuál es la forma correcta de enviar datos a este socket en el host y recibirlos en el lado invitado de QEMU.

Actualizar: Como prueba, estoy usando un host RHEL 8 y un invitado Solaris 8. Como sugirió LawrenceC, agregué el -serial udp::xxxxargumento. También escribí un programa en C para conectarme al puerto UDP XXXX y escribirle algo. Sin embargo, no veo los bytes escritos en el lado de RHEL 8 nc -u -l -p xxx. ¿Qué me podría estar perdiendo?

Parece que he tenido un malentendido fundamental de este enfoque, pensando que se abriría un puerto en el invitado QEMU, pero esto simplemente traduce los datos del puerto serie del invitado a un puerto UDP local en el host.

Respuesta1

¿Está intentando utilizar el puerto serie virtual de forma interactiva con un programa de terminal? Si es así, minicomparece poder permitirle interactuar con un socket en lugar de un dispositivo de puerto serie. Dehttps://www.man7.org/linux/man-pages/man1/minicom.1.html:

  Serial port setup
     A - Serial device
          /dev/tty1 or /dev/ttyS1 for most people.  [...]
          To use a UNIX socket for communication the device name
          must be prefixed with "unix#" following by the full path
          and the filename of the socket.  Minicom will then try to
          connect to this socket as a client. As long as it cannot
          connect to the socket it stays 'offline'. As soon as the
          connection establishes, minicom goes 'online'. If the
          server closes the socket, minicom switches to 'offline'
          again.

Si está intentando utilizar un programa para enviar datos al puerto serie virtual, pruebe la opción udp y luego podrá utilizar netcat.

Si solo desea una consola simple de solo lectura, puede usar netcat o nc, iniciando QEMU con: -serial udp::4555y nccomo: nc -u -l -p 4555. Cada vez que QEMU escriba algo en ese puerto, aparecerá en la sesión de netconsole.

Si es absolutamente necesario que el puerto serie virtual de QEMU esté conectado a un socket Unix, intente socatlo recomendadoaquí.

Respuesta2

ElNotas de QEmu-KVM contiene esta sección Interacción basada en sockets Unix que resume todas las opciones para usar sockets:

Interacción basada en sockets Unix

Las máquinas virtuales QEmu se suelen utilizar ya sea en modo gráfico, con una ventana QEmu, o en modo consola (opción -nográfica), con una consola serie redirigida a la entrada/salida estándar. Una tercera alternativa consiste en utilizar sockets Unix para comunicarse con el huésped. Esto se puede lograr con dos opciones de QEmu:

-monitor unix:monitor.sock,server,nowait
-serial unix:console.sock,server,nowait

Si la máquina invitada ejecuta Linux, el puerto serie virtual estará disponible a través del dispositivo ttyS0. Se puede utilizar como consola con los primeros mensajes del kernel con estos parámetros de línea de comando del kernel:

console=ttyS0,38400n8 earlyprint=serial,ttyS0,38400n8

Si la máquina invitada ejecuta systemd, es posible generar automáticamente un shell de inicio de sesión en el puerto serie con el siguiente comando:

systemctl enable [email protected]

Entonces es posible:

  • conéctese a la consola del monitor QEmu, por ejemplo con:

    # Use cfmakeraw to make TAB work and isig=1 to allow using Ctrl+C
    socat STDIO,cfmakeraw,isig=1 UNIX:monitor.sock
    
    # socat<1.7.3.0 does not support cfmakeraw. Use raw instead
    socat STDIO,raw,echo=0,isig=1 UNIX:monitor.sock
    
  • conéctese a la consola invitada QEmu, por ejemplo con:

    socat STDIO,cfmakeraw UNIX:console.sock
    
    # or, with socat<1.7.3.0
    socat STDIO,raw,echo=0 UNIX:console.sock
    

información relacionada