Linux のトレーサと言えば幾つかありますが、@IT の記事「3月版 トレーサ関連に大きな進展、ftraceがデファクトに?」にある ftrace が便利そうです。今回は CentOS 5.5 x86_64 で ftrace が使える環境を用意してみます。id:tasukuchan の trace-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] の中のすべての項目
- [Network packet filtering framework (NetFilter)]
- [Networking options]
- [Kernel hacking]
- [Tracers]
- [Kernel Function Tracer]
- [Trace syscalls]
- [Tracers]
カーネルをコンパイル&インストールします。
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
これから使い込んでみたいと思います。
コメント