在安装Mellanox OFED软件包时,将要卸载掉系统自带的一部分软件包,根据yum的依赖包推导规则,一些重要的虚拟化软件包也被卸载掉了。

Dependency Removed:
  gnome-boxes.x86_64 0:3.14.3.1-7.el7              libibverbs-devel.x86_64 0:1.1.8-8.el7    libibverbs-devel-static.x86_64 0:1.1.8-8.el7   
  libibverbs-utils.x86_64 0:1.1.8-8.el7            libipathverbs.x86_64 0:1.3-2.el7         librdmacm.x86_64 0:1.0.21-1.el7               
  libvirt-daemon-kvm.x86_64 0:1.2.17-13.el7_2.3    qemu-kvm.x86_64 10:1.5.3-105.el7_2.4   

如果使用yum将虚拟化软件装回来,yum又会根据依赖安装与Mellanox OFED不兼容的软件包。这次真正地体会到了Linux的 依赖地狱

为解决这个问题,只能使用qemu的源代码编译安装qemu,由于libvirt也依赖于qemu,所以也要重新编译libvirt。编译qemu的过程可以参照《KVM虚拟化技术:实战与原理解析》一书中的内容,只要安装好相关的依赖包即可。

而libvirt源码编译安装则存在较多的问题。需要仔细处理。

libvirt安装目录问题

首先要指出,如果只使用libvirt提供的virsh命令行工具或者图形界面的话,其实问题并不大。但是如果要使用libvirt提供的API接口,则要注意安装目录的问题。

在libvirt 1.3.0及此后的版本,又添加了virtlogd(Virtual machine log manager)服务,使用时应当注意也要启动这个服务。

如果使用git clone从libvirt的git仓库获得源代码的话,需要运行:

./autogen.sh

这个脚本会运行automake等自动编译工具生成makefile树。但由于我的环境与libvirt要求的automake版本不兼容,所以直接从网站上下载了特定版本的源代码。

如果编译时,使用默认的./configure,那么libvirt将会安装到/usr/local目录下,而Linux开发版的libvirt软件包则安装于/usr目录下。二者存在区别。同时,这样编译安装的libvirt无法以服务的形式控制,用systemctl无法查看它的状态。

如果编译安装时将libvirt装在了/usr/local目录下,则可以使用下列命令启动:

/usr/local/sbin/libvirtd -d 
/usr/local/sbin/virtlogd -d

在编译时,使用这样的选项指定安装目录为系统目录:

./configure --prefix=/usr

make

make install

就可以达到与发行版软件包一样的效果。也可以使用systemctl控制libvirtd服务。可以使用systemctl启动libvirtd:

systemctl start libvirtd
systemctl start virtlogd

libvirt的卸载

可以运行下述命令卸载libvirt:

make uninstall

libvirt-python编译安装

libvirt的python API由软件包libvirt-python提供,与原有的libvirt代码库分离。

如果编译安装了libvirt,就不要使用yum或apt-get安装发行版的libvirt-python软件包。因为libvirt-python的依赖包是libvirt-client,yum会自动安装这个包,这会导致系统内存在两个virsh文件,或者导致编译生成的文件被覆盖。所以这个软件包也需要编译安装。

libvirt-python与其他python软件包的结构相同,都使用setup.py文件进行安装。但它具有一定的特殊性,要指定libvirt的源文件目录才能安装成功,否则会安装出错。在我使用的环境下,安装的命令为:

../libvirt-1.3.5/run python setup.py build
../libvirt-1.3.5/run python setup.py install

上述命令的关键在于要使用libvirt源文件目录中的run脚本运行python,而且 编译时的工作目录一定要处于libvirt-python源文件目录中

注意/Attention

如果libvirt安装在/usr/local目录下,使用libvirt-python的API时可能会出现路径错误。因为libvirt会在/usr/local/var/run目录下生成libvirt-sock,而libvirt-python的API会查找/var/run目录。所以出现相关问题可以先卸载原先安装的libvirt,然后再将libvirt重新安装到/usr目录下。