摘要:在进行内核中相关测试的时候,往往要用到systemtap,而这个软件依赖于内核符号表/调试信息/内核头文件等等,如果我们想测试最新的内核特性,就需要安装带有debuginfo的内核和相关头文件。本文主要讲解了ubuntu上如果在自己编译的内核下安装使用systemtap。
最近的elfultils的下载地址: https://fedorahosted.org/releases/e/l/elfutils/
最新systemtap 的下载地址: http://sourceware.org/systemtap/ftp/releases/
发行版本内核上system的安装与使用:
http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu
unbuntu下自定义内核上systemtap的安装: http://blog.chinaunix.net/uid-7427553-id-2627651.html
1.安装systemtap需要的准备工作:
在安装SystemTap之前,需要确保系统中已经安装了其它两个软件包:
1)kernel-debuginfo RPM:SystemTap需要通过 内核调试信息来定位内核函数和 变量的位置。对于通常的发行版,并没有安装kernel-debuginfo
RPM,我们可以到发行版的下载站点下载:对应自己编译的内核,我们需要开启下列选项:
CONFIG_DEBUG_INFO, CONFIG_KPROBES, CONFIG_RELAY, CONFIG_DEBUG_FS,
CONFIG_MODULES, CONFIG_MODULE_UNLOAD, CONFIG_UTRACE
2)elfutils RPM:SystemTap需要elfutils 软件包提供的库函数来分析调试信息。目前的SystemTap要求安装elfutils-0.123以上版本。目前最新的版本是0.156,我们尽量选择最新的elfutils,这里是官方下载地址: https://fedorahosted.org/releases/e/l/elfutils/
运行Systemtap的前提条件是:
- 内核支持并配置了kprobe(2.6.11和以上) :原因:调试内核需要,在进行内核编译之前的配置
- 内核模块编译环境(即编译内核模块所需的内核头文件以及模块配置信息,对于Fedora core或Redhat指kernel-devel或kernel-smp-devel RPM包) :对应自己编译的内核就是内核头文件。
- 内核调试信息(对于Fedora core或Redhat指kernel-debuginfo RPM包)
- C编译环境(即libc库头文件和编译工具链) :对于自己编译的内核,这一点比较好满足,因为运行环境和我们编译内核的环境是一致的,不用特殊处理
- 有libdwfl的elfutils(只有支持libwdfl的elfutils,systemtap才能正常工作,如果您的系统的elfutils较旧,您必须下载elfutils源码包来编译,systemtap能够和elfutils一块编译,使用命令./configure --with-elfutils=/path/to/elfutils/dir --prefix=yourpatch)
- root权限(为了运行Systemtap,您必须具有root权限)
2.内核方面的准备:(我们假设要编译的内核源码位置是/usr/src/linux)
如果你是发行版的内核,没有自己进行编译,请参考这里:
http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu
如果你需要自己编译内核,那么意味着apt-get install的systemtap是不能直接使用的,内核的准备过程如下:
1)首先,编译生成带有内核符号表和调试信息的内核镜像和相关内核头文件。
这个过程中,我们不使用传统的config,make,makeinstall命令(传统命令是make modules_install install headers_install),建议使用kernel-package工具,可以把内核和内核头文件都打包安装,这样比较方便。具体可以参考这里: http://blog.chinaunix.net/uid-7427553-id-2627651.html
(1)进入源代码目录:$: cd /usr/src/linux
(2)进行相关配置
(3)安装内核源码编译的集成命令: $:sudo apt-get install kernel-package
(4)编译内核源码 $:
make-kpkg --initrd --revision 3.11 --append-to-version -zswap kernel_image kernel_headers
2)安装相应的内核和头文件并设置相关的连接
具体可以参考这篇博文: http://blog.chinaunix.net/uid-7427553-id-2627651.html
上一步生成的内核安装包和头文件的安装包,在运行make-kpkg命令的父目录之中,进入
(1)进入父目录:$cd ..
(2)安装都内核镜像包和头文件包:
$:dpkg -i [thekernel.deb]
$:dpkg -i [thekernelheaders.deb]
(3)将编译内核时的build树链接到 /lib/modules/`uname -r`/build(
内核编译的时候,这一步一般自动完成了,可以使用
3.systemtap与elfutils的安装
1)卸载系统已经安装的systemtap(发行版对应的):
首先,如果你的系统已经使用apt-get安装了systemtap,尽量在这一步先卸载已经安装的systemtap。如果不进行卸载,在mmtests等软件运行的时候调用的命令stap来自于原来已经安装的systemtap,是无法在新内核上运行的。
2)安装systemtap和elfutils:
下载最新的systemtap和elfutils源码:注意,此处一定要下载最新的源码自己安装,否则可能会造成编译以后的软件无法运行
最近的elfultils的下载地址: https://fedorahosted.org/releases/e/l/elfutils/
最新systemtap 的下载地址: http://sourceware.org/systemtap/ftp/releases/
一块编译:
将2个包解压到2个不同的目录,然后进入systemtap包目录,执行
./configure --with-elfutils=/path/to/elfutils/dir --prefix=yourpatch
make
make install
总结:这一步的关键是软件版本一定要是最新的(如果测试最新内核),环境变量要进行设置。
注意:
如果我们设置了安装路径,一定要把对应systemtap安装路径下面的bin添加到环境变量PATH之中,否则,mmtests调用stap的时候会发现找不到这个程序。
安装完成以后,我们使用下面的shell命令进行测试,如果输出hello world,说明systemtap安装成功。
$:stap -ve 'probe begin { log("hello world") exit() }'
本文来源:谁不小心的CSDN博客 如何在ubuntu上基于自定义内核安装systemtap