More Related Content Similar to kernel/vm@okinawa 2014 (20) kernel/vm@okinawa 20142. 自己紹介
• 太田 陽祐
• Ingress Enlightened Agent
L8
• 琉球大学院生
• Twitter: y0t4
• 浅く広くな人
5. • GDBでのkernel読み入門
• (停電におびえながら)学科システムの
OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話
「入門」とあるように、ポイントや
引っかかる(引っかかっている)部分を
紹介します。
6. 動機
• 「Linux kernelのソースとか読んでみたいよね」
!
_人人人人人人_
> 単純明快 <
‾Y^Y^Y^Y^Y‾
GDBでのkernel読み入門
7. ソースを読む方法
• エディタで読む
• デバッガで読む
• パッチで読む
• printfで読む
kernelの実行に則して読みたかったので
デバッガを使うことに決定
GDBでのkernel読み入門
8. 環境
• OS: CentOS 6.5 (kernel 3.9.2)
• 去年の講義で使ったものを流用したので古めなバージョン
• CPU: Intel(R) Xeon(R) CPU
X5650@2.67GHz
GDBでのkernel読み入門
9. やったこと
1. KVMホストとVMを用意
2. KGDB機能を有効化したkernelをビルド
3. ビルドしたkernelをVMに適用
4. KGDBのbootパラメータを設定
5. -sオプションを使ってVM起動
6. ホストからgdbで接続する(symbolはvmlinux)
7. 読む -> とりあえずネットワーク通信部分とか
GDBでのkernel読み入門
10. 構成図
ホストコンピュータ
$ gdb vmlinux
(gdb)target remote :1234
kernel
VM
kernel
KGDB
qemu-kvm
GDBでのkernel読み入門
• KVMホストと
VMの関係は
図のような感じ
11. KGDB
• Linux kernelのデバッガフロントエンド
$ make menuconfig
Kernel hacking ->
Compile the kernel with debug info
KGDB: kernel debugger ->
KGDB: use kgdb over the serial console
以下、カーネルコマンドライン部に追記
kgdboc=ttyS0,115200 console=ttyS0,115200
GDBでのkernel読み入門
12. qemu-kvm
• KVMに対応したCPUエミュレータ
$ qemu-kvm --help
-s shorthand for -gdb tcp::1234
-gdb dev wait for gdb connection on ‘dev'
!
qemu-kvmに-sオプションをつけて起動すると
(gdb)target remote :1234
で接続可能
GDBでのkernel読み入門
14. qemu-kvm
• LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin /usr/libexec/qemu-kvm -name
kernelvm -S -M rhel6.4.0 -enable-kvm -m 8192 -smp
8,sockets=8,cores=1,threads=1 -uuid 98767ead-25f4-3f15-5807-fa099bbb0dfd -
nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/
libvirt/qemu/kernelvm.monitor,server,nowait -mon
chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -
device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/tmp/
Centos.img,if=none,id=drive-virtio-disk0,format=raw,cache=none -device virtio-blk-pci,
scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1
-drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,
bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev
tap,fd=22,id=hostnet0,vhost=on,vhostfd=24 -device virtio-net-pci,
netdev=hostnet0,id=net0,mac=52:54:00:89:7c:1b,bus=pci.0,addr=0x3 -chardev
pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device virtio-balloon-
pci,id=balloon0,bus=pci.0,addr=0x5
(/var/log/libvirt/qemu/kernelvm.imgより)
GDBでのkernel読み入門
16. gdb
• VMを起動したら
$ gdb vmlinux
(gdb) target remote :1234
でgdbからVMのkernelにアクセスできる
!
これで読む準備は終わり
GDBでのkernel読み入門
17. ハマった場所
• architecture
• opaque pointer
• compilerの最適化
• macroなソースコード
• SIGTRAP
• KGDB: Waiting for remote debugger
GDBでのkernel読み入門
18. architecture
• “Remote 'g' packet reply is too long:”
とかいうエラーが出る
• (gdb) set architecture i386:x86-64:intel
で解決
GDBでのkernel読み入門
19. opaque pointer
• (gdb) p *msg->msg_name
Attempt to dereference a generic pointer.
(gdb) p msg->msg_name
$1 = (void *) 0xffffffff8105ec01
• データが未定義なだけなので、
定義されてからpするとかで解決
GDBでのkernel読み入門
21. compilerの最適化
• 読みたい変数とかを print すると
<value optimized out>
• Makefileに
EXTRA_CFLAGS += -O0
を記述
mm/ に-O0を記述すると
kernel makeが通らない!(net/は通る)
GDBでのkernel読み入門
25. compilerの最適化
• 助けを求める
最適化でprintできなくても
レジスタに値は残ってるでしょ
それを読むんだよ
それがバイナリハッカー
な...なるほど...(゚∇゚;)
GDBでのkernel読み入門
26. compilerの最適化
• 助けを求める
最適化でprintできなくても
レジスタに値は残ってるでしょ
それを読むんだよ
それがバイナリハッカー
解決してないけど解決
GDBでのkernel読み入門
な...なるほど...(゚∇゚;)
27. macroなソース
• (gdb) l
308 BUILDIO(b, b, char)
(gdb) l BUILDIO
Function "BUILDIO" not defined. (マクロだし)
GDBでのkernel読み入門
28. macroなソース
• (gdb) l
308 BUILDIO(b, b, char)
(gdb) l BUILDIO
Function "BUILDIO" not defined. (マクロだし)
マクロ展開して
make頑張ってみたら
GDBでのkernel読み入門
29. macroなソース
• (gdb) l
308 BUILDIO(b, b, char)
(gdb) l BUILDIO
Function "BUILDIO" not defined. (マクロだし)
マクロ展開して
make頑張ってみたら
GDBでのkernel読み入門
な...なるほど...(゚∇゚;)
(g3オプションとかじゃダメかな...)
30. SIGTRAP
• breakpointをdelした後に
Program received signal SIGTRAP, Trace/
breakpoint trap.
と別の場所に飛ばされる(ことがある)
それっぽいページ
は発見
GDBでのkernel読み入門
http://stackoverflow.com/questions/9809413/program-received-
signal-sigtrap-trace-breakpoint-trap
31. KGDB: Waiting for remote
debugger
• エラー再現が上手くいかないエラー
VM側のコンソール上に上記のエラーが出力
解決方法模索中です...
GDBでのkernel読み入門
36. まとめ
• 濁流に飲まれてる感
• いろんなところで突っかかって楽しい
• 知らない人だけでやると
どう手をつけたらいいか分からない
• 誰か知ってる人が近くに居ると良さそう
GDBでのkernel読み入門
gdbを諦めて
本を読むという手も...
39. 前提知識
• 琉球大学情報工学科では学科システムを学生が
管理している
• 以前は「学生実験」の1テーマとして、
現在は希望者制
• 学科システムはDNSやDHCP、Webなどの
サーバ群から学科ネットワーク、学生へのVM貸
し出し、先生への対応など広い範囲を担当
学科システムアップグレード
60. 残作業
• 旧サーバから新サーバへの切り替え
• 旧サーバと新サーバを
停電になった時に入れ替えれ
ばいいのでは
• そうすればユーザにはいつ入
れ替えたのか
分からない
学科システムアップグレード
この作戦は
どうなった