Ich kann nirgends viel Dokumentation zur Verwendung des -serial unix:/path/to/some/file
Arguments finden qemu-system-XXXX
, daher hoffe ich, dass jemand hier etwas Licht in die Sache bringen kann. Insbesondere frage ich mich, wie man Daten richtig an diesen Socket auf dem Host sendet und auf der QEMU-Gastseite empfängt.
Aktualisieren: Als Test verwende ich einen RHEL 8-Host und einen Solaris 8-Gast. Wie von LawrenceC vorgeschlagen, habe ich das -serial udp::xxxx
Argument hinzugefügt. Ich habe auch ein C-Programm geschrieben, um eine Verbindung zum UDP-Port XXXX herzustellen und etwas dorthin zu schreiben. Allerdings sehe ich die geschriebenen Bytes auf der RHEL 8-Seite nicht nc -u -l -p xxx
. Was könnte mir entgehen?
Offenbar habe ich diesen Ansatz grundlegend missverstanden und angenommen, dass auf dem QEMU-Gast ein Port geöffnet würde. In Wirklichkeit werden dabei lediglich die seriellen Portdaten des Gasts auf einen lokalen UDP-Port auf dem Host übersetzt.
Antwort1
Versuchen Sie, den virtuellen seriellen Port interaktiv mit einem Terminalprogramm zu verwenden? Wenn ja, minicom
können Sie anscheinend mit einem Socket statt mit einem seriellen Portgerät interagieren. Vonhttps://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.
Wenn Sie versuchen, mit einem Programm Daten an den virtuellen seriellen Port zu senden, versuchen Sie es mit der Option „udp“. Anschließend können Sie netcat verwenden.
Wenn Sie nur eine einfache schreibgeschützte Konsole möchten, können Sie netcat oder nc verwenden, indem Sie QEMU mit:
-serial udp::4555
undnc
als: startennc -u -l -p 4555
. Jedes Mal, wenn QEMU etwas auf diesen Port schreibt, wird es in der Netconsole-Sitzung angezeigt.
Wenn Sie unbedingt den virtuellen seriellen Port von QEMU mit einem Unix-Socket verbinden müssen, versuchen Sie es socat
wie empfohlenHier.
Antwort2
DerHinweise zu QEmu-KVM enthält diesen Abschnitt Interaktion basierend auf Unix-Sockets das fasst alle Optionen zur Verwendung von Sockets zusammen:
Interaktion basierend auf Unix-Sockets
QEmu-virtuelle Maschinen werden normalerweise entweder im grafischen Modus mit einem QEmu-Fenster oder im Konsolenmodus (Option -nographic) verwendet, wobei eine serielle Konsole auf die Standard-Ein-/Ausgabe umgeleitet wird. Eine dritte Alternative besteht darin, Unix-Sockets zur Kommunikation mit dem Gast zu verwenden. Dies kann mit zwei QEmu-Optionen erreicht werden:
-monitor unix:monitor.sock,server,nowait -serial unix:console.sock,server,nowait
Wenn auf dem Gastcomputer Linux läuft, ist der virtuelle serielle Port über das Gerät ttyS0 verfügbar. Es kann mit diesen Kernel-Befehlszeilenparametern als Konsole mit frühen Kernel-Meldungen verwendet werden:
console=ttyS0,38400n8 earlyprint=serial,ttyS0,38400n8
Wenn auf dem Gastcomputer systemd ausgeführt wird, ist es möglich, mit dem folgenden Befehl automatisch eine Login-Shell auf dem seriellen Port zu starten:
systemctl enable [email protected]
Dann ist es möglich:
Stellen Sie beispielsweise mit folgendem Verfahren eine Verbindung zur QEmu-Monitorkonsole her:
# 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
Stellen Sie beispielsweise mit folgendem Verfahren eine Verbindung zur QEmu-Gastkonsole her:
socat STDIO,cfmakeraw UNIX:console.sock # or, with socat<1.7.3.0 socat STDIO,raw,echo=0 UNIX:console.sock