第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 をデプロイするには、root で以下のコマンドを実行して systemtapsystemtap-runtime のパッケージをインストールします。
~]# yum install -y systemtap systemtap-runtime

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

SystemTap は、カーネル内にインストルメンテーションを配置する (プローブする) ためにカーネルの情報が必要になります。この情報により SystemTap はインストルメンテーションのコード生成が可能になります。この情報は、一致する kernel-develkernel-debuginfo、および kernel-debuginfo-common-arch パッケージに含まれています (ここでの arch は、ご使用のシステムのハードウェアプラットフォームになります。これは、uname -m コマンドを実行すると判明します)。
kernel-devel パッケージはデフォルトの Red Hat Enterprise Linux リポジトリーから、kernel-debuginfo および kernel-debuginfo-common-arch パッケージは debug リポジトリーから入手できます。
必要なパッケージをインストールするには、システム用に debug リポジトリーを有効にします。
~]# subscription-manager repos --enable=rhel-7-variant-debug-rpms
上記のコマンドでは、ご使用中の Red Hat Enterprise Linux システムのバリアントによって、variantserverworkstation、または client に置き換えます。バリアントを確認するには、以下のコマンドを実行します。
~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)
SystemTap がプローブするカーネルは、kernel-develkernel-debuginfo、および kernel-debuginfo-common-arch パッケージのバージョン、バリアント、およびアーキテクチャーと正確に一致する必要があります。システムで実行中のカーネルを確認するには、以下のコマンドを実行します。
uname -r
3.10.0-327.el7.x86_64
たとえば、AMD64 または Intel 64 マシン上のカーネルバージョン 3.10.0-327.4.4.el7 に SystemTap を使用するには、以下のパッケージをインストールする必要があります。
  • kernel-debuginfo-3.10.0-327.4.4.el7.x86_64.rpm
  • kernel-debuginfo-common-x86_64-3.10.0-327.4.4.el7.x86_64.rpm
  • kernel-devel-3.10.0-327.4.4.el7.x86_64.rpm
yum パッケージマネージャーを使用して、SystemTap を実行するために必要なパッケージを現行カーネルにインストールするには、root で以下のコマンドを実行します。
~]# yum install -y kernel-devel-$(uname -r) \
kernel-debuginfo-$(uname -r) \
kernel-debuginfo-common-$(uname -m)-$(uname -r)

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 がカーネルをプローブするインストルメンテーションを正常に作成できたこと、インストルメンテーションを実行したこと、プローブしているイベントを検出したこと (このケースでは、仮想ファイルシステムの読み込み)、および有効なハンドラーを実行したこと (テキストをプリントし、エラーなしで終了) を示しています。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。