kernel/vm@okinawa 2014
TRANSCRIPT
GDBでの kernel読み入門
+おまけ
@y0t4
自己紹介• 太田 陽祐
• Ingress Enlightened Agent L8
• 琉球大学院生
• Twitter: y0t4
• 浅く広くな人
今日話すこと• GDBでのkernel読み入門
• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話
時間が許す限り話していこうと思います
• GDBでのkernel読み入門
• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話
• GDBでのkernel読み入門
• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話
「入門」とあるように、ポイントや 引っかかる(引っかかっている)部分を
紹介します。
動機
• 「Linux kernelのソースとか読んでみたいよね」
!
_人人人人人人_ > 単純明快 < ‾Y^Y^Y^Y^Y‾
GDBでのkernel読み入門
ソースを読む方法• エディタで読む
• デバッガで読む
• パッチで読む
• printfで読む
kernelの実行に則して読みたかったのでデバッガを使うことに決定
GDBでのkernel読み入門
環境
• OS: CentOS 6.5 (kernel 3.9.2) • 去年の講義で使ったものを流用したので古めなバージョン
• CPU: Intel(R) Xeon(R) CPU [email protected]
GDBでのkernel読み入門
やったこと1. KVMホストとVMを用意 2. KGDB機能を有効化したkernelをビルド 3. ビルドしたkernelをVMに適用 4. KGDBのbootパラメータを設定 5. -sオプションを使ってVM起動 6. ホストからgdbで接続する(symbolはvmlinux) 7. 読む -> とりあえずネットワーク通信部分とか
GDBでのkernel読み入門
構成図
GDBでのkernel読み入門
kernel
qemu-kvm
$ gdb vmlinux(gdb)target remote :1234
VM
KGDB
kernel
ホストコンピュータ
• KVMホストとVMの関係は図のような感じ
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読み入門
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読み入門
qemu-kvm
qemu-kvmはオプションが多くコマンドが長い
GDBでのkernel読み入門
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読み入門
libvirt“libvirtは仮想機械の制御を抽象化したライブラリである。(wikipedia)”
!
• 起動 • virsh start [vm名]
!
<qemu:commandline> <qemu:arg value='-s'/> </qemu:commandline>
GDBでのkernel読み入門
gdb• VMを起動したら$ gdb vmlinux (gdb) target remote :1234でgdbからVMのkernelにアクセスできる !
これで読む準備は終わり
GDBでのkernel読み入門
ハマった場所• architecture • opaque pointer • compilerの最適化 • macroなソースコード • SIGTRAP • KGDB: Waiting for remote debugger
GDBでのkernel読み入門
architecture• “Remote 'g' packet reply is too long:” とかいうエラーが出る
• (gdb) set architecture i386:x86-64:intelで解決
GDBでのkernel読み入門
opaque pointer
GDBでのkernel読み入門
• (gdb) p *msg->msg_nameAttempt to dereference a generic pointer.(gdb) p msg->msg_name$1 = (void *) 0xffffffff8105ec01
• データが未定義なだけなので、定義されてからpするとかで解決
compilerの最適化• 読みたい変数とかを print すると <value optimized out>
• MakefileにEXTRA_CFLAGS += -O0を記述
GDBでのkernel読み入門
compilerの最適化• 読みたい変数とかを print すると <value optimized out>
• MakefileにEXTRA_CFLAGS += -O0を記述
GDBでのkernel読み入門
mm/ に-O0を記述するとkernel makeが通らない!(net/は通る)
compilerの最適化• 助けを求める
GDBでのkernel読み入門
compilerの最適化• 助けを求める
GDBでのkernel読み入門
compilerの最適化• 助けを求める
GDBでのkernel読み入門
最適化でprintできなくても レジスタに値は残ってるでしょ
それを読むんだよ それがバイナリハッカー
compilerの最適化• 助けを求める
GDBでのkernel読み入門
最適化でprintできなくても レジスタに値は残ってるでしょ
それを読むんだよ それがバイナリハッカー
な...なるほど...(゚∇゚;)
compilerの最適化• 助けを求める
GDBでのkernel読み入門
最適化でprintできなくても レジスタに値は残ってるでしょ
それを読むんだよ それがバイナリハッカー
解決してないけど解決な...なるほど...(゚∇゚;)
macroなソース
GDBでのkernel読み入門
• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)
macroなソース
GDBでのkernel読み入門
マクロ展開して make頑張ってみたら
• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)
macroなソース
GDBでのkernel読み入門
マクロ展開して make頑張ってみたら
• (gdb) l308 BUILDIO(b, b, char)(gdb) l BUILDIOFunction "BUILDIO" not defined. (マクロだし)
な...なるほど...(゚∇゚;)(g3オプションとかじゃダメかな...)
SIGTRAP
GDBでのkernel読み入門
• breakpointをdelした後にProgram received signal SIGTRAP, Trace/breakpoint trap.と別の場所に飛ばされる(ことがある)
それっぽいページは発見
http://stackoverflow.com/questions/9809413/program-received-signal-sigtrap-trace-breakpoint-trap
KGDB: Waiting for remote debugger
GDBでのkernel読み入門
• エラー再現が上手くいかないエラー VM側のコンソール上に上記のエラーが出力解決方法模索中です...
今後の読む方針
GDBでのkernel読み入門
ていうかどこから読んでるの
今後の読む方針
GDBでのkernel読み入門
ていうかどこから読んでるの
私nmをsockでgrepしてでてきた sock_create辺りから読んでます
今後の読む方針
GDBでのkernel読み入門
ていうかどこから読んでるの
私nmをsockでgrepしてでてきた sock_create辺りから読んでます
それはセンスがない read, writeから読むのが楽だから
今後の読む方針
GDBでのkernel読み入門
ていうかどこから読んでるの
私nmをsockでgrepしてでてきた sock_create辺りから読んでます
それはセンスがない read, writeから読むのが楽だから
なるほど!!!
まとめ
GDBでのkernel読み入門
• 濁流に飲まれてる感 • いろんなところで突っかかって楽しい • 知らない人だけでやるとどう手をつけたらいいか分からない
• 誰か知ってる人が近くに居ると良さそう
gdbを諦めて 本を読むという手も...
• linuxのkernelをgdbで追いかけたかった話
• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話
きっかけ
学科システムアップグレード
• 「CentOS6が出てそろそろ1年くらい経つし、夏休みでちょうどいいからそろそろCentOS5->6にしたいよね」
• という話がシステム管理なチーム内で出て、 バージョンアップすることに。
前提知識
学科システムアップグレード
• 琉球大学情報工学科では学科システムを学生が管理している
• 以前は「学生実験」の1テーマとして、 現在は希望者制
• 学科システムはDNSやDHCP、Webなどのサーバ群から学科ネットワーク、学生へのVM貸し出し、先生への対応など広い範囲を担当
やること
学科システムアップグレード
• 基幹サーバ群のOSメジャーバージョンアップ • Web, DNS*, DHCP, LDAP*, SMTP, IMAP, RADIUS, SHELL
• 基幹サーバはESX上のVM
懸念事項
学科システムアップグレード
• 引き継ぎ資料が無い • 人手不足(学生5人)
懸念事項
学科システムアップグレード
• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース
琉球大学と台風
学科システムアップグレード
• 大学構内はとにかく台風に弱い • すぐ停電する • 全然復旧しない
琉球大学と台風
学科システムアップグレード
• 大学構内はとにかく台風に弱い • すぐ停電する • 全然復旧しない
ここから見える景色全部 電気ついてるのに 大学は停電中とか...
懸念事項
学科システムアップグレード
• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース
つらいけどグーグル様に...
懸念事項
学科システムアップグレード
• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース
懸念事項
学科システムアップグレード
• 引き継ぎ資料が無い • 人手不足(学生5人) • 作業日に台風直撃コース
ヤバい
いや、待てよ
学科システムアップグレード
• 旧サーバと新サーバを停電になった時に入れ替えればいいのでは
• そうすればユーザにはいつ入れ替えたのか分からない
(暴風)雨天決行
学科システムアップグレード
今思えば完全に間違った判断でした。
RTA開始
学科システムアップグレード
• 旧サーバから新サーバへconfをコピーしたり • CentOS5から6でconfの置き場所が変わってる • 必要なのかそうでないのか分からない設定群 • ドキュメントがないため
• 当然なかなか上手くいかず !
RTA開始
学科システムアップグレード
• 旧サーバから新サーバへconfをコピーしたり • CentOS5から6でconfの置き場所が変わってる • 必要なのかそうでないのか分からない設定群 • ドキュメントがないため
• 当然なかなか上手くいかず • 迫る台風 • 停電の恐怖
作業時間
学科システムアップグレード
• 2012年 9月 15日 18:00 ~
作業時間
学科システムアップグレード
• 2012年 9月 15日 18:00 ~
作業時間
学科システムアップグレード
• 2012年 9月 15日 18:00 ~
幸運だったこと
学科システムアップグレード
• 事前準備でパッケージは入れていた • 全サーバ共通項目の洗い出し
引き継ぎ大事
学科システムアップグレード
• 一部のサーバにはNICが2つついてた • VLAN帯が違うサーバ • LDAPの独自スキーマ • DNSはpostgresqlから引っ張ってくる • DHCPはmac-addr認証
困難を乗り越え
学科システムアップグレード
• なんとかサーバが起動するところまではきた • ちょっと休憩しよう
困難を乗り越え
学科システムアップグレード
• なんとかサーバが起動するところまではきた • ちょっと休憩しよう
_人人人人_ > 停電 < ‾Y^Y^Y‾
残作業
学科システムアップグレード
• 旧サーバから新サーバへの切り替え
残作業
学科システムアップグレード
• 旧サーバから新サーバへの切り替え
• 旧サーバと新サーバを 停電になった時に入れ替えればいいのでは
• そうすればユーザにはいつ入れ替えたのか分からない
この作戦はどうなった
でも、大丈夫
学科システムアップグレード
でも、大丈夫
学科システムアップグレード
でも、大丈夫
学科システムアップグレード
台風当たり年でした
学科システムアップグレード
結局
学科システムアップグレード
いろいろありましたがバージョンアップは無事終了
まとめ
学科システムアップグレード
• (暴風)雨天決行はやめましょう心身に悪いです
• ある程度事前準備はしておきましょう
• linuxのkernelをgdbで追いかけたかった話
• (停電におびえながら)学科システムの OSメジャーバージョンアップをした話
• 未対応なWindowsにvCenterとか入れた話