我正在尝试使用 kvm 作为虚拟机管理程序在主机和其客户虚拟机之一之间建立通信通道。为此,我使用virtio-串行。
为了创建虚拟机,我发出了以下命令:
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
一个字符设备。
为什么有一个用于通信的对称接口:主机上的套接字和客户机上的字符设备?
答案1
您在客户机上有一个字符设备,因为 Unix 和类 Unix 操作系统将串行端口表示为字符设备,并且自 Unix 出现以来一直都是这样,并且您明确要求在客户机中使用虚拟串行端口。该端口由内核设备驱动程序创建,因此它必须是字符设备专用的。
您在主机上有一个套接字,因为您明确要求一个。大概您希望从主机上的某个程序到客户机上的某个理解串行端口的程序进行双向通信。当然,此套接字的另一端由运行虚拟机的 qemu 进程处理。您还可以将其连接到 pty 以模拟串行控制台,或连接到纯文件以仅记录从端口传出的所有内容。