2.2. 为其它计算机生成检测模块

当用户运行一个SystemTap脚本时,SystemTap会从中创建一个内核模块。然后SystemTap会把该模块加载到内核里,这样一来它就能从内核直接提取出特定的数据。(详见第3.1节“结构”中“SystemTap会话”部分)

一般来说,SystemTap脚本只能运行在安装了SystemTap的系统上(见第2.1节,“安装和配置”)。这意味着,如果想在十个系统上运行SystemTap,你需要挨个系统安装SystemTap。在有些情况下,这既不如人意也不合实际。比如,公司内部的规章可能会禁止管理员往机器上安装提供编译器或调试信息的RPM包,这么一来SystemTap就没法安装了。为了避开这个问题,SystemTap提供了交叉检测(cross-instrumentaion)的功能。

在一台计算机上运行SystemTap脚本,生成在另一台机器上可用的SystemTap检测模块,这一过程就叫做交叉检测。这一功能提供了以下便利:

  • 仅需在单台开发机上安装适合其它机器的多个内核信息包。
  • 每个目标机器仅需安装单个RPM包来使用生成的SystemTap检测模块:systemtap-runtime(译注:所以说还是得安装新的包)

为简明起见,定义下本节用到的几个术语:

  • 检测模块 - 由SystemTap脚本创建的内核模块。SystemTap模块由主机系统创建,并且将会被分发到目标系统的目标内核上。
  • 主机系统 - 在这个系统上编译SystemTap脚本成目标系统上可用的检测模块。
  • 目标系统 - 需要应用检测模块的系统。
  • 目标内核 - 目标系统的内核。这个内核将加载和运行检测模块。

为了创建可用的检测模块,主机系统使用的硬件架构和分行版需要跟目标系统相同。

完成下面各步来配置主机系统和目标系统:

  1. 在每个目标系统上安装systemtap-runtime包。
  2. 通过运行uname -r,获取每个目标系统的内核版本。
  3. 你将在主机系统上创建适用于目标系统的检测模块。关于安装SystemTap的信息,请参考第2.1节“安装和配置”中的“安装SystemTap”。(译注:请查看官方Wiki
  4. 在主机系统上,安装跟目标内核版本一样的内核和对应的内核信息包,可以参考第2.1节中的“手动安装依赖的内核调试信息包”。如果多个目标系统使用的内核版本不一样,每种内核版本都要安装一次。

完成了这几步后,你现在可以在主机系统上给所有的目标系统创建检测模块了。

要想创建检测模块,在主机系统运行下面命令(记得把kernel_version等改成实际的值):

  1. stap -r kernel_version script -m module_name

在这里,kernel_version表示目标系统的版本(目标系统上uname -r的输出),script表示需要编译成检测模块的脚本,而module_name则是你给检测模块起的名字。

要想获得当前内核的硬件架构,你可以运行下面的命令: uname -m

一旦检测模块编译好了,把它分发到目标系统,然后加载它:

  1. staprun module_name.ko

举个例子,需要从SystemTap脚本simple.stp中创建检测模块simple.ko,来应用于版本为2.6.18-92.1.10.el5的目标系统(x86_64架构),使用下面命令:

  1. stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple

这将创建一个名为simple.ko的模块。把它复制到目标系统并在目标系统上运行下面命令:

  1. staprun simple.ko