kernel/vm@okinawa 2014

67
GDBでの kernel読み入門 +おまけ @y0t4

Upload: y0t4

Post on 24-Jul-2015

106 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: kernel/vm@okinawa 2014

GDBでの kernel読み入門

+おまけ

@y0t4

Page 2: kernel/vm@okinawa 2014

自己紹介• 太田 陽祐

• Ingress Enlightened Agent L8

• 琉球大学院生

• Twitter: y0t4

• 浅く広くな人

Page 3: kernel/vm@okinawa 2014

今日話すこと• GDBでのkernel読み入門

• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話

• 未対応なWindowsにvCenterとか入れた話

時間が許す限り話していこうと思います

Page 4: kernel/vm@okinawa 2014

• GDBでのkernel読み入門

• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話

• 未対応なWindowsにvCenterとか入れた話

Page 5: kernel/vm@okinawa 2014

• GDBでのkernel読み入門

• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話

• 未対応なWindowsにvCenterとか入れた話

「入門」とあるように、ポイントや 引っかかる(引っかかっている)部分を

紹介します。

Page 6: kernel/vm@okinawa 2014

動機

• 「Linux kernelのソースとか読んでみたいよね」

!

_人人人人人人_ > 単純明快 < ‾Y^Y^Y^Y^Y‾

GDBでのkernel読み入門

Page 7: kernel/vm@okinawa 2014

ソースを読む方法• エディタで読む

• デバッガで読む

• パッチで読む

• printfで読む

kernelの実行に則して読みたかったのでデバッガを使うことに決定

GDBでのkernel読み入門

Page 8: kernel/vm@okinawa 2014

環境

• OS: CentOS 6.5 (kernel 3.9.2) • 去年の講義で使ったものを流用したので古めなバージョン

• CPU: Intel(R) Xeon(R) CPU [email protected]

GDBでのkernel読み入門

Page 9: kernel/vm@okinawa 2014

やったこと1. KVMホストとVMを用意 2. KGDB機能を有効化したkernelをビルド 3. ビルドしたkernelをVMに適用 4. KGDBのbootパラメータを設定 5. -sオプションを使ってVM起動 6. ホストからgdbで接続する(symbolはvmlinux) 7. 読む -> とりあえずネットワーク通信部分とか

GDBでのkernel読み入門

Page 10: kernel/vm@okinawa 2014

構成図

GDBでのkernel読み入門

kernel

qemu-kvm

$ gdb vmlinux(gdb)target remote :1234

VM

KGDB

kernel

ホストコンピュータ

• KVMホストとVMの関係は図のような感じ

Page 11: kernel/vm@okinawa 2014

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読み入門

Page 12: kernel/vm@okinawa 2014

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読み入門

Page 13: kernel/vm@okinawa 2014

qemu-kvm

qemu-kvmはオプションが多くコマンドが長い

GDBでのkernel読み入門

Page 14: kernel/vm@okinawa 2014

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読み入門

Page 15: kernel/vm@okinawa 2014

libvirt“libvirtは仮想機械の制御を抽象化したライブラリである。(wikipedia)”

!

• 起動 • virsh start [vm名]

!

<qemu:commandline> <qemu:arg value='-s'/> </qemu:commandline>

GDBでのkernel読み入門

Page 16: kernel/vm@okinawa 2014

gdb• VMを起動したら$ gdb vmlinux (gdb) target remote :1234でgdbからVMのkernelにアクセスできる !

これで読む準備は終わり

GDBでのkernel読み入門

Page 17: kernel/vm@okinawa 2014

ハマった場所• architecture • opaque pointer • compilerの最適化 • macroなソースコード • SIGTRAP • KGDB: Waiting for remote debugger

GDBでのkernel読み入門

Page 18: kernel/vm@okinawa 2014

architecture• “Remote 'g' packet reply is too long:” とかいうエラーが出る

• (gdb) set architecture i386:x86-64:intelで解決

GDBでのkernel読み入門

Page 19: kernel/vm@okinawa 2014

opaque pointer

GDBでのkernel読み入門

• (gdb) p *msg->msg_nameAttempt to dereference a generic pointer.(gdb) p msg->msg_name$1 = (void *) 0xffffffff8105ec01

• データが未定義なだけなので、定義されてからpするとかで解決

Page 20: kernel/vm@okinawa 2014

compilerの最適化• 読みたい変数とかを print すると <value optimized out>

• MakefileにEXTRA_CFLAGS += -O0を記述

GDBでのkernel読み入門

Page 21: kernel/vm@okinawa 2014

compilerの最適化• 読みたい変数とかを print すると <value optimized out>

• MakefileにEXTRA_CFLAGS += -O0を記述

