pvpanicを試してみる

今は昔、去年7月のSoftwareDesginに載っていたkernel3.10からの新機能で、pvpanicというやつの記事を見たときにわりと衝撃を受けて、いつの日か使ってやるんだ~!と思いながらも別に何もしない日が続いていた。

自宅サーバーはKVMでVPS化しているので、また最初から設定をやり直すのがめんどくさいからこのままにしておきたかったのだけど、仕方ないのでアンインストール アンインストール。
最高のリアルが向こうやってきたのだ。

今回はいつもと大きく違ってて、情報が全然ないという事なんだが、まぁやってみるかと。
検証は失敗なのですが、新しい事も分かったので作業メモ的に残しておきまう。

まずは、OSのインストール作業をします。
はい、出来たのがこれ。

# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
# uname -ri
3.10.0-123.el7.x86_64 x86_64
# lsmod | grep kvm
kvm_intel             138567  0
kvm                   441119  1 kvm_intel

今回(CentOS7)からは、KVMのモジュールが最初からロードされているようだね。
KVMの準備だけど、CentOS7で必要なものとか検証しているひまはないので、過去の日記を参照して全部いれちゃえ。

# yum groupinstall Virtualization "Virtualization Client"\
"Virtualization Platform" "Virtualization Tools"
# yum install gcc kernel-devel zlib-devel pciutils-devel pciutils-libs\
glib2-devel bridge-utils

どうやら、うまく入ったようです。

さてここで、PVPANICに必要なものですが。
・QEMU 1.5以降
・Linuxカーネル3.10以降
・seabiosのgit版
基本はこの3点らしい。
あとそろっていないのは、seabiosのgit版なので用意をしないといけないのだが。
seabiosだって??
もちろんseabiosってなんだ?って状態だよ!
seabiosのインストールにいってみよう。

# yum -y install iasl  
# git clone git://git.qemu.org/seabios.git seabios.git
# cd seabios.git
# make

と、ここでエラーが出るんだが、makeできないのはseabiosのバグらしい。

[root@testserver seabios.git]# make
  Building ld scripts
Version: rel-1.7.5-41-g3aa31d7-20140729_192734-testserver
Traceback (most recent call last):
  File "./scripts/layoutrom.py", line 685, in <module>
    main()
  File "./scripts/layoutrom.py", line 629, in main
    info16 = parseObjDump(infile16, '16')
  File "./scripts/layoutrom.py", line 544, in parseObjDump
    relocsection = sectionmap[sectionname]
KeyError: '.text.on_extra_stack'
make: *** [out/romlayout16.lds] エラー 1

解決するには

[root@testserver seabios.git]# LC_ALL=C make
  Building ld scripts
Version: rel-1.7.5-41-g3aa31d7-20140729_192834-testserver
Fixed space: 0xe05b-0x10000  total: 8101  slack: 10  Percent slack: 0.1%
16bit size:           35432
32bit segmented size: 2127
32bit flat size:      22736
32bit flat init size: 70848
Lowmem size:          2160
f-segment var size:   1193
  Linking out/rom16.o
  Stripping out/rom16.strip.o
  Linking out/rom32seg.o
  Stripping out/rom32seg.strip.o
  Linking out/rom.o
  Prepping out/bios.bin.prep
Total size: 138364  Fixed: 61488  Free: 123780 (used 52.8% of 256KiB rom)
  Creating out/bios.bin

これでseabiosのインストールはおわった。
これでいいのかどうかは分からないが、とにかく進むしかない。
なぜなら戻リ方が分からないから。

ひとまず道具だけは一通り揃ったので、本に書いてあるような確認をちょこっと進めてみる。

# modprobe pvpanic
# lsmod | grep panic

うんともすんとも、にんともかんともなのです。
根本的に間違っていたようで、カーネルの再構築が必要かと。

のちのち必要になったものをインストール。

# yum install ncurses ncurses-devel.x86_64 bc

では、ダウンロード第22章。

# curl -O https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.50.tar.xz
# tar zxvf linux-3.10.50.tar.xz
# xz -dv linux-3.10.50.tar.xz
# tar -xvf linux-3.10.50.tar
# cd linux-3.10.50

