本文我们来讲讲linux核心版本的gentoo如何安装kvm+spice及安装opencv的步骤过程,对gentoo感兴趣的朋友可以看看。
gentoo安装kvm+spice
很早之前就听说spice相对vnc来说要强大很多,之前因为安装的是32位的系统,没法进行尝试,安装了64位的系统之后,还没时间去折腾过。
上上周其实已经将以前的windows虚拟机的图形方式从vnc换成了spice,昨天又搞定了agent的启动和远程复制粘贴。
先说下安装,安装的过程相对比较方便,首先需要卸载原来安装的app-emulation/qemu-kvm,因为之后要安装的拥有spice功能的kvm和这个包是相互block的。卸载了之后,就需要重新emerge app-emulation/qemu-kvm-spice这个包。否则直接在virt-manager中将虚拟机的显示从vnc切换到spice,在启动的时候会提示这个版本的kvm不支持spice协议。其他和spice相关的包还有:app-emulation/spice,app-emulation/spice-protocol等,如果要在virt-manager中直接接入到spice界面,需要安装net-misc/spice-gtk这个包(不过我在kde中用的时候,发现用net-misc/spice-gtk的时候,会导致整个界面都变成透明的,估计是因为gtk和kwin的特效不太兼容)。
安装还是非常简单的,安装完成之后,就要重新配置原来的windows虚拟机了。在virt-manager中删掉原来的vnc显示,新增一个graphics,类型选择spice server。将原来视频中使用的虚拟显卡换成qxl,这样启动虚拟机之后,就会使用spice了。
前面说到了kde中使用spice-gtk有很多不正常的地方,所以我是直接使用spicec这个命令的,因为没有配置任何的加密,所以连接非常简单,直接使用:
spicec -h 127.0.0.1 -p 5900
端口号可以在增加spice server的时候设置,如果选择自动分配,那么会从5900开始递增分配。
启动之后,需要给里面的windows安装驱动,windows需要的所有二进制文件,都可以在http://spice-space.org/download.html这里的Windows binaries中找到。首先下载qxl driver,在windows提示需要安装驱动文件的时候,安装这个qxl driver,就可以完成了spice显示的功能了。
之前按照http://www.linux-kvm.com/content/rhev-spice-guest-drivers-released-windows这个页面安装windows驱动,前面安装qxl非常方便,但是后面的vdi port driver却一直没有提示需要安装,在最后一步Install SPICE agent之后,这个服务一直无法启动,第一次的尝试spice就到此为止了。
之后又继续搜索了下这个spice agent无法启动,在redhat的bugzilla中发现原来现在sprice agent已经不通过vdi了,需要通过virtio-serial来进行交互。在virt-manager的界面上,怎么样都找不到如何添加这个设备的方法,最后只能通过编辑虚拟机配置文件的方式直接修改了。通过使用virsh edit XXX (XXX为虚拟机的名字),会打开虚拟机的配置文件,根据libvirt网站上的介绍,在devices标签中增加了两个channel:
- <channeltype=’pty’>
- <targettype=’virtio’name=’arbitrary.virtio.serial.port.name’/>
- <addresstype=’virtio-serial’controller=’0′bus=’0′port=’1’/>
- </channel>
- <channeltype=’spicevmc’>
- <targettype=’virtio’name=’com.redhat.spice.0’/>
- <addresstype=’virtio-serial’controller=’0′bus=’0′port=’2’/>
- </channel>
保存这个配置文件,启动虚拟机,这个时候windows又会提示发现了新硬件,需要使用spice下载页面上的Windows virtio-serial driver进行安装,安装完成之后,重新安装下spice agent,这个时候spice agent服务就能够正常启动了,通过这个服务,虚拟机就能够和宿主机共享剪切板了.
gentoo安装opencv
之前的基于opencv的应用,在换了gentoo之后,读取png的图片的时候会提示:
libpng warning: Application was compiled with png.h from libpng-1.2.29
libpng warning: Application is running with png.c from libpng-1.4.5
写了个脚本之后,发现这个应用依赖的png库都是1.4.5的,上面的提示是libpng在编译时指定错了版本,虽然我本地有1.2和1.4两个版本的libpng,但是头文件只有1.4的,仔细看了下编译完的目录,通过搜索png.h这个关键字,发现竟然以来了opencv里面自带的libpng,按理说如果发现了系统的libpng之后,就不应该再用自带的libpng了,最后在highgui模块的cmakelists.txt文件中发现了这些内容:
- if(WITH_JPEG)
- add_definitions(-DHAVE_JPEG)
- if(NOTJPEG_FOUND)
- set(use_3rdpartyTRUE)
- endif()
- endif()
- if(WITH_PNG)
- add_definitions(-DHAVE_PNG)
- if(NOTPNG_FOUND)
- set(use_3rdpartyTRUE)
- endif()
- endif()
- if(WITH_TIFF)
- add_definitions(-DHAVE_TIFF)
- if(NOTTIFF_FOUND)
- set(use_3rdpartyTRUE)
- endif()
- endif()
- if(WITH_JASPER)
- add_definitions(-DHAVE_JASPER)
- if(NOTJASPER_FOUND)
- set(use_3rdpartyTRUE)
- endif()
- endif()
- if(use_3rdparty)
- include_directories(“${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/include”)--phpfensi.com
- endif()
也就是说,这几个库里面任意一个没有的话,都会把3rdparty/include这个目录加入到头文件的搜索目录中,gentoo在emerge的时候,默认是没有USEjpeg2k的,也就是不使用系统的jasper库,导致引用了自带的png.h.
找到了原因之后,解决起来就很方便了,在emerge opencv之前,确保把jpeg2k加入到USE中即可.