当用户运行一个SystemTap脚本时,SystemTap会从中创建一个内核模块。然后SystemTap会把该模块加载到内核里,这样一来它就能从内核直接提取出特定的数据。(详见第3.1节“结构”中“SystemTap会话”部分)
一般来说,SystemTap脚本只能运行在安装了SystemTap的系统上(见第2.1节,“安装和配置”)。这意味着,如果想在十个系统上运行SystemTap,你需要挨个系统安装SystemTap。在有些情况下,这既不如人意也不合实际。比如,公司内部的规章可能会禁止管理员往机器上安装提供编译器或调试信息的RPM包,这么一来SystemTap就没法安装了。为了避开这个问题,SystemTap提供了交叉检测(cross-instrumentaion)的功能。
在一台计算机上运行SystemTap脚本,生成在另一台机器上可用的SystemTap检测模块,这一过程就叫做交叉检测。这一功能提供了以下便利:
systemtap-runtime
(译注:所以说还是得安装新的包)为简明起见,定义下本节用到的几个术语:
为了创建可用的检测模块,主机系统使用的硬件架构和分行版需要跟目标系统相同。
完成下面各步来配置主机系统和目标系统:
systemtap-runtime
包。uname -r
,获取每个目标系统的内核版本。完成了这几步后,你现在可以在主机系统上给所有的目标系统创建检测模块了。
要想创建检测模块,在主机系统运行下面命令(记得把kernel_version
等改成实际的值):
stap -r kernel_version script -m module_name
在这里,kernel_version
表示目标系统的版本(目标系统上uname -r
的输出),script
表示需要编译成检测模块的脚本,而module_name
则是你给检测模块起的名字。
要想获得当前内核的硬件架构,你可以运行下面的命令:
uname -m
一旦检测模块编译好了,把它分发到目标系统,然后加载它:
staprun module_name.ko
举个例子,需要从SystemTap脚本simple.stp
中创建检测模块simple.ko
,来应用于版本为2.6.18-92.1.10.el5
的目标系统(x86_64架构),使用下面命令:
stap -r 2.6.18-92.1.10.el5 -e 'probe vfs.read {exit()}' -m simple
这将创建一个名为simple.ko
的模块。把它复制到目标系统并在目标系统上运行下面命令:
staprun simple.ko