ここからは定番の試験に出るコースかな?

# cp /boot/config-3.10.0-123.4.4.el7.x86_64 .config
# make oldconfig
# make menuconfig

menuconfig、これでグラフィカルなセットアップをする。

panic01

ありましたね。
この一番下の方に見えているやつを有効にしてビルド。

Device Drivers ---
  [*] x86 Platform Specific Device Drivers ---
     <M> pvpanic device support

さて

# make

長いぞ!!

# make modules_install
# make install
# make install
sh /root/linux-3.10.50/arch/x86/boot/install.sh 3.10.50 arch/x86/boot/bzImage \
        System.map "/boot"

寝る前にやったので、makeが長くて結局は1日経過してから出来上がりました。
grub.confは書き換えはせずにgrubから選択して起動。

# uname -ir
3.10.50 x86_64

そして、チェック。

[root@testserver ~]# modprobe pvpanic
[root@testserver ~]# lsmod
Module                  Size  Used by
pvpanic                12801  0

出ました!
ここまでは良かったけど。ここから先はまた謎だらけ。
なんだかよく分からないので、とりあえずVMを作ってみる。
失敗したらそこから考えよう。

。。。
インストール完了。

ではVMを立ち上げて、本に書いてあるようなチェックをしてみよう。
seabiosってなんだと思ってたけど、VMのコンソールにseabiosって書いてあるね。

# strings /sys/firmware/acpi/tables/SSDT | grep QEMU
QEMU001

おおっと!今度はこの表示が出てくれた。
もちろんkernel2.6なので、pvpanicは表示されない。
どうなるか分からないけど、いっぺんパニックさせてみよう。

# echo c > /proc/sysrq-trigger

おお、ほんとにパニックした。
初めて叩いたけども、このコマンドは気を付けよう。

でもホストOSには何も起こらない。
となると、カーネルモジュールはゲスト側のファイルシステムにインストールしましょうと書いてあるのはゲスト側にpvpanicをロードしようという事でしたか?
うーむ。
言葉の意味がはっきりしないのでやってみるか。
まあ、たぶんゲスト側に入れろということだろう。

今度はkernel2.6から3.10なので、make oldconfigが長いぞ~。
pvpanicはmenuconfigで選択できるので、ここはエンター連打でもOKだが。
ホストOSでパケットが抜ける設定をすっかり忘れていて、VM側での名前解決ができるまで時間がかかってしまったのだが、それも忘れてしまうくらいmakeが長い。

だが、ここに来て大ショックなことが。

空き容量がなくなった!!!

仕方ないので、VMの構築からやりなおすことに・・・orz
普通はありえないと思うけど、vmとかで遊んでる時は空き容量には気を付けましょう(泣)

では、準備ができたので確認から。
VMからだと本の通りの表示がされるわけだ。

[root@localhost ~]# strings /sys/firmware/acpi/tables/SSDT | grep QEMU
QEMU0001
[root@localhost ~]# modprobe pvpanic
[root@localhost ~]# lsmod | head
Module                  Size  Used by
pvpanic                 1881  0

では、パニックさせてみよう。

[root@localhost ~]# echo c > /proc/sysrq-trigger

ずきゅーん。

panic02

パニックは起こるんだが、コンソールを見てもなにも来ない。
資料によるとパニックイベントの通知というものがパニックしたVMから飛ばされるので、通知を受け取れればOKなはず。

こんなコマンド一覧があったが、全部ためしたけど何も来ていない。

