Kvmをハイパーバイザーとして使用して、ホストとそのゲスト仮想マシンの1つとの間に通信チャネルを確立しようとしています。このために、私は virtio-serial を使用しています。
仮想マシンを作成するために、次のコマンドを発行しました。
qemu-system-x86_64 \
-m 2048 -name ubuntu \
-hda ubuntu_image \
-device virtio-serial \
-chardev socket,path=/tmp/foo,server,nowait,id=foo \
-device virtconsole,name=jobsfoo,chardev=foo,name=org.ubuntu.foo \
そして、コミュニケーションのために、ゲストで、私は使用します:
socat /dev/hvc0 -
そしてホスト上で:
socat /tmp/foo -
私はそれを理解するようになります/tmp/foo
はソケットであり、/dev/hvc0
キャラクターデバイス。
なぜ通信用の対称インターフェースがあるのですか:ホストのソケットとゲストのキャラクターデバイス?
UnixおよびUnixライクなオペレーティングシステムはシリアルポートを文字デバイスとして表すため、ゲストに文字デバイスがあり、Unixが存在する限りこれを行っており、ゲストに仮想シリアルポートを明示的に要求しました。ポートはカーネルデバイスドライバーによって作成されるため、キャラクターデバイス専用である必要があります。
明示的にソケットを要求したため、ホストにソケットがあります。おそらく、ホスト上のプログラムから、シリアルポートを理解するゲスト上のプログラムへの双方向通信が必要です。もちろん、このソケットのもう一方の端は、仮想マシンを実行しているqemuプロセスによって処理されます。これをptyに接続してシリアルコンソールをエミュレートしたり、プレーンファイルに接続してポートから出てくるすべてのものをログに記録したりすることもできます。