libvmi是用来进行虚拟机自省的。
本机环境:centos6.5 64位
通过virsh version查看xen的信息
Compiled against library: libvirt 1.2.10
Using library: libvirt 1.2.10
Using API: Xen 1.2.10
Running hypervisor: Xen 4.4.0
安装教程http://libvmi.com/docs/gcode-install.html
开始之前,要确保已经安装了基本的开发环境,包括gcc,make,autoconf等。可以直接使用yum groupinstall "Development Tools" 安装,但是看到有90多M的包下,我就放弃了,因为里面有很多是现在不需要的,而且使用xen时尽量不在dom0里装过多的东西,这也是为了系统的稳定,所以我选择了一个个安装,原则是“缺啥补啥”,肯定比较麻烦,但这是个学习的过程嘛
先安装gcc
yum -y install gcc
然后安装make
yum intall make
然后安装autoconf
yum install autoconf
暂时装这些,等后面报错了再看需要啥把。
然后按照文档中的说明安装依赖包
首先是libxc
下载http://www.tddft.org/programs/octopus/wiki/index.php/Libxc_2.2.2
./configure
报错could not find Fortran 90 compiler
缺啥补啥
yum install gcc-gfortran
然后就是安装三部曲
./configure
make
make install
下来安装第二个依赖包 yacc(Yet Another Compiler Compiler,是一个经典的生成语法分析器的工具)
yum install byacc
然后安装flex(LEXical compiler,主要功能是生成一个词法分析器scanner的C源码)
yum install flex
接下来安装glib,请看这里http://www.cnblogs.com/chasonzhang/p/4532934.html#rightway
照着这里面做,报了个错
configure: error: *** Working zlib library and headers not found ***
yum install zilb发现已安装,那就
yum install zlib-devel
然后再./configure
又报错
checking for LIBFFI... no
configure: error: Package requirements (libffi >= 3.0.0) were not met:
No package 'libffi' found
yum install libffi发现已安装,那就
yum install libffi-devel
然后再./configure
bingo!下面不说了
所有的依赖包都装好后,该我们的主角libvmi登场了。
将下载的包解压后,进入解压后的目录,运行
./autogen.sh
报错
Error: could not find libtoolize or glibtoolize
yum intall libtool
再次./autogen.sh
然后./configure
报错
No package 'glib-2.0' found
试着把glib-2.0.pc这个文件的路径/usr/local/lib/pkgconfig加到PKG_CONFIG_PATH这个环境变量中,pkg-config程序通过.pc后缀的文件向用户程序提供相应库的路径、版本号等信息
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
然后再./configure
方法有效,输出中看到checking for GLIB... yes
但又报了另一个错误
No package 'check' found
yum install check
yum install check-devel
再次./configure
bingo!
然后make报错了
我先安装了bison
yum install bison
然后卸载了yacc
yum remove byacc
其实bison和yacc的功能差不多,所以没啥用,只是我病急乱投医罢了
最后的解决办法:
./configure --prefix=/usr --with-included-apr
然后make
make install
ldconfig(它的作用请看http://linux.die.net/man/8/ldconfig)
exit(作用 不详 )
-------------------------------------------------------------------------------------------------------------------------------
接下来是libvmi的配置
为了正常工作,需要在$HOME/etc/或者 /etc/下创建一个配置文件libvmi.conf,我们选择创建在/etc目录下
要在这个配置文件中为libvmi将要访问的每个虚拟机或者内存镜像设置一个条目,需要指明操作系统的类型(例如 Linux或Windows),symbolic information的位置,虚拟机或内存镜像中要访问数据的偏移量。格式如下:
<vm name or filename>{
<key> = <value>;
<key> = <value>;
}
虚拟机名字可以通过xm list或xl list或virsh list得到.
下面是一些key的说明(一共九个)
其中第一个windows和linux都适用,第二个只适用于linux,接下来三个linux开头的用于linux,windows开头的用于windows
然后到底怎么得到这些值呢?
在libvmi-0.10.1/tools/目录下可以找到一个叫做linux-offset-finder的工具,把这个文件夹拷贝到domU里面(要用root用户登录domU,至于怎么拷贝,我是用163发过去的),然后make,如图
然后报了下面的错误
进入那个目录,发现有个build的链接文件
但是这个build链接失效了,双击它会报出这样的错误
yum install kernel-xen-devel
make继续报错
然后yum install kernel-headers
make还是报错
怀疑是不是要
lgconfig
还是不行。
后来发现是安装的版本不对,我使用的内核是2.6.18-398.el5-xen
而安装的kernel-xen-devel版本是
kernel-xen-devel-2.6.18-404.el5
所以这次重装一下,指定版本号
yum install kernel-xen-devel-2.6.18-398.el5
这里有个命令
uname -a; rpm -qa kernel\* | sort 可以列出你当前使用的内核和安装了哪些版本
为了防止出错,我们使用把404版本的都卸载掉
如yum remove kernel-headers-2.6.18-404.el5
另一个类似
然后我们发现lib/modules/2.6.18-398.el5xen/下的include能打开了,它指向的是/usr/src/kernels下面对应版本的文件夹
然后我们满心欢喜的make,又报错了
gcc command not found
缺啥补啥,yum install gcc
这次make就没有报错
然后使用insmod findoffsets.ko将模块插入内核
如果想将模块从kernel中移除,使用rmmod findoffsets
我们先将其移除,然后使用 insmod findoffsets.ko -s重新将其载入kernel
-s 是将所有信息记录在系统记录文件中
这次报了个错误
如果这个可以成功的话,我们可以再/var/log/syslog中找到我们需要的信息,但是不成功也没 关系,我们依然可以使用dmesg来查看调试信息
原来 -s 和 --syslog都不是有效的参数,可是网上的参考资料都说有这参数啊,算了不管了,我们要得东西得到就行了。
把上面的信息拷贝到dom0中的中的/etc/libvmi.conf中吧。
然后把[domain name]整个替换为虚拟机的名词,此处为centos5.1
然后设置一下sysmap的路径吧
在domU中的/boot/下找到System.map文件,拷贝到dom0的/boot/domU目录下
然后libvmi.conf的配置如下:
配置好了之后,我们可以试着运行以下examples目录下的process-list
可以看到,成功的在dom0内获得了domU(此处的centos5.1)中的进程列表。
我们再试一下获取domU中的内核模块
之前配置LibVMI的时候用到了一个叫做findoffsets的模块,我们可以看到LibVMI可以动态的监控这个模块被插入内核和从内核中移除: