学习目标

问题:

  • 在用qemu + libvirtd中,是如何调试的?如何获取日志信息?如何将qemu的消息打印出来?
  • 在qemu系统中,如何去调试?在libvirt中,又如何去调试追踪?

顺便贴下编译qemu的方法

  1. sudo apt-get install -y libpixman-1-dev # 需要依赖 pixman
  2. sudo apt-get install -y build-essential libepoxy-dev libdrm-dev libgbm-dev libx11-dev libvirglrenderer-dev libpulse-dev libsdl2-dev
  3. sudo apt-get install -y libgusb-dev # libusb需要
  4. # spice 安装 https://blog.csdn.net/clydezhou/article/details/7418782
  5. # opengl mesa 安装
  6. # 自己用的调试版本
  7. git clone git://git.qemu.org/qemu.git
  8. git checkout -b v4.0.0 v4.0.0
  9. make clean
  10. ./configure --prefix= \
  11. --enable-kvm \
  12. --enable-trace-backends=log \
  13. --disable-strip \
  14. --enable-debug \
  15. --enable-debug-info \
  16. --enable-libusb \
  17. --enable-usb-redir \
  18. --enable-curl \
  19. --enable-sdl \
  20. --enable-opengl \
  21. --enable-virglrenderer \
  22. --enable-system \
  23. --enable-modules \
  24. --audio-drv-list=pa \
  25. --enable-vhost-net \
  26. --enable-vnc \
  27. --target-list=x86_64-softmmu
  28. root@inno-MS-7B89:qemu# /usr/local/bin/qemu-system-x86_64 --version
  29. QEMU emulator version 4.0.0 (v4.0.0-dirty)

注:在编译qemu时最好把所有debug信息都打开

  1. --enable-trace-backends=log \
  2. --disable-strip \
  3. --enable-debug \
  4. --enable-debug-info \

qemu-mointor

相关参考:

如何使用mointor模式

使用qemu-system-xxx命令创建的虚拟机,可通过以下方式进入到mointor模式

  1. ctrl+alt+1 虚拟机模式
  2. ctrl+alt+2 qemu调试模式, 可通过 info xxx查看虚拟机状态

在libvirtd如何使用mointor

  1. virsh qemu-monitor-command --hmp domain_name help # 查看支持命令
  2. # 比如 domain_name=ubuntu18.04
  3. # virsh qemu-monitor-command --hmp ubuntu18.04 info # 进入到mointor的info命令

注:

  • qemu monitor protocol 简称qmp,是以json为格式的一种协议
  • qmp和hmp的区别是qmp命令使用的是json格式,hmp直接使用命令
  • qmp本质是一个本地的unix socket。qemu是server端,libvirt是client端

利用gdb调试qemu

注:这里不是使用gdb调试 qemu中的系统,而是用gdb来调试qemu

  1. gdb --tui --args qemu-system-......
  2. gdb --tui --args /opt/x86_64/qemu-x86-bin/bin/qemu-system-x86_64 -smp 2 -cpu host -enable-kvm -m 512M -kernel linux/arch/x86/boot/bzImage \
  3. -hda ./x86_64.img -hdb ./Freeze.img -nographic \
  4. -append "root=/dev/sda rw rootfstype=ext4 console=ttyS0 init=linuxrc loglevel=8"

qemu的打印

qemu的trace

相关参考

使用

  1. # 添加你想要trace的event
  2. $ cat /tmp/events
  3. virtio_blk_req_complete
  4. virtio_blk_handle_write
  5. # 启动虚拟机带入trace参数
  6. -trace events=/tmp/events,file=trace.bin
  7. /tmp/events就是要跟踪的event,而trace.bin就是trace产生的文件,不能直接读,而要通过工具来读。
  8. # 通过专业工具去解析 https://github.com/qemu/qemu/tree/master/scripts/tracetool
  9. python3 simpletrace.py trace-events trace.bin