今は昔、去年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、これでグラフィカルなセットアップをする。
ありましたね。
この一番下の方に見えているやつを有効にしてビルド。
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
ずきゅーん。
パニックは起こるんだが、コンソールを見てもなにも来ない。
資料によるとパニックイベントの通知というものがパニックした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って便利だなぁ。
ではでは実践なのですが、こうしてコンソールから状態を見るとうまくできているかのように見えるんだが。
いざ、実食。
うまくいっていれば、(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をインストールした