调试QEMU+RBD: 虚拟机的 IO流程 [TODO]

这里记录了调试QEMU中 GuestVM发起IO请求,到最终IO请求落盘到Ceph OSD的全过程。

环境准备

想了想,这个调试环境还是很复杂的: QEMU要能够调试,GuestVM内核要能够调试,然后Ceph要能够调试。
下面尝试来说明下,之前也零散的说过些,但是这里想要把全过程记录下来,所以就再写一遍。

Host操作系统版本以及基础配置

Host操作系统版本:centos 7.6或以上
下载地址:
https://mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
一些配置:

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum update && yum groupinstall "Development Tools"

编译Ceph

这里为什么要先编译ceph ,因为编译ceph过程中会安装的众多RPM devel package,解决大部分的包依赖,可以为后面的组件编译提供便利。2333
详细编译步骤见这里:https://www.cnblogs.com/powerrailgun/p/12133107.html

编译QEMU

下载qemu-4.1.1.tar.gz版本
https://download.qemu.org/
解压之。
具体需要的依赖包视实际情况而定,参考:

yum install pixman-devel -y

最终安装后的版本:

pixman-devel-0.34.0-1.el7.x86_64
pixman-0.34.0-1.el7.x86_64

可能还会安装诸如bisonflex这样的工具。
因为我们要和后端Ceph对接,因此还需要安装rbd devel安装包,版本需要和后面对接的ceph版本一致,否则可能会出现问题。本人调试环境中ceph版本是12.2.5,所以这里也是用12.2.5的环境。

yum install librbd-devel-12.2.5-0.el7.x86_64 librbd1-12.2.5-0.el7.x86_64

为了不和以后系统安装的qemu发生冲突,这里将qemu安装到/debug目录下,没有这个目录就新建一个。
到qemu源码目录中执行configure:

./configure --enable-rbd --enable-debug --enable-trace-backends=simple --enable-debug-stack-usage --enable-kvm --enable-vnc --prefix=/debug --target-list=x86_64-softmmu

注意

  1. 如果不加上--target-list=x86_64-softmmu选项,那么会编译所有平台的模拟器,即就是不限于x86_64
  2. --enable-rbd可能需要安装librdb库(前面已经安装)。
  3. --enable-trace-backends=simple该选项可能会影响性能,故生产环境中应关闭该选项,调试环境中推荐开启。

接着,开始编译和安装:

make -j4
make install

编译GDB

下载gdb源码:

wget https://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.tar.gz

由于GDB依赖expat,所以需要先编译expat

wget https://github.com/libexpat/libexpat/releases/download/R_2_2_8/expat-2.2.8.tar.bz2

解压:expat-2.2.8.tar.bz2
然后开始执行编译:

./configure --prefix=/debug/expat-2.2.8
make -j4 && make install

4.2 开始编译安装gdb
在正式编译gdb之前,需要编辑下这个路径下的代码: gdb/remote.c
remote_target::process_g_packet()函数中的一部分内容修改成这个样子,否则gdb调试的时候可能出错:

  /* Further sanity checks, with knowledge of the architecture.  */
//  if (buf_len > 2 * rsa->sizeof_g_packet)
 //   error (_("Remote 'g' packet reply is too long (expected %ld bytes, got %d "
//           "bytes): %s"), rsa->sizeof_g_packet, buf_len / 2, rs->buf);
if (buf_len > 2 * rsa->sizeof_g_packet) {
    rsa->sizeof_g_packet = buf_len;
    for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
    {
        if (rsa->regs[i].pnum == -1)
            continue;
        if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
            rsa->regs[i].in_g_packet = 0;
        else
            rsa->regs[i].in_g_packet = 1;
    }
}

还需要安装一个包,否则在make install时会出现错误。

yum install texinfo -y

进入到gdb-8.2的目录下,编译gdb:

./configure --prefix=/opt --with-expat --includedir=/debug/expat-2.2.8/include/ --libdir=/debug/expat-2.2.8/lib

这里假设我的expat放置在/debug路径下。
然后执行make:

make 
make install 

编译GuestVM内核

参考这里的说明:https://www.cnblogs.com/powerrailgun/p/12168396.html

调试过程记录

原文地址:https://www.cnblogs.com/powerrailgun/p/12200986.html