- KVM的情况
- virsh list
- virsh edit<domain名>
- LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=none/u s r/l i b e x e c/q e m u-k v m-M r h e l 6. 0.0-e n a b l e-k v m-m 1 0 2 4-s m p 2,sockets=2,cores=1,threads=1-name test-uuid 031cda76-6500-7f53-6250-f44bec96a5a8-nodefconfig-nodefaults-chardev socket, id=monitor, path=/var/lib/libvirt/qemu/test.monitor, server, nowait-mon chardev=monitor, mode=control-rtc base=utc-boot c-drive file=/var/lib/libvirt/images/test.img, if=none, id=drive-virtio-disk0,boot=on, format=raw, cache=none-device virtio-blk-pci, bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0-drive if=none, media=cdrom, id=drive-ide0-1-0,readonly=on, format=raw-device ide-dri ve, bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0-chardev pty, id=serial0-device isa-serial, chardev=serial0-usb-device usb-tablet, id=input0-vnc 127.0.0.1:3-vga cirrus-device AC97,id=sound0,bus=pci.0,addr=0x4-device virtio-balloon-pci, id=balloon0,bus=pci.0,addr=0x6-s
- gdb—quiet/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/vmlinux
- virsh dump rhel6-1/tmp/test-dump
- crash/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/vmlinux/tmp/test-dump
KVM的情况
KVM的日志中有如下内容。
/var/log/libvirt/qemu/<客户端操作系统名>.log:libvirt的日志
/var/log/messages:主机操作系统的日志
在KVM中也和Xen一样可以使用virsh list命令确认客户端操作系统的状态。
virsh list
Id名称状态
13rhel6-4运行中
14rhel6-1运行中
在KVM中调试客户端操作系统时使用gdb就会非常简单。KVM中是经由qemu将gdb连接到客户端操作系统。在qemu启动选项中加上-s,就可以调试客户端操作系统。
在使用libvirt的情况下,有时也可以通过virsh edit来改写客户端操作系统的配置文件,以使用-s选项。但需要[1]意,一部分旧的libvirt是不支持这个XML的。另外,在系统中只能使用一个gdb来进行客户端操作系统调试。
virsh edit<domain名>
修改如下注7:
-<domain type='kvm'>
+<domain type='kvm'xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
+<qemu:commandline>
+
<qemu:arg value='-s'/>
+</qemu:commandline>
LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=none/u s r/l i b e x e c/q e m u-k v m-M r h e l 6. 0.0-e n a b l e-k v m-m 1 0 2 4-s m p 2,sockets=2,cores=1,threads=1-name test-uuid 031cda76-6500-7f53-6250-f44bec96a5a8-nodefconfig-nodefaults-chardev socket, id=monitor, path=/var/lib/libvirt/qemu/test.monitor, server, nowait-mon chardev=monitor, mode=control-rtc base=utc-boot c-drive file=/var/lib/libvirt/images/test.img, if=none, id=drive-virtio-disk0,boot=on, format=raw, cache=none-device virtio-blk-pci, bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0-drive if=none, media=cdrom, id=drive-ide0-1-0,readonly=on, format=raw-device ide-dri ve, bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0-chardev pty, id=serial0-device isa-serial, chardev=serial0-usb-device usb-tablet, id=input0-vnc 127.0.0.1:3-vga cirrus-device AC97,id=sound0,bus=pci.0,addr=0x4-device virtio-balloon-pci, id=balloon0,bus=pci.0,addr=0x6-s
从其他终端启动gdb。使用target remote命令连接到127.0.0.1的1234号端口。连接后客户端操作系统就会进入停止状态。使用gdb的info register命令等可以确认寄存器的内容或内存状态等。
gdb—quiet/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/vmlinux
Reading symbols from/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/
vmlinux……done.
(gdb)target remote 127.0.0.1:1234
Remote debugging using 127.0.0.1:1234
native_safe_halt()at/usr/src/debug/kernel-2.6.32-71.el6/linux-2.6.32-71.
使用这个gdb功能,还可以使操作系统像应用程序一样单步运行。另外,还可以设置断点(break point),在任意地方停止客户端操作系统运行等,这是非常强大的调试功能。
在KVM上调试BIOS等情况必须在8086模式下,因此一定不能忘记使用下列命令更改模式。
(gdb)set arch i8086
也可以与Xen一样提取客户端操作系统的内存转储。在KVM的情况下使用virsh dump。由于virsh dump是最近才添加的功能,因此也有一些发布版尚不能使用。
virsh dump rhel6-1/tmp/test-dump
域rhel6-1转储到/tmp/test-dump。
转储文件的内容可以使用crash命令来查看。
crash/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/vmlinux/tmp/test-dump
注意事项:crash-4.0-8.12中添加了能够分析使用virsh dump提取的内存转储文件的功能。然后进行了各种修改和改善。旧版的crash命令有时不能查看使用virsh dump提取的转储文件,建议尽量使用最新的crash命令。
[1]7:‘-’表示删除,‘+’表示添加。