本篇是接着上一篇继续讲解,上篇我们已经能够创建虚机并通过vnc连接进行安装与启动;而本篇将会重点介绍spice连接,在介绍之前我们简单看下spice 介绍以及它与VNC、RDP的比较。
一、spice简介
spice(独立计算环境简单协议)是红帽企业虚拟化桌面版的主要技术组件之一,具有自适应能力的远程提交协议,能够提供与物理桌面完全相同的最终用户体验。其包含三个组件。
SPICE Driver :SPICE驱动器 存在于每个虚拟桌面内的组件;
SPICE Device:SPICE设备 存在于红帽企业虚拟化Hypervisor内的组件;
SPICE Client:SPICE客户端 存在于终端设备上的组件,可以是瘦客户机或专用的PC,用于接入每个虚拟桌面。
这三个组件协作运行,确定处理图形的最高效位置,以能够最大程度改善用户体验并降低系统负荷。如果客户机足够强大,SPICE向客户机发送图形命令,并在客户机中对图形进行处理,显著减轻服务器的负荷。另一方面,如果客户机不够强大,SPICE在主机处理图形,从CPU的角度讲,图形处理并不需要太多费用。
二、spice、vnc与rdp协议的比较
spice、vnc、rdp是比较主流的远程桌面连接协议。这里对三者做一个总结比较。可见spice还是相当优秀的。
SPICE | VNC | RDP | |
---|---|---|---|
BIOS屏幕显示 | 能 | 能 | 不能 |
全彩支持 | 能 | 能 | 能 |
更改分辨率 | 能 | 能 | 能 |
多显示器 | 多显示器支持(高达4画面) | 只有一个屏幕 | 多显示器支持 |
图像传输 | 图像和图形传输 | 图像传输 | 图像和图形传输 |
视频播放支持 | GPU加速支持 | 不能 | GPU加速支持 |
音频传输 | 双向语音可以控制 | 不能 | 双向语音可以控制 |
鼠标控制 | 客户端服务器都可以控制 | 服务器端控制 | 服务器端控制 |
USB传输 | USB可以通过网络传输 | 不能 | USB可以通过网络传输 |
三、spice 连接虚机
好了,在简单了解spice协议以及它与VNC和RDP的比较之后,我们来体验以下spice 方式连接,首先我们需要创建虚机并启用spice连接。
注:默认虚拟机使用的显卡是虚拟显卡,而使用spice协议时可以将虚拟显卡更换为qxl 显卡,这会加快视频传输的质量。
1、编写test_spice.xml文件:
对kvm虚拟机的test.xml 文件(上篇博客有完整内容)中可以通过增加如下内容进行支持:
<graphics type='spice' port='5930' autoport='no' listen='192.168.222.128 passwd='password'/>
<video>
<model type='qxl' vram='32768' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
需要启用声卡时,还需要在配置文件中增加如下内容:
<sound model='ac97'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</sound>
2、定义虚机:
[root@localhost IMG]# virsh define test_spice.xml
Domain test_centos_spice defined from test_spice.xml
查看当前定义的域情况:
3、启动虚机(域)test_centos_spice:
[root@localhost IMG]# virsh start test_centos_spice
Domain test_centos_spice started
查看当前域情况:
再查看对应的qemu进程:
从上面也可以看到后面通过spice连接所用到的信息,如宿主机的IP:192.168.222.128,端口port:5930;
有了虚机以后,我们就可以通过spice 客户端进行连接,下面我们将介绍Windows和Linux 下是如何通过spice客户端进行连接的。
Windows连接:
安装软件virt-viewer-x86-3.0.msi,链接:(https://releases.pagure.org/virt-viewer/virt-viewer-x86-3.0.msi)
输入连接地址,如下:
点击Connect,会提示让输入密码,密码就是之前再test_spice.xml中定义的,即passwd=‘password’,这里就是password。正常的话,我们就能看到我们的虚机界面了,如下所示:
linux 连接:
这个我们采用spice 客户端源码进行编译,生成spicec 客户端程序进行连接,当然你也可以通过yum 或apt-get 进行安装spice 客户端进行连接,这种方式比较简单,我们就不介绍了,我们主要从编译源码开始,这也方便我们后期修改代码,调试代码。
操作步骤:
1、下载spice 源码,源码链接:https://www.spice-space.org/download/releases/spice-0.12.5.tar.bz2
2、准备Ubuntu 桌面操作系统:由于后期需要通过spicec去连接虚机(采用的是x11协议),所以我们要先安装一个带X11 server 的Ubuntu 16.04 桌面操作系统。否则后面连接会报如下错误;
3、编译spice-client
1)./configure 生成Makefile 文件
如果出错,请根据错误提示安装依赖包,主要有: libx11-dev 和 libxext-dev,libxrandr-dev,xorg-dev等;
2)make 生成 spicec 二进制文件
但是会报如下错误:
主要原因是,我们在执行./configure 生成Makefile文件时,没有显示指定编译spice client, 默认是不编译的,我们从上图也可以看出build spice client no 的列表,表示不编译spice client 。因此,我们需要重新生成Makefile文件,使其编译spice client ,如下:
[root@localhost spice-0.12.5]# ./configure --enable-client
这时我们发现 Build Spice client 已经变成yes;这时我们再进入client 目录进行编译客户端(之前要先编译spice-common),或者直接执行make 连同spice-common,spice server 一起编译;这个时候就不会报错啦。
这时会生成spicec 客户端程序
3)连接spice 虚机,命令如下:
root@localhost spice-0.12.5/client #./spicec -h 192.168.222.128 -p 5930 -w password
我们又看到熟悉的centos 虚机界面啦,这样我们采用spice 源码编译连接虚机就算完成了~
续:
前面我们介绍的虚机都是CentOS虚机,接下来我们再介绍一下Windows虚机创建并用spicec进行连接;
第一步:创建镜像win7.img
[root@localhost IMG]# qemu-img create -f qcow2 win7.img 10G
Formatting 'win7.img', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16
第二步:编辑虚机定义win7_demo.xml文件:
<domain type='kvm'>
<name>win7</name>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/zhb/IMG/win7.img'/>
<target dev='hda' bus='ide'/> //这里注意一下,我没有采用优化的virtio方式,如果你采用virtio方式,还需要从官网下载virtio下载Windows的驱动
<!-- <target dev='vda' bus='virtio'/> -->
</disk>
<disk type='file' device='cdrom'>
<source file='/zhb/ISO/cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso'/>
<target dev='hdb' bus='ide'/>
</disk>
<!--
<disk type='file' device='cdrom'> //如果你前面选择的是virtio方式,需要加这个节点
<source file='/zhb/ISO/virtio-win-0.1.141.iso'/>
<target dev='hdc' bus='ide'/>
</disk> -->
<interface type='bridge'> //虚拟机网络连接方式
<source bridge='br0'/>
<mac address="00:16:3e:5d:aa:aa"/> //为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突
</interface>
<input type='mouse' bus='ps2'/>
<input type='tablet' bus='usb'/>
<!-- <graphics type='vnc' port='-1' autoport='yes' listen = '0.0.0.0' keymap='en-us'/> -->//vnc方式登录,端口号自动分配,自动加1
<graphics type='spice' port='5932' autoport='no' listen = '192.168.222.128' passwd='password'/> //本实验就采用我们前面安装的spice client 去连接
<video>
<model type='qxl' vram='32768' heads='1'/>
<address type='pci' domain='0x0000' slot='0x02' function='0x0'/>
</video>
</devices>
</domain>
连接虚机(或域):
zhb@ubuntu:/mnt/spice-0.12.5/client$ ./spicec -h 192.168.222.128 -p 5932 -w password
这时我们就能看到熟悉的windows 安装界面了,如下所示:
点击下一步,继续安装,接受许可,继续下一步:
选择自定义高级:
接下来,进入如下界面,这里我重点说明一下,这里磁盘就是我们前面创建的10G空间磁盘,如果你的机器这里看不到磁盘,我们可以检查我们的虚机定义,即前面的win7_demo.xml文件。我们采用的是否是ide方式,如果不是ide,而是采用virtio方式,那么就需要你从官网上下载windows 的virtIo 驱动。然后将驱动的iso加载进来(就是修改虚机定义xml文件,加载iso),然后选择图中的加载驱动程序,选择对应系统的磁盘驱动即可。
安装,耐心等待即可。
进入安装界面了,我们可以站起来活动活动,泡杯茶耐心等会… 回来后我们发现已经装好了,配置用户,密码啥的就可以使用你的桌面啦~
从虚机的设备管理器里我们可以看到,网卡,显卡以及磁盘驱动都是qemu原生(或是默认的),后续文章我会继续学习VirtIO 并从虚机优化、重定向进行分析。
该系列文章《spice、qemu-kvm以及libvirt源码编译安装与使用(上、中、下)》也都是我本人自己一边学习一边记录的,如果有什么不对或不明白的地方,欢迎交流、指正~
问题:
本人尝试用virtio 启动安装虚机时,如果不改变前面的启动顺序,即hd 在前 cdrom 在后,卡在光驱启动的地方了,如下所示:
如果修改启动顺序,即cdrom 在hd前,可以启动但是一直卡在如下界面:
调了好久参数,也查了很多资料,最后我怀疑是qemu编译问题,所以我就用yum安装了qemu,再次尝试发现果然可以了,暂时还没有去研究具体编译出了什么问题,不知道大家有没有遇到过该问题,如您知道,还请您指点一下,谢谢~
好了,我们继续,前面过程和ide启动安装都是一样的,到这里就像我前面说的一样,发现不能看到我们创建的磁盘,如下:
选择加载驱动程序,当然前提是我们需要先挂载windows 的virtio 镜像文件,然后就会看到如下界面,选择virtio 光盘(另一个是系统光驱);
这里选择viostor,这个是磁盘驱动,再选择win7/x86。
接下来,我们就能看到如下界面:
点击下一步,就能看到一个可用磁盘,如下:
接下来的过程就又和ide方式一样了,我就不再啰嗦了,祝您学习愉快~~~