如何在ubuntu上基于自定义内核安装systemtap

摘要:在进行内核中相关测试的时候,往往要用到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

你可能感兴趣的:(内核调试)