QEMU 套接字功能的正确使用方法是什么?

QEMU 套接字功能的正确使用方法是什么?

我似乎找不到太多关于使用-serial unix:/path/to/some/file参数的文档qemu-system-XXXX,所以我希望这里有人可以对此进行解释。具体来说,我想知道在主机上将数据发送到此套接字并在 QEMU 客户机端接收数据的正确方法是什么。

更新: 作为测试,我使用 RHEL 8 主机和 Solaris 8 客户机。根据 LawrenceC 的建议,我添加了参数-serial udp::xxxx。我还编写了一个 C 程序来连接到 UDP 端口 XXXX 并向其写入一些内容。但是,我没有通过 看到 RHEL 8 端写入的字节nc -u -l -p xxx。我可能遗漏了什么?

看来我对这种方法有一个根本性的误解,以为 QEMU 客户机上会打开一个端口,但这只是将客户机的串行端口数据转换为主机上的本地 UDP 端口。

答案1

您是否尝试与终端程序交互使用虚拟串行端口?如果是这样,minicom似乎可以让您与套接字而不是串行端口设备交互。来自https://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.

如果您尝试使用程序将数据发送到虚拟串行端口,请尝试 udp 选项,然后就可以使用 netcat。

如果您只想要一个简单的只读控制台,则可以使用 netcat 或 nc,通过以下方式启动 QEMU:-serial udp::4555ncas:nc -u -l -p 4555。任何时候 QEMU 向该端口写入任何内容,它都会出现在 netconsole 会话中。

如果你确实需要将 QEMU 的虚拟串行端口连接到 unix 套接字,请尝试socat以下建议这里

答案2

QEmu-KVM 说明 包含本节 基于Unix套接字的交互 恢复使用套接字的所有选项:

基于Unix套接字的交互

QEmu 虚拟机通常以图形模式(使用 QEmu 窗口)或控制台模式(-nographic 选项)使用,其中串行控制台重定向到标准输入/输出。第三种选择是使用 Unix 套接字与客户机通信。这可以通过两个 QEmu 选项实现:

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

如果客户机运行 Linux,则虚拟串行端口将通过设备 ttyS0 提供。它可以用作控制台,带有早期内核消息,并带有以下内核命令行参数:

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

如果客户机运行 systemd,则可以使用以下命令在串行端口上自动生成登录 shell:

systemctl enable [email protected]

然后就可以:

  • 连接到 QEmu 监视控制台例如:

    # 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
    
  • 连接到 QEmu 客户控制台例如:

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

相关内容