GDBでのkernel読み入門

mm/ に-O0を記述するとkernel makeが通らない!(net/は通る)

Page 22: kernel/vm@okinawa 2014

compilerの最適化• 助けを求める

GDBでのkernel読み入門

Page 23: kernel/vm@okinawa 2014

compilerの最適化• 助けを求める

GDBでのkernel読み入門

Page 24: kernel/vm@okinawa 2014

compilerの最適化• 助けを求める

GDBでのkernel読み入門

最適化でprintできなくても レジスタに値は残ってるでしょ

それを読むんだよ それがバイナリハッカー

Page 25: kernel/vm@okinawa 2014

compilerの最適化• 助けを求める

GDBでのkernel読み入門

最適化でprintできなくても レジスタに値は残ってるでしょ

それを読むんだよ それがバイナリハッカー

な...なるほど...(゚∇゚;)

Page 26: kernel/vm@okinawa 2014

compilerの最適化• 助けを求める

GDBでのkernel読み入門

最適化でprintできなくても レジスタに値は残ってるでしょ

それを読むんだよ それがバイナリハッカー

解決してないけど解決な...なるほど...(゚∇゚;)

Page 27: kernel/vm@okinawa 2014

macroなソース

GDBでのkernel読み入門

• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)

Page 28: kernel/vm@okinawa 2014

macroなソース

GDBでのkernel読み入門

マクロ展開して make頑張ってみたら

• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)

Page 29: kernel/vm@okinawa 2014

macroなソース

GDBでのkernel読み入門

マクロ展開して make頑張ってみたら

• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)

な...なるほど...(゚∇゚;)(g3オプションとかじゃダメかな...)

Page 30: kernel/vm@okinawa 2014

SIGTRAP

GDBでのkernel読み入門

• breakpointをdelした後にProgram received signal SIGTRAP, Trace/breakpoint trap.と別の場所に飛ばされる(ことがある)

それっぽいページは発見

http://stackoverflow.com/questions/9809413/program-received-signal-sigtrap-trace-breakpoint-trap

Page 31: kernel/vm@okinawa 2014

KGDB: Waiting for remote debugger

GDBでのkernel読み入門

• エラー再現が上手くいかないエラー VM側のコンソール上に上記のエラーが出力解決方法模索中です...

Page 32: kernel/vm@okinawa 2014

今後の読む方針

GDBでのkernel読み入門

ていうかどこから読んでるの

Page 33: kernel/vm@okinawa 2014

今後の読む方針

GDBでのkernel読み入門

ていうかどこから読んでるの

私nmをsockでgrepしてでてきた sock_create辺りから読んでます

Page 34: kernel/vm@okinawa 2014

今後の読む方針

GDBでのkernel読み入門

ていうかどこから読んでるの

私nmをsockでgrepしてでてきた sock_create辺りから読んでます

それはセンスがない read, writeから読むのが楽だから

Page 35: kernel/vm@okinawa 2014

今後の読む方針

GDBでのkernel読み入門

ていうかどこから読んでるの

私nmをsockでgrepしてでてきた sock_create辺りから読んでます

それはセンスがない read, writeから読むのが楽だから

なるほど!!!

Page 36: kernel/vm@okinawa 2014

まとめ

GDBでのkernel読み入門

• 濁流に飲まれてる感 • いろんなところで突っかかって楽しい • 知らない人だけでやるとどう手をつけたらいいか分からない

• 誰か知ってる人が近くに居ると良さそう

gdbを諦めて 本を読むという手も...

Page 37: kernel/vm@okinawa 2014

• linuxのkernelをgdbで追いかけたかった話

• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話

• 未対応なWindowsにvCenterとか入れた話

Page 38: kernel/vm@okinawa 2014

きっかけ

学科システムアップグレード

• 「CentOS6が出てそろそろ1年くらい経つし、夏休みでちょうどいいからそろそろCentOS5->6にしたいよね」

• という話がシステム管理なチーム内で出て、 バージョンアップすることに。

Page 39: kernel/vm@okinawa 2014

前提知識

学科システムアップグレード

• 琉球大学情報工学科では学科システムを学生が管理している

• 以前は「学生実験」の1テーマとして、 現在は希望者制

• 学科システムはDNSやDHCP、Webなどのサーバ群から学科ネットワーク、学生へのVM貸し出し、先生への対応など広い範囲を担当

Page 40: kernel/vm@okinawa 2014

やること

学科システムアップグレード

• 基幹サーバ群のOSメジャーバージョンアップ • Web, DNS*, DHCP, LDAP*, SMTP, IMAP, RADIUS, SHELL

• 基幹サーバはESX上のVM

Page 41: kernel/vm@okinawa 2014

