调试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
可能还会安装诸如bison
和flex
这样的工具。
因为我们要和后端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
注意:
- 如果不加上--target-list=x86_64-softmmu选项,那么会编译所有平台的模拟器,即就是不限于x86_64
- --enable-rbd可能需要安装librdb库(前面已经安装)。
- --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