前言
使用samba服务建立起windows客户端和ceph集群的cephfs文件共享的桥梁
#客户端WIN client–(SMB)–>
#存储samba->libvfs_module_ceph.so->libcephfs.so->MDS/OSD
(使用samba导出的cephfs,samba会提供vfs_ceph模块,该模块会调用libcephfs api)
SMB(消息服务块):网络文件共享协议,允许客户端用户从远端的文件服务器访问文件资源。samba是运行smb的软件,分为客户端和服务端。
samba+cephfs:在服务端建立起与ceph的关系,在客户端挂载ceph的文件系统。
1、在服务端启用(/停止)smb进程:
systemctl start/restart/stop smb
2、在客户端挂载(映射网络驱动器):
\\IP\共享名
3、12步完成后,会发现smbd服务调用了ceph.so(->libvfs_module_ceph.so)、libcephfs.so,libcephfs会和mds/osd进行交互
拦截cephfs的I/O
1、关于libcephfs的hook的简单的代码,并将I/O信息并写入系统日志中
#include <stdio.h>
#include <dlfcn.h>
#include <cephfs/libcephfs.h>
#include <syslog.h>
typedef int (*CEPH_OPEN)(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode);
int ceph_open(struct ceph_mount_info *cmount, const char *path, int flags, mode_t mode) {
// Load the original Ceph library and the ceph_open() function
static void *handle = 0x0;
handle = dlopen("/lib64/libcephfs.so.2", RTLD_LAZY);
static CEPH_OPEN old_ceph_open = NULL;
old_ceph_open = dlsym(handle, "ceph_open");
// record log info
openlog("SAMBA", LOG_CONS | LOG_PID, LOG_USER);
syslog(LOG_INFO, "Ceph_open Called:%s", path);
closelog();
// Call the original ceph_open() function
return old_ceph_open(cmount, path, flags, mode);
}
2、生成动态链接库
gcc -fPIC -shared -o cephfs_hook.so cephfs_hook.c -D_FILE_OFFSET_BITS=64 -ldl -lcephfs
3、启动smb时加载动态链接库(systemctl start smb命令启动smb,不知道为啥找不到自己的动态链接库)
LD_PRELOAD=/home/xwc/Desktop/cephfs_hook/cephfs_hook.so /usr/sbin/smbd --foreground --no-process-group
4、查看
lsof /home/xwc/Desktop/cephfs_hook/cephfs_hook.so
ps -ef | grep smbd
5、在客户端对文件进行操作后,查看系统日志如截图所示
cat /var/log/messages
or
tail -f /var/log/messages
如遇messages不更新,执行systemctl restart/start rsyslog

文章介绍了如何通过Samba服务将Windows客户端与Ceph集群的CephFS文件系统连接起来,实现文件共享。在服务端启用SMB服务,客户端通过挂载网络驱动器访问CephFS。然后,文章详细阐述了如何创建libcephfs的hook,拦截并记录CephFS的I/O操作到系统日志,以进行监控。后续计划包括完善hook代码,编写自动监控脚本以及实施快照功能。

3365

被折叠的 条评论
为什么被折叠?