懸念事項

学科システムアップグレード

• 引き継ぎ資料が無い • 人手不足(学生5人)

Page 42: kernel/vm@okinawa 2014

懸念事項

学科システムアップグレード

• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース

Page 43: kernel/vm@okinawa 2014

琉球大学と台風

学科システムアップグレード

• 大学構内はとにかく台風に弱い • すぐ停電する • 全然復旧しない

Page 44: kernel/vm@okinawa 2014

琉球大学と台風

学科システムアップグレード

• 大学構内はとにかく台風に弱い • すぐ停電する • 全然復旧しない

ここから見える景色全部 電気ついてるのに 大学は停電中とか...

Page 45: kernel/vm@okinawa 2014

懸念事項

学科システムアップグレード

• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース

つらいけどグーグル様に...

Page 46: kernel/vm@okinawa 2014

懸念事項

学科システムアップグレード

• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース

Page 47: kernel/vm@okinawa 2014

懸念事項

学科システムアップグレード

• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース

ヤバい

Page 48: kernel/vm@okinawa 2014

いや、待てよ

学科システムアップグレード

• 旧サーバと新サーバを停電になった時に入れ替えればいいのでは

• そうすればユーザにはいつ入れ替えたのか分からない

Page 49: kernel/vm@okinawa 2014

(暴風)雨天決行

学科システムアップグレード

今思えば完全に間違った判断でした。

Page 50: kernel/vm@okinawa 2014

RTA開始

学科システムアップグレード

• 旧サーバから新サーバへconfをコピーしたり • CentOS5から6でconfの置き場所が変わってる • 必要なのかそうでないのか分からない設定群 • ドキュメントがないため

• 当然なかなか上手くいかず !

Page 51: kernel/vm@okinawa 2014

RTA開始

学科システムアップグレード

• 旧サーバから新サーバへconfをコピーしたり • CentOS5から6でconfの置き場所が変わってる • 必要なのかそうでないのか分からない設定群 • ドキュメントがないため

• 当然なかなか上手くいかず • 迫る台風 • 停電の恐怖

Page 52: kernel/vm@okinawa 2014

作業時間

学科システムアップグレード

• 2012年 9月 15日 18:00 ~

Page 53: kernel/vm@okinawa 2014

作業時間

学科システムアップグレード

• 2012年 9月 15日 18:00 ~

Page 54: kernel/vm@okinawa 2014

作業時間

学科システムアップグレード

• 2012年 9月 15日 18:00 ~

Page 55: kernel/vm@okinawa 2014

幸運だったこと

学科システムアップグレード

• 事前準備でパッケージは入れていた • 全サーバ共通項目の洗い出し

Page 56: kernel/vm@okinawa 2014

引き継ぎ大事

学科システムアップグレード

• 一部のサーバにはNICが2つついてた • VLAN帯が違うサーバ • LDAPの独自スキーマ • DNSはpostgresqlから引っ張ってくる • DHCPはmac-addr認証

Page 57: kernel/vm@okinawa 2014

困難を乗り越え

学科システムアップグレード

• なんとかサーバが起動するところまではきた • ちょっと休憩しよう

Page 58: kernel/vm@okinawa 2014

困難を乗り越え

学科システムアップグレード

• なんとかサーバが起動するところまではきた • ちょっと休憩しよう

_人人人人_ > 停電 < ‾Y^Y^Y‾

Page 59: kernel/vm@okinawa 2014

残作業

学科システムアップグレード

• 旧サーバから新サーバへの切り替え

Page 60: kernel/vm@okinawa 2014

残作業

学科システムアップグレード

• 旧サーバから新サーバへの切り替え

• 旧サーバと新サーバを 停電になった時に入れ替えればいいのでは

• そうすればユーザにはいつ入れ替えたのか分からない

この作戦はどうなった

Page 61: kernel/vm@okinawa 2014

でも、大丈夫

学科システムアップグレード

Page 62: kernel/vm@okinawa 2014

でも、大丈夫

学科システムアップグレード

Page 63: kernel/vm@okinawa 2014

でも、大丈夫

学科システムアップグレード

Page 64: kernel/vm@okinawa 2014

台風当たり年でした

学科システムアップグレード

Page 65: kernel/vm@okinawa 2014

結局

学科システムアップグレード

いろいろありましたがバージョンアップは無事終了

Page 66: kernel/vm@okinawa 2014

まとめ

学科システムアップグレード

• (暴風)雨天決行はやめましょう心身に悪いです

• ある程度事前準備はしておきましょう

Page 67: kernel/vm@okinawa 2014

• linuxのkernelをgdbで追いかけたかった話

• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話

• 未対応なWindowsにvCenterとか入れた話