使用 QEMU 套接字功能的正確方法是什麼?

使用 QEMU 套接字功能的正確方法是什麼?

我似乎在任何地方都找不到太多關於使用-serial unix:/path/to/some/file參數 to 的文檔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 視窗的圖形模式使用,或以控制台模式(-ngraphic 選項)使用,其中串行控制台重定向到標準輸入/輸出。第三種選擇是使用 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
    

相關內容