我使用以下参数来启动 QEMU,以便来自来宾的输出将被重定向到主机控制台:
-chardev stdio,id=virtiocon0
-device virtio-serial
-device virtconsole,chardev=virtiocon0
我有以下问题:
- 这些标志分别代表什么意思?
- 来宾端和主机端都创建了哪些类型的设备?
- 我应该在哪里寻找主机端的设备(我实际上想从中读取)?
答案1
从联机帮助页:
-chardev 后端,id=id [,mux=on|off] [,选项]
后端是以下之一:null、socket、udp、msmouse、vc、ringbuf、file、pipe、console、serial、pty、stdio、braille、tty、parallel、parport、spicevmc。香料港。具体的后端将决定适用的选项。
所有设备都必须有一个 ID,它可以是长度不超过 127 个字符的任何字符串。它用于在其他命令行指令中唯一标识该设备。
特别是关于 stdio 后端:
-chardev stdio ,id=id [,signal=on|off]
连接到 QEMU 进程的标准输入和标准输出。
所以这个将 chardevvirtiocon0
与 qemu 进程的标准输入/输出连接起来。
另外两个是:
-device driver[,prop[=value][,...]]
添加设备驱动程序。 prop=value 设置驱动程序属性。有效属性取决于驱动程序。
第一个驱动程序virtio-serial
只是在主机和访客之间创建通信通道。这对于下一个司机来说是必要的。
最后一个,virtconsole
在 guest 虚拟机上创建一个控制台设备,附加到之前创建的 chardev,该设备附加到 qemu 的 stdio/out。
然后,访客可以像任何其他 tty 一样使用此控制台设备(例如,调用getty
它等)。
在 guest 虚拟机上创建的设备将取决于内核及其编译方式,在 Linux 中通常是 /dev/hvc0。
在这种情况下,主机上没有创建任何设备,它只是使用标准输入和标准输出。在 stdin 上读取它并在 stdout 上写入它。
您还可以将 stdin 和 stdout 重定向到其他内容,或使用不同的chardev
后端。尝试套接字或管道。