[root@testserver ~]# virsh qemu-monitor-command --hmp vm03 'info'
info balloon  -- show balloon information
info block  -- show the block devices
info block-jobs  -- show progress of ongoing block device operations
info blockstats  -- show block device statistics
info capture  -- show capture information
info chardev  -- show the character devices
info cpus  -- show infos for each CPU
info history  -- show the command line history
info irq  -- show the interrupts statistics (if available)
info jit  -- show dynamic compiler info
info kvm  -- show KVM information
info mem  -- show the active virtual memory mappings
info mice  -- show which guest mouse is receiving events
info migrate  -- show migration status
info migrate_cache_size  -- show current migration xbzrle cache size
info migrate_capabilities  -- show current migration capabilities
info mtree  -- show memory tree
info name  -- show the current VM name
info network  -- show the network state
info numa  -- show NUMA information
info pci  -- show PCI info
info pcmcia  -- show guest PCMCIA status
info pic  -- show i8259 (PIC) state
info profile  -- show profiling information
info qdm  -- show qdev device model list
info qtree  -- show device tree
info registers  -- show the cpu registers
info roms  -- show roms
info snapshots  -- show the currently saved VM snapshots
info spice  -- show the spice server status
info status  -- show the current VM status (running|paused)
info tlb  -- show virtual to physical memory mappings
info tpm  -- show the TPM device
info trace-events  -- show available trace-events & their state
info usb  -- show guest USB devices
info usbhost  -- show host USB devices
info usernet  -- show user network stack connection states
info uuid  -- show the current VM UUID
info version  -- show the version of QEMU
info vnc  -- show the vnc server status

qmp-shellというものがあるらしいので、試してみよう。

[root@testserver ~]# python qmp-shell /var/lib/libvirt/qemu/vm03.monitor
Traceback (most recent call last):
  File "qmp-shell", line 33, in <module>
    import qmp
ImportError: No module named qmp

qmp.pyをインストールしてみたものの

[root@testserver ~]# python qmp-shell /var/lib/libvirt/qemu/vm03.monitor             ^CTraceback (most recent call last):
  File "qmp-shell", line 259, in <module>
    main()
  File "qmp-shell", line 245, in main
    qemu.connect()
  File "qmp-shell", line 121, in connect
    self._greeting = qmp.QEMUMonitorProtocol.connect(self)
  File "/root/qmp.py", line 86, in connect
    return self.__negotiate_capabilities()
  File "/root/qmp.py", line 53, in __negotiate_capabilities
    greeting = self.__json_read()
  File "/root/qmp.py", line 64, in __json_read
    data = self.__sockfile.readline()
  File "/usr/lib64/python2.7/socket.py", line 447, in readline
    data = self._sock.recv(self._rbufsize)

どうもうまく動いていない様子。

virsh consoleで繋いでみたところ。

