在Ubuntu12.10下搭建基于KVM-QEMU的虚拟机环境(十八)中我们实验了通过在虚拟机里面安装vdagent(Spice
Agent)程序来自动适应屏幕分辨率的功能,这个vdagent是运行在虚拟机里面的,而分辨率的信息来自spice client,这中间隔着spice server,qemu等模块,中间的过程还是比较复杂的。通过分析这个流程,有助于帮助我们理解更多KVM-QEMU虚拟化的机制。
Spice agent运行在客户机(虚拟机)操作系统中。Spice server和Spice client利用spice
agent来执行一些需要在虚拟机里执行的任务,如配置分辨率,另外还有通过剪贴板来拷贝文件等。从上图可以看出,Spice client与server与Spice Agent的通信需要借助一些其他的软件模块,如在客户机里面,Spice
Agent需要通过VDIPort Driver与主机上 QEMU的VDIPort Device进行交互,他们的交互通过一种叫做输入/输出的环进行。Spice
Client和Server产生的消息被写入到设备的输出环中,由VDI Port Driver读取;而Spice Agent发出的消息则通过VDI Port Driver先写入到VDI
Port Device输入环中,被QEMU读入到Spice server的缓冲区中,然后再根据消息决定由Spice Server直接处理,还是被发往Spice
Client中。
在技术上KVM-QMEU架构采用了一种叫virtio-serial的技术,这种技术处理主机用户空间和客户机用户空间的数据传输。它主要包含两个部分:1.
Qemu中模拟一个叫virtio-pci的设备,这个设备提供给客户机使用;2.客户机上安装一个字符设备驱动访问virtio-pci设备。
在实现上,大致需要以下一些工作:
1. 在用libvirt定义虚拟机的时候需要包含添加virtio-serial的控制器设备:
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
|
该设备挂载在PCI总线0的第5个槽位上。这个设备就是QEMU中模拟的,提供给客户及访问的virtio-pci设备;
2. 在用libvirt定义虚拟机的时候需要包含一个叫“com.redhat.spice.0”的客户机接口,它是”channel”类型,其他的客户机接口类型还有parallel
port, serial port, console等,它们从本质上来说都是一种提供给客户机访问的字符设备。
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
|
Channel还可以分为”spicevmc”,”unix”, “pty”等类型,具体可以参考libvirt的说明文档:http://www.libvirt.org/formatdomain.html
注意上面的”address”,它指定了这个字符设备是挂载到了我们在前面定义的virtio-serial控制器上,这样这两者就关联起来了。
3. 在虚拟机里面安装vdagent(参考Ubuntu12.10下搭建基于KVM-QEMU的虚拟机环境(十八))。
4. 上述工作都做了以后,启动虚拟机,然后打开设备管理器(注意,需要右击设备管理器->查看->显示隐藏设备),如下图:
由上图,可以看到在虚拟机设备管理器里有两个跟这个virtio-serial机制相关的设备:
VirtIO-Serial Driver和vportOp1,那么这两个设备分别代表什么呢,再分别双击这两个设备,打开它们的属性看看:
1)VirtIO-Serial Driver的属性如下:
从上图中很明显的看到这个设备是位于PCI总线0上的设备5,是不是能回想起什么来?
对了,它就是我们在前面libvirt定义中定义的virtio-serial控制器设备,槽位号正是5。这说明QEMU已经把它模拟出来,并已经提供给虚拟机里的虚拟串口驱动访问了。
2)vportOp1的属性如下:
从上图可以看出,这个设备正是我们在前面libvirt里定义里定义的“'com.redhat.spice.0”字符设备,它的位置1与我们定义的port=’1’一致,如果要实验可以改一下port=’2’看看,虚拟机里面的位置也会随之改成2。
5. 有了上述条件之后,vdagent程序就可以通过对这个vportOp1字符设备的读写来与主机上的qemu进程交互了,也就是虚拟机与主机的通信通道已经通了。
之后我们通过分析代码来看看实现上是怎么做到的。
分享到:
相关推荐
qemu-kvm-ev-2.12.0-18.el7_6.3.1.src.rpm是CentOS7的qemu-kvm源码文件
`qemu-kvm-1.1`是QEMU与KVM集成的一个版本,发布于2012年,包含了针对KVM优化的QEMU组件。 QEMU-KVM 1.1 的主要特点和改进包括: 1. **性能提升**:此版本对虚拟化性能进行了优化,提高了CPU和I/O设备的模拟速度,...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用
【压缩包子文件的文件名称列表】"go-qemu-master"可能是项目的主分支,通常在GitHub等版本控制系统中,"master"分支代表了项目的主线代码。这个文件可能包含项目的源代码、文档、示例、测试用例以及其他相关资源。 ...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
qemu-kvm 0.12.1.tar.gz是QEMU的一个特定版本(0.12.1)与KVM集成的源代码包。这个编译安装包包含了构建QEMU-KVM所需的所有源代码和相关文件。用户下载此包后,可以编译并安装到自己的Linux系统中,以启用虚拟化功能...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
这个模拟器允许用户在非 ARM 硬件上运行 ARM 指令集,比如在个人电脑上通过 QEMU(Quick Emulator)来实现。QEMU 是一款强大的通用全系统模拟器,它能够模拟多种处理器架构,并支持虚拟化技术。 S3C2440 是 Samsung...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
通过与KVM(Kernel-based Virtual Machine)结合,QEMU-KVM成为了一个高效的全虚拟化解决方案,能够充分利用主机硬件的加速能力,提供接近原生性能的虚拟化体验。 "qemu-kvm-code.tar" 是一个包含QEMU源代码的...
而KVM版的QEMU(qemu-kvm)是经过优化的,专为KVM设计,用于虚拟机的上层管理和用户界面。KVM并不直接依赖QEMU进行虚拟化处理,而是利用QEMU提供用户交互和管理功能。因此,用户应正确理解KVM与QEMU的关系,避免混淆...
官方离线安装包,亲测可用
"OSX-KVM-master-2021-12-28.zip"文件是一个与在KVM和QEMU中安装Mac OS X或OSX相关的资源包。这个过程通常被称为“黑苹果”(Hackintosh)安装,因为它是非官方地在非Apple硬件上运行苹果的操作系统。以下是这个过程...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装