在安装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目录下。