Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

服务器端基于ubuntu1604系统(ubuntu1804也试过,但是因为系统版本太新,spice相关依赖包编译有bug而失败了),采用virt-manager+kvm的方式搭建虚拟机运行环境,远程虚拟化协议采用spice。其中远程虚拟机运行的是win7系统。

本地客户端是windows10系统,安装virt-viewer软件用于访问spice远程虚拟机云桌面。


1)首先运行如下命令,查看cpu是否支持硬件虚拟化功能(一般都支持。虚拟化开关没打开也不行,需要进BIOS打开对应选项),如果支持才能进行后面的一系列操作。

~$ egrep "(vmx|svm)" --color /proc/cpuinfo


2)创建一个本地目录,用于存放spice相关源码包和远程虚拟化相关依赖包。

~$ mkdir spice-sources


3)然后是安装必需的虚拟机管理器、kvm环境和相关依赖包。

~$ sudo apt install qemu qemu-kvm virt-manager virt-viewer libvirt-bin bridge-utils build-essential autoconf git-core libtool liblog4cpp5-dev libavcodec-dev libssl-dev xlibmesa-glu-dev libasound-dev libpng12-dev libfreetype6-dev libfontconfig1-dev libogg-dev libxrandr-dev kvm libgcrypt-dev libsdl-dev libnss3-dev libpixman-1-dev libxfixes-dev libjpeg8-dev libsasl2-dev python-pyparsing manpages-posix manpages-posix-dev glibc-doc spice-client-glib-usb-acl-helper spice-client-gtk spice-vdagent libglib2.0 libpixman-1-dev libssl-dev libjpeg-dev libsasl2-dev libssl-dev libpixman-1-dev libjpeg-turbo8-dev libusb-1.0 libgtk-3-dev virtinst ubuntu-vm-builder uml-utilities

创建完kvm模块,可以用命令验证是否已经安装成功,输入如下命令:

~$ sudo virsh -c qemu:///system list

如果返回如下截图,这说明kvm已经安装完毕。

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云


4)搭建spice相关虚拟化环境。spice包含3部分:client、protocol和server。

4.1)首先要安装支持智能卡的相关依赖包。

~$ git clone git://people.freedesktop.org/~alon/libcacard

~$ cd libcacard/

~$ ./autogen.sh --enable-debugger LDFLAGS='-pthread'

~$ make && sudo make install && cd ..

 

4.2)安装spice协议。

~$ wget http://spice-space.org/download/releases/spice-protocol-0.12.13.tar.bz2

~$ tar xjvf spice-protocol-0.12.13.tar.bz2

~$ cd spice-protocol-0.12.13/

~$ mkdir m4

~$ ./configure

~$ make && sudo make install && cd ..

 

4.3)安装usb重定向相关库(也可以不安装。如果不安装,则远程访问虚拟云桌面时,客户端的U盘等设备远程虚拟机无法通过重定向挂载和识别)。

~$ wget http://www.spice-space.org/download/usbredir/usbredir-0.7.1.tar.bz2

~$ tar xvf usbredir-0.7.1.tar.bz2

~$ cd ../usbredir-0.7.1/

~$ ./configure --prefix=/usr

~$ make && sudo make install && cd ..

 

4.4)安装图形渲染包和依赖库。

~$ wget http://spice-space.org/download/stable/qpixman-0.13.3-git20090127.tar.bz2

~$ tar xvf qpixman-0.13.3-git20090127.tar.bz2

~$ cd qpixman-0.13.3-git20090127/

~$ ./autogen.sh --includedir=/usr/include --libdir=/usr/lib64

~$ make && sudo make install && cd ..

 

4.5)安装celt-0.5.1.3(我尝试按照网上说的编译安装celt-0.11.3版本,但是最后发现spice跟它无法匹配,只能安装celt-0.5.1.3版本spice才可以正常工作)。

~$ wget http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
~$ tar xvzf celt-0.5.1.3.tar.gz

~$ cd celt-0.5.1.3/

~$ ./configure

~$ make && sudo make install && cd ..

 

4.6)安装图形渲染部件cairo(spice要求一个修改版本的Cairo图形库,称为qcairo)。

~$ wget http://spice-space.org/download/stable/qcairo-1.8.7.1-git74d6b5.tar.bz2

~$ tar xvf qcairo-1.8.7.1-git74d6b5.tar.bz2

