SystemTap是一种可以探测内核行为的探针工具,在张师傅的博客里就多次用到这个工具。本文主要记录如何在Linux中安装SystemTap工具来观测内核的行为。
环境准备:一个Linux系统,可以用虚拟机安装Ubuntu发行版或者CentOS发行版。本文使用的内核版本信息为
5.15.0-47-generic #51-Ubuntu SMP Thu Aug 11 07:51:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
安装stap命令
// 安装stap
sudo apt install stap
// 检查stap是否安装成功,如果以下命令没有报错的话,即说明安装成功
sudo stap -ve 'probe begin {log("hello!") exit()}'
但是当要探测Linux内核函数时,就会发现报错
sudo stap -ve 'probe kernel.function("tcp_v4_conn_request") {printf("hello world");}'
因为没有安装Linux系统对应的符号表,所以当我们指定内核函数tcp_v4_conn_request的时候,就无法识别到内核函数。
安装符号表
// 找到linux当前的版本
uname -a
// 显示如下,x86_64表示amd64,版本号为5.15.0-47-generic
// Linux peng 5.15.0-47-generic #51-Ubuntu SMP Thu Aug 11 07:51:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
// 下载对应版本的符号表。如果发现找不到对应的符号表,那么说明现在安装的Linux系统没有对应的符号表,这样就不能探测到内核函数。
// 可以到 http://ddebs.ubuntu.com/pool/main/l/linux 下查看linux支持什么版本的符号表
// https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/ppa2/+build/24861195/+files/linux-image-unsigned-5.15.0-56-generic-dbgsym_5.15.0-56.62_amd64.ddeb
wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-47-generic-dbgsym_5.15.0-47.51_amd64.ddeb
// 导入linux 符号表
sudo dpkg -i linux-image-unsigned-5.15.0-47-generic-dbgsym_5.15.0-47.51_amd64.ddeb
// 检查符号表是否导入成功
sudo stap -ve 'probe kernel.function("tcp_v4_conn_request") {printf("hello world");}'
此时再次用stap工具对内核函数做探针,发现已经没有报错,并且已经能够正常运行了
此时用nc命令测试一下探针是否真的生效。在虚拟机上用 nc -l 8090启动一个tcp服务,然后在宿主机用 nc 10.211.55.6 8090 连接虚拟机,此时会发现在stap的执行终端里出现了 hello world。说明此时探针已经生效。
此时,stap命令安装已经安装完成。更多用法可以参照: sourceware.org/systemtap/t…
此外,需要注意的是,systemtap既支持stp后缀的脚本,也支持嵌入C代码,这两个在命令执行上有点区别。
// 执行stap脚本,-v 表示执行时展示详细信息,stap命令后可以直接对接 .stp 后缀的脚本
sudo stap -v tcp_backlog.stp
// 执行嵌入C代码时,需要加上 -g 选项。注意不能用 -g 选项对接 .stp 后缀的脚本,不然会出现 "Invalid Module format" 的报错
sudo stap -g tcp_backlog.c