[root@localhost ~]# SysRq : Trigger a crash
BUG: unable to handle kernel NULL pointer dereference at           (null)
IP: [<ffffffff8131b366>] sysrq_handle_crash+0x16/0x20
PGD 3cc75067 PUD 3cc77067 PMD 0
Oops: 0002 [#1] SMP
Modules linked in: pvpanic ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 microcode pcspkr floppy virtio_balloon sg 8139too 8139cp mii i2c_piix4 i2c_core ext4(F) jbd2(F) mbcache(F) sr_mod(F) cdrom(F) sd_mod(F) crc_t10dif(F) virtio_pci(F) virtio_ring(F) virtio(F) pata_acpi(F) ata_generic(F) ata_piix(F) dm_mirror(F) dm_region_hash(F) dm_log(F) dm_mod(F)
CPU: 0 PID: 1043 Comm: bash Tainted: GF            3.10.0 #1
Hardware name: Red Hat KVM, BIOS Bochs 01/01/2011
task: ffff88003d991520 ti: ffff88003d7bc000 task.ti: ffff88003d7bc000
RIP: 0010:[<ffffffff8131b366>]  [<ffffffff8131b366>] sysrq_handle_crash+0x16/0x20
RSP: 0018:ffff88003d7bde58  EFLAGS: 00010092
RAX: 000000000000000f RBX: 0000000000000063 RCX: ffff88003fc0eab0
RDX: 0000000000000000 RSI: ffff88003fc0cf48 RDI: 0000000000000063
RBP: ffff88003d7bde58 R08: 0000000000000003 R09: 0000000000008588
R10: 00000000000001e5 R11: 00000000000001e6 R12: ffffffff81aa03e0
R13: 0000000000000282 R14: 0000000000000004 R15: 0000000000000000
FS:  00007f9aeb2f9700(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000000 CR3: 000000003cc72000 CR4: 00000000000006f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Stack:
 ffff88003d7bde98 ffffffff8131bcc9 ffff880000000002 000000000000001c
 fffffffffffffffb 00007f9aeb2fe000 ffff88003d7bdf40 ffff88003d7bdf40
 ffff88003d7bdec8 ffffffff8131bd7a 0000000000000001 00007f9aeb2fe000
Call Trace:
 [<ffffffff8131bcc9>] __handle_sysrq+0x129/0x190
 [<ffffffff8131bd7a>] write_sysrq_trigger+0x4a/0x50
 [<ffffffff811cc683>] proc_reg_write+0x43/0x70
 [<ffffffff8116810f>] vfs_write+0xdf/0x190
 [<ffffffff8116865f>] SyS_write+0x5f/0xa0
 [<ffffffff81545e42>] system_call_fastpath+0x16/0x1b
Code: a1 1f 22 00 31 c0 eb ac 90 90 90 90 90 90 90 90 90 90 90 90 90 55 48 89 e5 0f 1f 44 00 00 c7 05 fd 36 a0 00 01 00 00 00 0f ae f8 <c6> 04 25 00 00 00 00 01 c9 c3 55 48 89 e5 0f 1f 44 00 00 8d 47
RIP  [<ffffffff8131b366>] sysrq_handle_crash+0x16/0x20
 RSP <ffff88003d7bde58>
CR2: 0000000000000000
---[ end trace 3a51ea3cc0920c4e ]---
Kernel panic - not syncing: Fatal exception

コンソールに流れていたものばかりだ。たぶん。

色々見てみよう。

# virsh dominfo vm03
Id:             8
名前:         vm03
UUID:           d4d53837-2a12-48dc-b682-4a0fb92248fc
OS タイプ:   hvm
状態:         実行中
CPU:            1
CPU 時間:     166.8s
最大メモリー: 1048576 KiB
使用メモリー: 1048576 KiB
永続:         はい (yes)
自動起動:   無効にする
管理済み保存: いいえ (no)
セキュリティモデル: selinux
セキュリティ DOI: 0
セキュリティラベル: system_u:system_r:svirt_t:s0:c300,c665 (enforcing)

# virsh domjobinfo vm03
ジョブ形式:  なし

# virsh domblkerror vm03
エラーがありませんでした

信号が来ない・・・。

もしかするとvirt-managerにまだオプションがないという記事を以前見たので、いまだにまだ対応していないという可能性もあるのでやり方を変えてみよう

libvirtを使わずにやってみよう

となるとまたOSのインストールからだが・・・しゃあねえ。

入れ物を作り。

# qemu-img create -f qcow2 vm00.img 10G

エミュレータを走らせる。

qemu-system-x86_64 -enable-kvm \
-hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize \
-cdrom /var/iso/CentOS-6.5-x86_64-minimal.iso -boot d

インストールが終わったら強制終了して、CDを抜いて(記述を消して)起動。

qemu-system-x86_64 -enable-kvm \
-hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize

つづいてアップデートして、カーネル再構築。
起動しなおして、pvpanicモジュールをロード。んでパニックさせる。

書いてみると2行だけど、だいぶかかってしまうんだorz
と思ったんだが、libvirtで作ったvmをlibvirtなしで起動できるか試してみたらうまくいったのでこっちでやってみよう(笑)

qemu-system-x86_64 -enable-kvm \
-hda /var/lib/libvirt/images/vm03 -m 1024 -monitor telnet::4444,server,nowait\
-vnc :0 -daemonize  -k ja

おお、うまく起動しました。動くんだね。
しかしこうやってみるとvirt-managerって便利だなぁ。

ではでは実践なのですが、こうしてコンソールから状態を見るとうまくできているかのように見えるんだが。

panic03

いざ、実食。

うまくいっていれば、(qemu) info status VM status: paused (guest-panicked)になるはず。

[root@testserver ~]# telnet localhost 4444
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 1.7.2 monitor - type 'help' for more information
(qemu) info status
VM status: running

 

うーん。だめぽ

続く ・・・かどうかは分からない。

 

参考サイト

たけけんのサーバー勉強日記 CentOSにKVMを入れてみる

さくらインターネット研究所  KVMを使う(インストール編)

たけけんのサーバー勉強日記  KVM+Virsh-installでCentOSをインストールした

momoto.github.io  QEMUをつかって仮想マシンを作成する

QEMU/KVMでキーマップが正しくない件の対処

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です