Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第2章 SystemTap の使用

本章では、SystemTap のインストール方法と SystemTap スクリプトの実行方法を説明します。

2.1. インストールと設定

SystemTap のデプロイにインストールが必要となるのは、SystemTap パッケージと対応するカーネルの -devel-debuginfo、および -debuginfo-common-arch パッケージです。システムに複数のカーネルがインストールされていて、それらのカーネル上で SystemTap を使用するには、それらの カーネルバージョン用に -devel-debuginfo パッケージをインストールします。
これらの手順は、以下のセクションで詳細に説明します。

重要

多くのユーザーは、-debuginfo-debug を混同します。SystemTap のデプロイに必要となるのは、カーネルの -debuginfo パッケージのインストールであって、カーネルの -debug バージョンではない点に注意してください。

2.1.1. SystemTap のインストール

SystemTap をデプロイするには、以下の RPM パッケージをインストールします。
  • systemtap
  • systemtap-runtime
システムに yum がインストールされていることを前提として、これら 2 つの RPM パッケージは yum install systemtap systemtap-runtime を使用してインストールすることができます。SystemTap を使用する前に、必要なカーネル情報パッケージをインストールします。

2.1.2. 必要なカーネル情報 RPM パッケージのインストール

SystemTap は、カーネル内にインストルメンテーションを配置する (プローブする) ためにカーネルの情報が必要になります。この情報により、SystemTap はインストルメンテーションのコード生成が可能になります。この情報は、一致するカーネル用の -devel-debuginfo、および -debuginfo-common-arch パッケージに含まれています。通常の「vanilla」カーネルに必要な -devel および -debuginfo パッケージは、以下のとおりです。
  • kernel-debuginfo
  • kernel-debuginfo-common-arch
  • kernel-devel
同様に、PAE カーネルに必要なパッケージは、kernel-PAE-debuginfokernel-PAE-debuginfo-common-arch 、および kernel-PAE-devel になります。
システムで現在使用中のカーネルを確認するには、以下のコマンドを実行します。
uname -r
たとえば、32 ビット AMD および Intel アーキテクチャーのマシン上のカーネルバージョン 2.6.32-53.el6 で SystemTap を使用する場合は、以下の RPM パッケージをダウンロードおよびインストールする必要があります。
  • kernel-debuginfo-2.6.32-53.el6.i686.rpm
  • kernel-debuginfo-common-i686-2.6.32-53.el6.i686.rpm
  • kernel-devel-2.6.32-53.el6.i686.rpm

重要

-devel-debuginfo、および -debuginfo-common-arch パッケージのバージョン、バリアント、アーキテクチャーは、SystemTap によって 正確に プローブされるためにカーネルと一致する必要があります。
システムで SystemTap が必要とするチャンネルの一覧を取得するには、以下のスクリプトを使用します。
#! /bin/bash
pkg=`rpm -q --whatprovides "redhat-release"`
releasever=`rpm -q --qf "%{version}" $pkg`
variant=`echo $releasever | tr -d "[:digit:]" | tr "[:upper:]" "[:lower:]" `
if test -z "$variant"; then
  echo "No Red Hat Enterprise Linux variant (workstation/client/server) found."
  exit 1
fi
version=`echo $releasever | tr -cd "[:digit:]"`
base=`uname -i`
echo "rhel-$base-$variant-$version"
echo "rhel-$base-$variant-$version-debuginfo"
echo "rhel-$base-$variant-optional-$version-debuginfo"
echo "rhel-$base-$variant-optional-$version"
チャンネルを追加したら、コマンド debuginfo-install kernelname-version を使用して、カーネルに必要な -develdebuginfo、および debuginfo-install arch パッケージをインストールします。kernelname を適切なカーネルバリアント名 (kernel-PAE など) に置き換え、version をターゲットカーネルのバージョンに置き換えます。たとえば、kernel-PAE-2.6.32-53.el6 カーネルに必要なカーネル情報パッケージをインストールするには、debuginfo-install kernel-PAE-2.6.32-53.el6 を実行します。

2.1.3. 初期テスト

SystemTap でプローブするカーネルが現在使用中であれば、デプロイメントが成功したかどうかを直ちにテストできます。別のカーネルをプローブする場合は、再起動して該当カーネルを読み込みます。
テストを開始するには、stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}' のコマンドを実行します。このコマンドは単に、SystemTap に read performed をプリントして、仮想ファイルシステムの読み込みが検出されると、正常に終了するよう指示します。SystemTap が正常にデプロイされていれば、以下のような出力になります。
Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms.
Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms.
Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms.
Pass 5: starting run.
read performed
Pass 5: run completed in 10usr/40sys/73real ms.
(Pass 5 で始まる) 出力の最後の 3 行は、SystemTap がカーネルをプローブするインストルメンテーションを正常に作成できたこと、インストルメンテーションを実行したこと、プローブしているイベントを検出したこと (このケースでは、仮想ファイルシステムの読み込み)、および有効なハンドラーを実行したこと (テキストをプリントし、エラーなしで終了) を示しています。