Parece que no puedo encontrar mucha documentación sobre el uso del -serial unix:/path/to/some/file
argumento 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::xxxx
argumento. 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í, minicom
parece 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::4555
ync
como: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 socat
lo 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