CentOS 6.6 に Systemtap をインストールして動かす

CentOS 6.6 に Systemtap をインストールして動かすのにハマった話です。

インストール方法

最終的に以下のコマンドでインストールして再起動すると Systemtap を動かせました。

$ sudo yum install systemtap
$ sudo yum --enablerepo=centosplus install kernel kernel-devel
$ sudo yum --enablerepo=base-debuginfo install kernel-debuginfo

ハマった話

ビギナーズガイドによると systemtap を動かすには以下のパッケージが必要です*1

これらのうち systemtap, systemtap-runtime, kernel-devel は CentOS 公式の Base リポジトリから提供されていて、kernel-debuginfo, kernel-debuginfo-common は Debuginfo リポジトリから提供されています。Debuginfo リポジトリはデフォルトでは有効になっていないので、yumコマンド実行時にオプション--enablerepo=base-debuginfoを付けて有効にする必要があります。

これらをインストールします。ただし、これでは動きません。

$ sudo yum install systemtap systemtap-runtime kernel-devel
$ sudo yum --enablerepo=base-debuginfo install kernel-debuginfo kernel-debuginfo-common

インストール後に、ビギナーズガイドにあるテスト用のコマンド*2を実行してみます。

$ sudo stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
Pass 1: parsed user script and 103 library script(s) using 201640virt/29512res/3148shr/26860data kb, in 120usr/60sys/257real ms.
semantic error: while resolving probe point: identifier 'kernel' at /usr/share/systemtap/tapset/linux/vfs.stp:768:18
        source: probe vfs.read = kernel.function("vfs_read")
                                 ^

semantic error: missing x86_64 kernel/module debuginfo [man warning::debuginfo] under '/lib/modules/2.6.32-504.12.2.el6.x86_64/build'
semantic error: while resolving probe point: identifier 'vfs' at <input>:1:7
        source: probe vfs.read {printf("read performed\n"); exit()}
                      ^

semantic error: no match
Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 0 global(s) using 211904virt/39740res/5172shr/35020data kb, in 60usr/480sys/1967real ms.
Pass 2: analysis failed.  [man error::pass2]

何やら debuginfo が無いと言われます。

原因

ググったりしてもよく分からなかったのですが、kernel-debuginfo の info を見ると原因がわかりました。

$ yum --enablerepo=base-debuginfo info kernel-debuginfo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Installed Packages
Name        : kernel-debuginfo
Arch        : x86_64
Version     : 2.6.32
Release     : 504.12.2.el6.centos.plus
Size        : 1.6 G
Repo        : installed
From repo   : base-debuginfo
Summary     : Debug information for package kernel
URL         : http://www.kernel.org/
License     : GPLv2
Description : This package provides debug information for package kernel.
            : This is required to use SystemTap with kernel-2.6.32-504.12.2.el6.centos.plus.x86_64.

Description の部分に

This is required to use SystemTap with kernel-2.6.32-504.12.2.el6.centos.plus.x86_64.

とあるように、カーネルのリリース名に見慣れぬ centos.plus という文字があります。 これは現在のカーネルとは違っていました。

$ uname -r
2.6.32-504.12.2.el6.x86_64

調べてみると CentOSPlus というリポジトリでも kernel と kernel-devel が提供されています。リリース名も kernel-2.6.32-504.12.2.el6.centos.plus.x86_64 に一致します。

というわけで CentOSPlus リポジトリから kernel とkernel-devel をインストール。

$ sudo yum --enablerepo=centosplus install kernel kernel-devel

そして再起動した後再びテスト用コマンドを実行すると、うまく動きました。

$ sudo stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
Pass 1: parsed user script and 103 library script(s) using 201672virt/29544res/3148shr/26892data kb, in 110usr/20sys/128real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 3 embed(s), 0 global(s) using 296424virt/125164res/4124shr/121644data kb, in 990usr/200sys/1195real ms.
Pass 3: translated to C into "/tmp/stap53301G/stap_2a362e40998232e8986eb51a4ebd96d9_1543_src.c" using 296424virt/125496res/4456shr/121644data kb, in 0usr/70sys/59real ms.
Pass 4: compiled C into "stap_2a362e40998232e8986eb51a4ebd96d9_1543.ko" in 3670usr/1850sys/5836real ms.
Pass 5: starting run.
read performed
Pass 5: run completed in 10usr/10sys/359real ms.