0%

cephfs源码调试

  • 编译调试ceph

    环境配置介绍

    系统:ubuntu20.04
    内存:16GB
    不建议在虚拟机上进行编译,我就是一直在虚拟机上试了好久各种小问题,最后直接在物理机上一遍编译就过了。。。
    注意ceph的安装路径不要有中文

安装ceph详细操作步骤

  • 检查电脑是否安装了git
  • 升级apt包版本:
    sudo apt upgrade
  • 检查代理是否打开,从github项目上克隆项目(整个项目会比较大需要一定时间):
    git clone --recursive https://github.com/ceph/ceph.git
  • 运行依赖检查脚本,注意增加sudo权限:
    sudo ./install-deps.sh
    这里要注意一定要完成所有的步骤,有可能会在下载mkcodes的那步卡住,可以多执行几次直到成功
  • 运行do_cmake.sh脚本,生成build文件:
    sudo ./do_cmake.sh
  • 进入build文件夹,使用ninja命令进行编译(这里也要注意开多核编译要小心内存不够,我这边开了4核编译中间发生了一次内存溢出,如果遇到了这种情况重新执行编译指令就行)
    cd build && sudo ninja -j4
    整个编译过程可能需要花费数个小时,编译完成会有提示。
    • 可能在编译过程中遇到的问题:
      1. 各种因为权限不足导致的报错(诸如npm下载失败,mkdir失败),遇到这种情况可以直接进入root用户进行编译。
      2. 下载超时,执行git指令的时候失败,建议检查自己的代理是否开启
      3. 存储分配报错,这个我只遇到了一次,建议sudo ninja clean后重新编译
      4. 缺少某些依赖包或者是由于版本的原因产生的报错,建议检查自己电脑上是不是原先已经安装了同名老版本的依赖包,直接删除就行。
  • 在当前目录下准备vstart
    sudo ninja vstart
  • 初始化一个集群(注意一定要在build目录下执行这条命令):
    sudo ../src/vstart.sh --debug --new -x --localhost --bluestore
  • 成功完成以上步骤检查集群状态:
    ./bin/ceph -s
    原本ceph自带的各种命令都在build/bin的目录下,感兴趣可以自行尝试
    1
    2
    ./bin/rados -p rbd bench 30 write
    ./bin/rbd create foo --size 1000

使用gdb进行调试具体步骤

  • 重新启动一个集群,这次选择只启动一个mds

    1
    sudo MON=1 OSD=3 MDS=1 MGR=1 RGW=0 ../src/vstart.sh -d -n -x --without-dashboard
  • 使用ceph-fuse挂载ceph文件系统,这里我们直接使用了/mnt目录作为挂载的文件系统,在build目录下执行
    sudo ./bin/ceph-fuse -c ./ceph.conf /mnt

  • 查看所有的ceph进程

    1
    ps -ef | grep ceph

    找到我们需要的mds的进程号,首先打开gdb
    sudo gdb
    接着在gdb中获取对应的mds进程号
    attach (你获取的mds进程号)
    这里我们进行调试的是mds中MDCache.cc文件中的path_traverse函数:
    b path_traverse
    直接在这个函数的入口位置设置好了断点,这个时候只需要我们在打开一个终端输入对某个文件进行访问的指令就可以进入到在mds上设置的断点了。

  • 在另一窗口上执行以下指令创建一个txt文件:
    sudo touch /mnt/dir1/dir2/file2.txt
    接着在gdb调试窗口输入c就可以看到程序在之前设置的断点处停了下来。

  • 关于更多的详细的gdb调试方法请见博客