カーネル内で閉じたトレーサ「ftrace」を使えるようにする

Linux のトレーサと言えば幾つかありますが、@IT の記事「3月版 トレーサ関連に大きな進展、ftraceがデファクトに?」にある ftrace が便利そうです。今回は CentOS 5.5 x86_64 で ftrace が使える環境を用意してみます。id:tasukuchantrace-cmdを使って、Linux Kernelのイベントログを簡単に取得するを参考にさせて頂きました。

カーネルの再コンパイル(ftrace の有効化)

以前に書いた記事を参考に、ftrace を有効化したカーネルコンパイルします。現状のカーネルは以下の通りです。

$ uname -a
Linux centos-01.local 2.6.18-194.32.1.el5 #1 SMP Wed Jan 5 17:52:25 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

上述の過去記事通り、カーネルコンパイルします。現時点ではカーネル 2.6.37 がリリースされていますが、以前にコンパイル&動作させた実績のあるカーネル 2.6.36.1 を使いました(カーネル 2.6.37 でも試したのですが、Linux 自体が起動しなくなってしまいました。別の機会にトラブルシューティングしてみます)。

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.1.tar.bz2
$ tar jxvf linux-2.6.36.1.tar.bz2
$ cd linux-2.6.36.1
$ make mrproper
$ cp /boot/config-2.6.18-194.26.1.el5 .config

"make oldconfig" は全て「ENTER」で進みます。

$ make oldconfig

"make menuconfig" します。以下のようなエラーが出る場合は ncurses-devel を追加インストールします。

$ make menuconfig
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
 *** 
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
$ sudo yum -y install ncurses-devel
$ make menuconfig

メニューから下記を選択して有効化します。

  • [General setup]
    • [enable deprecated sysfs features to support old userspace tools] にチェック
  • [Networking support]
    • [Networking options]
      • [Network packet filtering framework (NetFilter)]
        • [Core Netfilter Configuration] の中のすべての項目
        • [IP: Netfilter Configuration] の中のすべての項目
        • [IPv6: Netfilter Configuration] の中のすべての項目
        • [IP virtual server support] の中のすべての項目
  • [Kernel hacking]
    • [Tracers]
      • [Kernel Function Tracer]
      • [Trace syscalls]

カーネルコンパイル&インストールします。

$ sudo make rpm
$ sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/kernel-2.6.36.1-1.x86_64.rpm
$ sudo /sbin/mkinitrd /boot/initrd-2.6.36.1.img 2.6.36.1

/boot/grub/grub.conf に下記を追記します。

title CentOS (2.6.36.1)
  root (hd0,0)
  kernel /vmlinuz-2.6.36.1 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
  initrd /initrd-2.6.36.1.img

再起動します。

$ sudo reboot

再起動後、カーネルのバージョンを確認します。

$ uname -a
Linux centos-01.local 2.6.36.1 #1 SMP Tue Jan 11 07:05:01 JST 2011 x86_64 x86_64 x86_64 GNU/Linux

ftrace を利用出来る状態にする

ftrace は debugfs 上のエントリーを参照したり、更新したりしますので、まず debugfs をマウントします。

$ sudo mount -t debugfs none /sys/kernel/debug

現在、有効なトレーサの一覧は "/sys/kernel/debug/tracing/available_tracers" で確認出来ます。下記の例では "function" と "function_graph" が表示されており、ftrace が有効化されていることが分かります。

$ cat /sys/kernel/debug/tracing/available_tracers
blk function_graph function sched_switch nop

trace-cmd のインストール

上述の通り、ftrace の操作は debugfs 経由で行いますが、この操作を支援してくれる「trace-cmd」というツールがあります。trace-cmd は git.kernel.org で公開されており、以下の手順でインストールが可能です。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git trace-cmd-stable-v1
$ cd trace-cmd-stable-v1
$ make
$ sudo make install

これから使い込んでみたいと思います。