虽然librbd和librados可以满足大部分ceph的使用需求,但是在实际使用中(特别是ceph与kubernetes结合),仍需krbd模块。当然,rbd-nbd也是一种解决方案,在这不多说。
显然,krbd依赖linux的内核版本,而普遍地,生产环境下的系统很少会升级到最新的内核(毕竟稳定性还是第一位)。这就会造成krbd的代码跟不上社区版本,有些bug即使修复了也难以应用起来。
因此,本文基于centos7的发行版,简单介绍如何使用ceph进行修改模块的编译和问题调式定位。
同时,如果使用过centos7.0的朋友们应该知道,在kernel-3.10.0-123版本,rbd模块默认是不安装的,即只能通过模块编译加载的方式来使用ceph的rbd,否则执行rbd map操作是会失败的。
linux模块编译
linux的模块编译在网上很多地方都能够找到,这里不描述详细细节,只说一下需要注意的事情。
- 如果不打算升级内核,那么模块编译时的kernel源码一定要与当前发行版本的内核一致。比如,centos7.0对应内核版本为kernel-3.10.0-123,如果不确定,可以使用
uname -r
来查询到(针对rhel系的系统)。一般地,内核源码可以在rpmsearch中找到。千万不要将发行版的linux内核和torvalds/linux搞混了。 - 手动编译的内核模块一般是没有签名的(module signing),一般情况是不影响使用的。但如果有特殊需求的环境,比如需要验证签名才能加载内核模块的系统安全设定,则需要手动为模块增加签名。详细的可以参考红帽的官方说明:signing secure module for secure boot
- 当内核源码包缺少symvers文件,手动编译的modules在加载时报
no symbol version for module_layout
错误.此时,需要做如下操作:locate symvers
,将symvers文件拷贝到对应-C目录下
那么,我们假设已经从网上或者其它途径上拿到了linux某个发行版本的内核源码(这里使用的是centos7.1 即 kernel-3.10.0-229.el7.src.rpm或者kernel.tar.bz包)。如果是src.rpm包,则还需要yum install xxx.src.rpm
进行安装,成功后在/root目录下会多出一个rpmbuild目录,该源码包位置在/root/rpmbuild/SOURCES/linux-3.10.0-514.el7.tar.xz。
如果要编译整个内核,可以这样:
1. 通过解压tar包,获取源码tar xvf kernel.tar.xz
2. make mrproper
# 清除上次残留项
3. make menuconfig
# 需要安装ncurses 和 ncurses-devel库,选择内核需要的模块
4. make & make modules_install
5. 在对应的模块目录下找到特定的ko文件
静静等待几个小时编译即可完成。幸运的是,内核模块是可以单独编译的。通过以下步骤,可以编译某个模块,而不用等待所有代码编译完成,非常节省时间:
1. make oldconfig
2. make prepare
3. make scripts
4. make <MODULE>=m -C /usr/src/kernels/{linux-version}/ M=/{src-dir}/{modules_path}/ modules
-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile,M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile
5. 然后再{module_path}路径中找到对应的ko文件即可
ceph模块编译
ceph的内核模块主要有三个,包含rbd-nbd的话就有四个,其路径及模块名分别是:
1. cephfs内核模块ceph.ko:CONFIG_CEPH_FS=m,模块路径:./fs/ceph/
2. rbd内核模块rbd.ko:CONFIG_BLK_DEV_RBD=m,模块路径:./drivers/block
3. 通用模块libceph.ko:CONFIG_CEPH_LIB=m,模块路径:./net/ceph/ ./include/linux/ceph/ ./include/linux/crush/
4. nbd模块nbd.ko: CONFIG_BLK_DEV_NBD=m,模块路径:./drivers/block
以rbd内核模块编译为例子,其步骤如下:
1. make CONFIG_BLK_DEV_RBD=m -C /usr/src/kernels/3.10.0-229.el7.x86_64/ M=/root/linux-3.10.0-229/ modules
2. 在/root/linux-3.10.0-229/drivers/block
目录下找到rbd.ko文件
3. 放置到/usr/lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/block/rbd.ko
位置。
4. depmod -a
更新所有模块依赖,也可以执行 rmmod rbd
,然后modprobe rbd
或者 insmod rbd
PS: cephfs放置到/usr/lib/modules/3.10.0-229.el7.x86_64/kernel/fs/ceph/ceph.ko
, libceph放置到/usr/lib/modules/3.10.0-229.el7.x86_64/kernel/net/ceph/libceph.ko
ceph内核模块调试
ceph的内核调试其实就是linux的内核日志输出调试吧。其所有的输出一般会打印在kern.log上,使