Redhat & Ubuntu systemtap 安装及使用

原本以为是个比较简单的活儿,后来忙了一个晚上加半个白天差不多五六个小时的时间才搞定,主要时间都花在 Ubuntu 上了,归结起来是 Ubuntu 在商业化技术支持方面跟 Redhat 比还是有不少差距的。不管是哪个发行版本,默认都不会安装 debuginfo 的包,所以最重要的是搞定这几个包。
Redhat 的安装教程直接参照官方的说明
RedHat 默认的 Subscription 里面的 Base-Channel(Red Hat Enterprise Linux Server (v. 6 for 64-bit x86_64) 只包含 kernel-debuginfo-common 这个包,但是不包含 kernel-debuginfo 这个包,后来才发现在 Subscription 里面增加一个 RHEL Server Debuginfo (v.6 for x86_64) channel 就能找到后者了。当时没注意,于是 kernel-debuginfo-common 使用的是官方的 repo,而 kernel-debuginfo 则是用的是 CentOS 的 repo,理论上来说,应该没什么大区别,但是实践发现还是有问题的,比如 Build Date 不通,会导致 "build-id mismatch" 的问题:
# stap test.stp
ERROR: Build-id mismatch: "kernel" vs. "vmlinux" byte 0 (0x3d vs 0xfe) address
0xffffffff81508160 rc 0
Warning: /usr/bin/staprun exited with status: 1
Pass 5: run failed.  Try again with another '–vp 00001' option.

可以通过下面的方式验证:
# rpm -qif /boot/vmlinuz-2.6.32-279.el6.x86_64 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/vmlinux

或者:
# rpm -qi kernel-debuginfo-2.6.32-279.el6.x86_64
Name        : kernel-debuginfo             Relocations: (not relocatable)
Version     : 2.6.32                            Vendor: CentOS
Release     : 279.el6                       Build Date: Fri 22 Jun 2012
09:31:57 PM CST
Install Date: Wed 21 May 2014 01:26:13 AM CST      Build Host:
c6b9.bsys.dev.centos.org
Group       : Development/Debug             Source RPM:
kernel-2.6.32-279.el6.src.rpm
Size        : 1521941269                       License: GPLv2
Signature   : RSA/SHA1, Mon 25 Jun 2012 06:12:09 AM CST, Key ID
0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.kernel.org/
Summary     : Debug information for package kernel
Description :
This package provides debug information for package kernel.
This is required to use SystemTap with kernel-2.6.32-279.el6.x86_64.

# rpm -qi kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64
Name        : kernel-debuginfo-common-x86_64  Relocations: (not relocatable)
Version     : 2.6.32                            Vendor: Red Hat, Inc.
Release     : 279.el6                       Build Date: Thu 14 Jun 2012
08:20:19 AM CST
Install Date: Wed 21 May 2014 12:34:47 AM CST      Build Host:
x86-008.build.bos.redhat.com
Group       : Development/Debug             Source RPM:
kernel-2.6.32-279.el6.src.rpm
Size        : 180674047                        License: GPLv2
Signature   : RSA/8, Thu 14 Jun 2012 08:49:26 AM CST, Key ID 199e2f91fd431d51
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.kernel.org/
Summary     : Kernel source files used by kernel-debuginfo packages
Description :
This package is required by kernel-debuginfo subpackages.
It provides the kernel source files common to all builds.

总之,保证下面几个包的完全出自同一个 repo,对应的 $(uname -r) 一样就可以了。
kernel-2.6.32-279.el6.x86_64
kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64
kernel-debuginfo-2.6.32-279.el6.x86_64

更新之后:
# rpm -qif /boot/vmlinuz-2.6.32-279.el6.x86_64 /usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/vmlinux
Name        : kernel                       Relocations: (not relocatable)
Version     : 2.6.32                            Vendor: Red Hat, Inc.
Release     : 279.el6                       Build Date: Thu 14 Jun 2012
08:20:19 AM CST
Install Date: Mon 25 Feb 2013 11:25:11 AM CST      Build Host:
x86-008.build.bos.redhat.com
Group       : System Environment/Kernel     Source RPM:
kernel-2.6.32-279.el6.src.rpm
Size        : 119491893                        License: GPLv2
Signature   : RSA/8, Thu 14 Jun 2012 08:44:50 AM CST, Key ID 199e2f91fd431d51
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.kernel.org/
Summary     : The Linux kernel
Description :
The kernel package contains the Linux kernel (vmlinuz), the core of any
Linux operating system.  The kernel handles the basic functions
of the operating system: memory allocation, process allocation, device
input and output, etc.
Name        : kernel-debuginfo             Relocations: (not relocatable)
Version     : 2.6.32                            Vendor: Red Hat, Inc.
Release     : 279.el6                       Build Date: Thu 14 Jun 2012
08:20:19 AM CST
Install Date: Wed 21 May 2014 01:35:13 AM CST      Build Host:
x86-008.build.bos.redhat.com
Group       : Development/Debug             Source RPM:
kernel-2.6.32-279.el6.src.rpm
Size        : 1521941269                       License: GPLv2
Signature   : RSA/8, Thu 14 Jun 2012 08:48:56 AM CST, Key ID 199e2f91fd431d51
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.kernel.org/
Summary     : Debug information for package kernel
Description :
This package provides debug information for package kernel.
This is required to use SystemTap with kernel-2.6.32-279.el6.x86_64.

然后通过默认的 repo,按部就班的安装 systemtap 就可以了。确认下 /lib/modules/2.6.34.7/build 是 ln 到 /usr/src/kernels/2.6.32-279.el6.x86_64/。

Ubuntu 的可以参照这篇文档来做,对于 10.04 2.6.32-38-server 的机器来说,依然还是可行的。
添加 repo,安装对应的 linux-image-$(uname -r)-dbgsym:
codename=$(lsb_release -c | awk  '{print $2}')
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ ${codename}      main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
EOF

sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys ECDCAD72428D7C01
sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym

不过当一切都安装好了之后,发现 kernel 的版本号并不是真正对应的,默认机器跑的是 2.6.32-38.85,新安装的 debuginfo 是 2.6.32-38.83:
[email protected]:~# dpkg -l | grep linux-image
ii  linux-image-2.6.32-38-server        2.6.32-38.85                                      Linux kernel image for version 2.6.32 on x86
ii  linux-image-2.6.32-38-server-dbgsym 2.6.32-38.83                                      Linux kernel debug image for version 2.6.32

所以把 linux-image 也换了,直接跟 2.6.32-38.83 统一,ftp.ubuntu.com 上找到对应的 linux-image-2.6.32-38-server_2.6.32-38.83_amd64.deb,dpkg 安装就好了。

安装只是个开始,用来发现诊断问题才是真正开始把工具给利用起来。Dtrace 的作者 Brendan 11 年的时候写了篇使用心得,撇开一些主观的情绪因素,上面遇到的一些问题还是值得参考的。
Systemtap 的使用可以参考官方的两篇文档,一篇入门,一篇相当于 manual,其实这些都能直接 man 到。

然后就是根据需求 google 各种 stp 脚本了,跑出来的结果如果不熟悉 kernel function & syscall 的话,需要花些时间理解下,否则没法分析问题了。
如果需要在 production 机器上做,直接安装 systemtap-runtime,在同等配置的机器上把 ko 文件做好丢到 production 上跑就好了。后来偶然的机会发现了一篇不错的中文安装文档