为什么 virtio-serial 在主机上有一个套接字接口,在客户机上有一个字符设备接口?

job*_*bin 5 socket kvm-virtualization virtio

我正在尝试使用 kvm 作为虚拟机管理程序在主机与其客户虚拟机之一之间建立通信通道。为此,我使用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 \
Run Code Online (Sandbox Code Playgroud)

然后为了在客人上进行交流,我使用:

socat /dev/hvc0 -
Run Code Online (Sandbox Code Playgroud)

在主机上:

socat /tmp/foo -
Run Code Online (Sandbox Code Playgroud)

我开始明白这/tmp/foo是一个套接字和/dev/hvc0一个字符设备。

为什么有一个对称的通信接口:主机上的套接字和客户机上的字符设备?

Mic*_*ton 1

您在客户机上有一个字符设备,因为 Unix 和类 Unix 操作系统将串行端口表示为字符设备,并且自从 Unix 出现以来就一直这样做,并且您明确要求在客户机中使用虚拟串行端口。该端口是由内核设备驱动程序创建的,因此它必须是特殊的字符设备。

您在主机上有一个套接字,因为您明确要求了一个。据推测,您希望从主机上的某个程序到客户机上支持串行端口的某个程序进行双向通信。当然,该套接字的另一端由运行虚拟机的 qemu 进程处理。您还可以将其连接到 pty 以模拟串行控制台,或连接到普通文件以仅记录来自端口的所有内容。