gentoo安装kvm+spice及opencv教程

本文我们来讲讲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:

  1. <channel type=’pty’>
  2. <target type=’virtio’ name=’arbitrary.virtio.serial.port.name’/>
  3. <address type=’virtio-serial’ controller=’0′ bus=’0′ port=’1’/>
  4. </channel>
  5. <channel type=’spicevmc’>
  6. <target type=’virtio’ name=’com.redhat.spice.0’/>
  7. <address type=’virtio-serial’ controller=’0′ bus=’0′ port=’2’/>
  8. </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文件中发现了这些内容:

  1. if(WITH_JPEG)
  2. add_definitions(-DHAVE_JPEG)
  3. if(NOT JPEG_FOUND)
  4. set(use_3rdparty TRUE)
  5. endif()
  6. endif()
  7. if(WITH_PNG)
  8. add_definitions(-DHAVE_PNG)
  9. if(NOT PNG_FOUND)
  10. set(use_3rdparty TRUE)
  11. endif()
  12. endif()
  13. if(WITH_TIFF)
  14. add_definitions(-DHAVE_TIFF)
  15. if(NOT TIFF_FOUND)
  16. set(use_3rdparty TRUE)
  17. endif()
  18. endif()
  19. if(WITH_JASPER)
  20. add_definitions(-DHAVE_JASPER)
  21. if(NOT JASPER_FOUND)
  22. set(use_3rdparty TRUE)
  23. endif()
  24. endif()
  25. if(use_3rdparty)
  26. include_directories(“${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/include”) --phpfensi.com
  27. endif()

也就是说,这几个库里面任意一个没有的话,都会把3rdparty/include这个目录加入到头文件的搜索目录中,gentoo在emerge的时候,默认是没有USEjpeg2k的,也就是不使用系统的jasper库,导致引用了自带的png.h.

找到了原因之后,解决起来就很方便了,在emerge opencv之前,确保把jpeg2k加入到USE中即可.