岡山カーネル勉強会 crashによるカーネル内部探索
ミラクル・リナックス株式会社 コアテクノロジー部 武田 保真 2006/08/05
VMware用環境の説明
MIRACLE LINUX V4.0 – 最小構成インストール
06/08/06
サーバ類のソフトはほとんど入っていません crash探索用に以下をインストール kernel-2.6.9-34.21AX(SP1) kernel-debuginfo-2.6.9-34.21AX crash-4.0-2.22 Rootのパスワードはkernel sshでrootログイン可能 Diskdump設定済み Keyboardは日本語キーボード設定 /etc/sysconfig/keyboard jp106 <-> us で切り替え 可能 Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
2
実行環境の準備 1. Vmware Player 、もしくは Vmware Workstationで MIRACLE40ディレクトリの構成ファイルを指定 2. VmwareでMIRACLE V4.0を起動 3. ユーザ root、パスワード kernelでログイン 4. 「/sbin/dhclient eth0」 を実行しDHCPアドレス取 得 5. 「/sbin/ifconfig」 でIPアドレスを確認 6. お気に入りの端末からsshでログイン
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの実行 書式 : crash <System.map> <vmlinux> <vmcore> * vmcoreを指定しないときは、稼働中カーネルのメモリ空間 - System.mapは通常 /boot配下に配置 - vmlinuxはML40/FC5などでは /usr/lib/debug/lib/modules/[カーネルバージョン]/vmlinux
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの起動(稼働中カーネル編)
「uname -r」でカーネルバージョン確認
2.6.9-34.21AX
kernel-debuginfoがインストールされていて、カー ネルバージョンが一致することを確認
rpm -q kernel-debuginfo
# crash /boot/System.map-2.6.9-34.21AX /usr/lib/debug/lib/modules/2.6.9-34.21AX/vmlinux (1行で)
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの起動メッセージ
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
最初に覚えることは.... helpコマンド
詳細なヘルプは... crash> help [コマンド] 06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
Crashを一旦停止
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
diskdumpを使ってvmcoreを作ってみる カーネルのsysrq機能を利用
diskdumpの取得開始→diskdump取得
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの起動(vmcore編)
vmcoreファイルを指定してcrashを起動 vmcoreファイルは、/var/crashディレクトリに格納 される # crash /boot/System.map-2.6.9-34.21AX /usr/lib/debug/lib/modules/2.6.9-34.21AX/vmlinux /var/crash/[IPアドレス-取得時間]/vmcore (1行で)
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの起動メッセージ
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
最初に行うコマンドは.... bt(Back Trace)
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
関数呼び出しの概念 call命令による関数の呼び出し プロセスの カーネルスタック
関数A return 関数B
06/08/06
関数Bのスタック
call 関数B
関数Aへの リターンアドレス
関数A
関数Aのスタック
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
BackTraceとは
カーネル停止箇所の実行パスを表示 CPUが複数ある場合には、停止原因となったプロ セスの稼動していたCPUの実行パスを表示 スタック内のリターンアドレス の格納されているアドレス 次の命令へジャンプした アドレス
実行パス
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
次にpsコマンド(プロセスリスト表示)
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
psコマンドの表示 ➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔
06/08/06
PID : プロセスID PPID : 親プロセスID CPU : 稼動CPU TASK : task_struct構造体のアドレス ST : プロセスのステータス %MEM : メモリ使用量 VSZ : 仮想メモリ空間サイズ RSS : 物理メモリ空間使用サイズ COMM : コマンド名
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
•カーネルメッセージの確認(log/dmesg) PANIC時のOopsメッセージ PANICしたアドレス レジスタの値
スタックのデータ
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
原因プロセスのバックトレース(bt -f)
怪しい??
ここから調査開始 06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
関数の逆アセンブル(dis)
ソースと比較 /usr/src/linux/2.6.9-34.21AX/drivers/char/sysrq.c
0番地に値0を代入 → 0番地アクセス違反(書き込み禁止領域) 06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
crashの活用いろいろ
いろいろなcrashのコマンドを試してみる
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
プロセスのオープンファイル一覧(files)
file構造体
06/08/06
dentry構造体
inode構造体
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
構造体の定義(struct)
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
構造体のデータ(struct [構造体名] [address]) file構造体のアドレス dentry構造体へのアドレス つまり... file構造体 f_dentry
06/08/06
dentry構造体
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
構造体の確認例
file_operations構造体のアドレスが0xc88f1fc0
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
構造体の確認結果(symコマンドの利用) 関数名の表示 aio_write呼び出し時の 関数の実体は何?
symコマンドで確認
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
モジュール一覧(mod) ext3_file_write()はなぜ表示されなかったのか...?
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
モジュールのロード(mod -s) 書式: mod -s [モジュール名] [モジュールファイル]
もう一度確認
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
file構造体のフラグ確認(evalの利用) f_flags = 33793(10進数) 16進数/8進数に直すと
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
ファイルのモード確認 /usr/src/linux-2.6.9-34.21AX/include/asm-i386/fcntl.h
8進数: 102001 ↓ - O_WRONLY(01) - O_APPEND(02000) - O_LARGEFILE(0100000) の3つのフラグ設定
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
ソケット情報の確認(net -s [PID] / net -n [数値]) sshdに接続されているソケットの情報を確認してみる
IPv6形式の表記: Source - IPv4のアドレスc0a80081 の 22番ポート Destination - IPv4のアドレスc0a80001の1486番ポート
IAサーバはリトルエンディアン - 192.168.0.129 - 192.168.0.1 06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
その他の普通のコマンド
06/08/06
runq : 実行可能プロセスリスト sig : シグナル登録リスト timer: タイマー登録リスト swap: スワップ情報 kmem: メモリ関連情報 irq : 割り込み登録リスト dev: デバイス登録リスト mount: マウント情報 vm : プロセス仮想空間情報
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
エキスパートのためのコマンド1(search)
search : ダンプ内を数値でサーチ
数値を見つけたアドレス
アドレスの並びに何かの 法則あり? 構造体?
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
エキスパートのためのコマンド2(rd)
rd : ダンプ内のメモリダンプ 書式: rd [アドレス] 表示サイズ
たぶん、File descriptor(fd)の配列を格納
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
task_structからFD配列かどうか確認 include/linux/sched.h task_struct構造体
task_struct構造体のアドレス
crash> struct task_struct c51880f0
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
files_structから調査
....
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved
Q&A
06/08/06
Copyright © 2000-2005 MIRACLE LINUX CORPORATION All rights reserved