~$ cd qcairo-1.8.7.1-git74d6b5/

在编译和安装cairo之前,需要先在系统中创建qpixman对应的软链接。

~$ cd /usr/lib/pkgconfig/

~$ sudo ln -s /usr/lib64/pkgconfig/qpixman-1.pc qpixman-1.pc

~$ cd -

~$ ./autogen.sh

如果上面的./autogen.sh这一步报错,尝试改成下面这条命令执行:

~$ ./autogen.sh --disable-xlib --disable-ps --disable-pdf --disable-svg --includedir=/usr/include --libdir=/usr/lib64

~$ make && sudo make install && cd ..

 

4.7)安装spice客户端。

~$ wget http://spice-space.org/download/releases/spice-0.12.8.tar.bz2

~$ tar xjvf spice-0.12.8.tar.bz2

~$ cd spice-0.12.8/

~$ ./configure --enable-smartcard

~$ make && sudo make install && cd ..

 

4.8)安装spice-gtk。在安装spice-gtk之前,需要安装gstreamer相关的依赖包,否则配置spice-gtk时无法使用依赖于gstreamer的相关功能(在ubuntu1604上请按照下面顺序依次安装依赖软件包,用一条命令合并安装时会报“E: 无法定位软件包 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad”的错误)。

~$ sudo apt install autotools-dev devhelp doxygen pkg-config devscripts

~$ sudo apt install libgstreamer1.0-dev gstreamer-tools gstreamer1.0-tools gstreamer1.0-doc

~$ sudo apt install gstreamer1.0-plugins-base libgstreamer-plugins-base1.0-dev

~$ sudo apt install gstreamer1.0-plugins-good

~$ sudo apt install gstreamer1.0-plugins-ugly

~$ sudo apt install gstreamer1.0-plugins-bad

~$ sudo apt install gstreamer1.0-vaapi gstreamer1.0-libav

安装完依赖包后,就可以开始下载安装spice-gtk了。

~$ wget https://www.spice-space.org/download/gtk/spice-gtk-0.34.tar.bz2

~$ tar xjvf spice-gtk-0.34.tar.bz2

~$ cd spice-gtk-0.34

~$ export LD_LIBRARY_PATH=/usr/local/lib

~$ export PKG_CONFIG=/usr/bin/pkg-config

~$ export PKG_CONFIG_PATH=/usr/local

~$ ./configure --prefix=/usr/local --with-gtk=3.0 --enable-usbdir=yes --enable-usbredir=yes --enable-gstaudio=gstreamer --enable-gstvideo=gstreamer --enable-smartcard=yes --with-sasl=no --with-audio=yes

 --with-audio=yes表示打开虚拟机的声音,--enable-usbredir=yes表示打开usb重定向功能,--enable-smartcard=yes表示支持智能卡(上文已安装智能卡相关依赖包),--enable-gstvideo=gstreamer表示使用gstreamer视频框架。

~$ make && sudo make install && cd ..

注:如果没有提前安装好usbredir-0.7.1.tar.bz2依赖包,则在后续运行virt-manager打开kvm虚拟机时,会提示“spice-client-error-quark: usb redirection support not compiled in (0)”,导致无法连接到虚拟机,也看不到虚拟机的桌面。

 

4.9)配置spice到.bashrc中。

~$ echo "export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}" >> ~/.bashrc

~$ source ~/.bashrc

 

4.10)创建qemu软链接。

~$ sudo ln -s /usr/bin/qemu-system-x86_64 /usr/sbin/qemu-spice


5)打开:应用程序 -> 系统工具 -> 虚拟系统管理器(即virt-manager),运行虚拟机管理器,来创建对应的远程虚拟机。

参考如下链接按照默认选项一步步走下来,即可创建一个kvm虚拟机(我创建了一个win7的虚拟机):https://www.ilanni.com/?p=6101

虚拟机创建完成后,在virt-manager界面上点击:编辑 -> 链接详情。在弹出的对话框中,鼠标切换到虚拟网卡选项卡界面,勾选“自动启动:引导时”。如下图步骤1和2所示操作:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

然后用鼠标切换到网络接口选项卡界面,删掉默认的default选项(必须删掉,然后重新新建一个桥接虚拟网卡,这样才能让虚拟机也作为一个局域网的设备被其它端发现),然后新建一个名为虚拟桥接网卡。如下图步骤1-3所示操作:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

