QEMU のソケット機能を使用する適切な方法は何ですか?

QEMU のソケット機能を使用する適切な方法は何ですか?

-serial unix:/path/to/some/file引数の使用に関するドキュメントがどこにもあまり見つからないようですqemu-system-XXXXので、ここで誰かがこの点について説明してくれることを期待しています。具体的には、ホスト上のこのソケットにデータを送信し、QEMU ゲスト側でそれを受信する適切な方法が知りたいです。

アップデート: テストとして、RHEL 8 ホストと Solaris 8 ゲストを使用しています。LawrenceC の提案に従って、引数を追加しました-serial udp::xxxx。また、UDP ポート XXXX に接続して何かを書き込む C プログラムも作成しました。ただし、 を介して RHEL 8 側に書き込まれたバイトが表示されませんnc -u -l -p xxx。何が足りないのでしょうか?

どうやら私はこのアプローチを根本的に誤解していたようで、QEMU ゲストでポートが開くと考えていましたが、これは単にゲストからのシリアル ポート データをホストのローカル UDP ポートに変換するだけです。

答え1

仮想シリアルポートをターミナルプログラムで対話的に使用しようとしていますか?そうであれば、minicomシリアルポートデバイスではなくソケットと対話できるようです。参考::

  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 を使用できます。

単純な読み取り専用コンソールだけが必要な場合は、次のよう-serial udp::4555にQEMU を起動して、netcat または nc を使用できます。QEMU がそのポートに何かを書き込むたびに、netconsole セッションに表示されます。ncnc -u -l -p 4555

QEMUの仮想シリアルポートをUNIXソケットに接続する必要がある場合は、socat推奨されている方法を試してください。ここ

答え2

QEmu-KVM ノート このセクションを含む Unixソケットに基づくインタラクション ソケットを使用するためのすべてのオプションを再開します。

Unixソケットに基づくインタラクション

QEmu 仮想マシンは通常、QEmu ウィンドウを使用したグラフィカル モード、またはシリアル コンソールを標準入出力にリダイレクトしたコンソール モード (-nographic オプション) のいずれかで使用されます。3 番目の選択肢は、Unix ソケットを使用してゲストと通信することです。これは、次の 2 つの QEmu オプションで実現できます。

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

ゲスト マシンが Linux を実行している場合、仮想シリアル ポートはデバイス ttyS0 を通じて利用できます。次のカーネル コマンド ライン パラメータを使用して、初期カーネル メッセージを表示するコンソールとして使用できます。

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

ゲストマシンが systemd を実行している場合は、次のコマンドを使用してシリアルポートにログインシェルを自動的に生成することができます。

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
    

関連情報