librbd 简单学习例子
发布日期:2021-09-16 04:36:44 浏览次数:23 分类:技术文章

本文共 4545 字,大约阅读时间需要 15 分钟。

去年写了个librbd的读写demo,今天找了好久才找到,写到博客里记录下

熟悉librbd的接口,从一个demo 开始是个不错的选择

 

/* 注释就不详细写了,代码比较简单 */#include 
#include
#include
#include
rados_t init_rados() { // we will use all of these below int ret = 0; rados_t rados = NULL; // 1. init rados object ret = rados_create(&rados, "admin"); // just use the client.admin keyring if (ret < 0) { // let's handle any error that might have come back printf("couldn't initialize rados! err %d\n", ret); return NULL; } else { printf("inited rados cluster object\n"); } return rados;}rados_ioctx_t init_ioctx(rados_t rados) { int ret = 0; rados_ioctx_t io_ctx = NULL; // 2. read ceph config file ret = rados_conf_read_file(rados, "/etc/ceph/ceph.conf"); if (ret < 0) { // This could fail if the config file is malformed, but it'd be hard. printf("failed to parse config file! err %d\n", ret); return NULL; } // 3. connect to ceph cluster ret = rados_connect(rados); if (ret < 0) { printf("couldn't connect to cluster! err %d\n", ret); return NULL; } else { printf("connected to the rados cluster\n"); } // 4. init io context for rbd pool const char *pool_name = "rbd"; ret = rados_ioctx_create(rados, pool_name, &io_ctx); if (ret < 0) { printf("couldn't setup ioctx! err %d\n", ret); rados_shutdown(rados); return NULL; } else { printf("created an ioctx for pool: rbd\n"); } return io_ctx;}rbd_image_t init_image(rados_ioctx_t io_ctx) { int ret = 0; // 5. open rbd image rbd_image_t image; const char *image_name = "sotest"; ret = rbd_open(io_ctx, image_name, &image, NULL); if (ret < 0) { printf("couldn't open rbd image! err %d\n", ret); return NULL; } else { printf("opened an rbd image: sotest\n"); } return image;}int get_rbd_size(rbd_image_t image) { int ret = 0; uint64_t size = 0; // 6. get rbd image size ret = rbd_get_size(image, &size); if (ret < 0) { printf("couldn't get image size! err %d\n", ret); return EXIT_FAILURE; } else { printf("The size of the image is: %dMB\n", size/1024/1024); } return size;}void rbd_finish_aiocb(rbd_completion_t c, void *arg){ // int ret = rbd_aio_wait_for_complete(c); int ret = rbd_aio_get_return_value(c); rbd_aio_release(c); // for aio read callback, the read data should be copied here to caller printf("aio callback: %d, %s\n", ret, (const char*)arg);}int aio_write(rbd_image_t image, const char *buff) { int off = 128; rbd_completion_t c; int ret = rbd_aio_create_completion((void *)buff, (rbd_callback_t) rbd_finish_aiocb, &c); if (ret < 0) { printf("create callback failed %s\n", ret); return ret; } int len = strlen(buff); ret = rbd_aio_write(image, off, len, buff, c); if (ret < 0) { printf("write to image failed %s\n", ret); return ret; } printf("write %s to image end\n", buff); return ret;}int aio_read(rbd_image_t image, char *buff) { int off = 128; int len = 10; rbd_completion_t c; int ret = rbd_aio_create_completion(buff, (rbd_callback_t) rbd_finish_aiocb, &c); if (ret < 0) { printf("create callback failed %s\n", ret); return ret; } memset(buff, 0, 128); ret = rbd_aio_read(image, off, len, buff, c); if (ret < 0) { printf("read from image failed %s\n", ret); return ret; } printf("read from image end\n"); return ret;}int main() { int ret; char buff[128] = {0}; int len; rados_t rados = init_rados(); if (!rados) { perror("init_rados"); return EXIT_FAILURE; } rados_ioctx_t io_ctx = init_ioctx(rados); if (!io_ctx) { perror("init_ioctx"); rados_shutdown(rados); return EXIT_FAILURE; } rbd_image_t image = init_image(io_ctx); if (!image) { perror("init_image"); rados_ioctx_destroy(io_ctx); rados_shutdown(rados); return EXIT_FAILURE; } int size = get_rbd_size(image); printf("image size: %d\n", size); sprintf(buff, "%s", "abcd123efg"); aio_write(image, buff); aio_read(image, buff); // 7. close image, io context and rados object ret = rbd_close(image); if (ret < 0) { printf("couldn't close rbd image! err %d\n", ret); return EXIT_FAILURE; } else { printf("closed rbd image: sotest\n"); } rados_ioctx_destroy(io_ctx); rados_shutdown(rados); return 0;}

 

转载地址:https://blog.csdn.net/wllabs/article/details/109247350 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ARM64的内核栈、用户栈、寄存器上下文【转】
下一篇:qemu 信号线程化

发表评论

最新留言

很好
[***.229.124.182]2024年03月21日 12时03分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

用流密码实现加密java语言_使用java的流密码 2021-06-24
合唱队形java_动态规划之合唱队形问题 2021-06-24
java变量怎么进行百分比_在Java中显示百分比 2021-06-24
java 设置pdf页面大小_Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转... 2021-06-24
cmd mysql 数据分析_小白学数据分析--与MySQL有关的小知识 2021-06-24
java完成九宫格数独_简单实现java数独游戏 2021-06-24
php 安装zip,php7.4安装zip扩展 2021-06-24
php7 gitbook,php7性能分析扩展工具xhprof 2021-06-24
java wav 切割_java切割音频文件 2021-06-24
java获取服务器编码_使用Java代码获取服务器性能信息及局域网内主机名 2021-06-24
mysql 导出json_如何将MySQL数据库导出到JSON? 2021-06-24
嵌入式Linux咨询公司,Technical support and consulting 2021-06-24
linux 离线安装中文字库,centos7 离线安装字体fontconfig 2021-06-24
可以使用鸿蒙系统的55款手机,华为鸿蒙系统首批适配机型即将公布,共有55款产品可升级搭载... 2021-06-24
鸿蒙系统chromeos2.0,【华为鸿蒙系统】鸿蒙OS 2.0 适配计划曝光 2021-06-24
android高德地图设置缩放级别,设置地图中心点/级别 2021-06-24
dv4 安装linux,linux安装中的问题 2021-06-24
gmat阅读.html,GMAT阅读“Ecoefficiency”文章深度分析 2021-06-24
html5 带图片导航,html5 带声音的导航 2021-06-24
point 如何求elbow_机器人学——实践一(Arm Navigation 理论+代码) 2021-06-24