在后续界面中,新建一个名称默认为br0(名字任取,记住就行,我这里是br1)的虚拟桥接网卡。按下图步骤1-6所示操作。如果连接的是路由器自动分配IP,那么IP设置为下图所示DHCP默认配置;如果使用的是静态IP,则IP设置需要点击“配置”来手动配置。进行桥接的接口需要全部勾选。

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

剩下的就是需要配置kvm虚拟机的相关属性了。回到virt-manager主界面,按下面步骤1和2打开虚拟机界面:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

在弹出的虚拟机界面中,切换到硬件详情页,修改如下内容:a)虚拟网络接口:网络源选为上面创建的“桥接br1”,设备型号选为“管理程序默认”,然后点右下角“应用”;b)显示协议Spice:Spice服务器类型选为“Spice服务器”,地址选“所有接口”,端口去掉自动勾选框选择5901(默认5901,端口号可以往后递增),然后点右下角“应用”;c)显卡QXL:视频型号选择“QXL”(如果远程采用的是VNC协议,则视频型号选VGA),然后点右下角“应用”。如下面3个截图所示:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

做完以上步骤,打开虚拟机,就可以看到虚拟机已经运行起来了。此时回到本地win10上,打开virt-viewer软件来远程访问虚拟机桌面。在地址栏填上如下所示命令,然后点击“Connect”就可以连接远程虚拟机桌面。地址栏填入的IP是ubuntu主机在局域网的IP地址,而不是虚拟机在局域网内的IP地址。

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

连接成功后远程桌面截图:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

如果在win10下无法通过virt-viewer连上远程虚拟机,有可能是ubuntu的防火墙拦截了spice连接请求。只需要运行如下命令将系统防火墙关闭即可:

~$ sudo ufw disable

如果是其它原因导致的无法连接,则需要结合实际情况具体分析了。


6)关于usb重定向的相关说明。

win10上安装的是virt-viewer6.0版本(因为最新的7.0版本要求spice-gtk版本必须不低于3.5,而本文使用的是spice-gtk3.4),当然也可以安装其它版本的,但usb重定向不一定有效(我还安装了virt-viewer2.0版本,界面上的usb重定向一栏就是灰色不可选的情况)。下载链接:https://releases.pagure.org/virt-viewer/。

先运行virt-viewer连接到远程虚拟机并进入到桌面,然后插入一个U盘到win10电脑上,点选virt-viewer窗口上的“File”->“USB device selection”,如下图步骤1和2所示。

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

然后在弹出的界面中勾选U盘对应的设备并点击“Close”关闭对话框。需要注意的一点是,键盘鼠标不要勾选usb重定向,否则会导致在win10和虚拟机下键鼠工作异常。如下图:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云

这时远程虚拟机win7右下角会有提示发现新硬件并自动更新和安装驱动程序,等这一切工作完毕,打开“计算机”,就可以看到U盘已经被重定向到虚拟机中了。如下图:

Ubuntu1604下使用qemu+kvm搭建spice虚拟化云


7)附参考的技术资料:

ubuntu搭建spice环境相关:

https://blog.csdn.net/ggg_xxx/article/details/77429176

http://blog.chinaunix.net/uid-29833502-id-5773669.html

https://www.cnblogs.com/gleaners/p/5603856.html

https://blog.csdn.net/a10747029/article/details/54584101?locationNum=11&fps=1

https://blog.csdn.net/wj_j2ee/article/details/7817811

https://blog.csdn.net/rebackhua/article/details/55511489

https://www.cnblogs.com/jython/p/4301944.html

https://www.cnblogs.com/fuleying/p/3669228.html

virt-viewer相关:

https://blog.csdn.net/qq_33932782/article/details/54949442

https://www.cnblogs.com/jython/p/4301568.html

http://www.cnblogs.com/xuyaowen/archive/2018/07/18/virt-viewer-remote-qemu-vm.html

virt-manager和kvm相关:

https://www.jb51.net/article/94087.htm

https://www.ilanni.com/?p=6101

https://yq.aliyun.com/articles/43040

virt-manager配置网络相关:

http://blog.sina.com.cn/s/blog_53923f940100x1b1.html

https://www.linuxidc.com/Linux/2016-05/131228.htm

https://www.cnblogs.com/dunitian/p/4714249.html