【块存储block源码分析】 linux内核模块ceph nbd源码分析

article/2025/11/1 10:29:14

     jewel+ 版本支持 rbd-nbd 的特性,需要 map 支持较多特性的 rbd image 时,可以使用该 nbd driver

     NBD(Network Block Device) 可以将一个远程主机的磁盘空间,当作一个块设备来使用,就像一块硬盘一样。NBD是一个内核模块,大部分Linux发行版都包含它

     与 RBD 内核驱动程序相比,NBD有许多优点:

  • RBD-KO开发和特性的添加必须要经过稳定的内核
  • RBD-KO开发慢于librbd,如果要与librbd开发保持同步,需要时间和努力
  • NBD 已经很好地集成到内核多年,是内核的一部分

 

Linux块设备驱动知识

(1)当一个用户程序要向磁盘写入数据时,会发发出write()系统调用给内核。

(2)内核会调用虚拟文件系统相应的函数,将需要写入发文件描述符和文件内容指针传递给该函数。

(3)内核需要确定写入磁盘的位置,通过映射层知道需要写入磁盘的哪一块。

(4)根据磁盘的文件系统的类型,调用不同文件格式的写入函数,江苏数据发送给通用块层(比如ext2和ext3文件系统的写入函数是不同的,这些函数由内核开发者实现,驱动开发者不用实现这类函数)

(5)数据到达通用块层后,就对块设备发出写请求。内核利用通用块层的启动I/O调度器,对数据进行排序。

(6)同用块层下面是"I/O调度器"。调度器作用是把物理上相邻的读写合并在一起,这样可以加快访问速度。

(7)最后快设备驱动向磁盘发送指令和数据,将数据写入磁盘。

    参考: https://www.cnblogs.com/big-devil/p/8590007.html

 

结构体 nbd_device

    关注队列,gendisk 

struct nbd_device {int flags;int harderror;          /* Code of hard error                   */struct socket * sock;   /* If == NULL, device is not ready, yet */int magic;spinlock_t queue_lock;struct list_head queue_head;    /* Requests waiting result */struct request *active_req;wait_queue_head_t active_wq;struct list_head waiting_queue; /* Requests to be sent */wait_queue_head_t waiting_wq;struct mutex tx_lock;struct gendisk *disk;int blksize;u64 bytesize;pid_t pid; /* pid of nbd-client, if attached */int xmit_timeout;int disconnect; /* a disconnect has been requested by user */
};

 

1. nbd_init

    1.1 kcalloc 分配物理内存与高端内存映射

      可以获取以字节为单位的一块内核内存,GFP_KERNEL flag 一种常规的分配方式, 可能会阻塞. 这个标志在睡眠安全时用在进程的长下文代码中. 为了获取调用者所需的内存, 内核会尽力而为. 这个标志应该是首选标志

    1.2 alloc_disk 函数分配通用磁盘gendisk的结构体

    1.3 blk_init_queue 分配请求队列,并初始化

request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock)

第一个参数是指向"请求处理函数"的指针,该函数直接和硬盘打交道,用来处理数据在内存和硬盘之间的传输。

    1.4 register_blkdev 注册块设备

       作用:分局major分配一个块设备号,在/proc/devices中新增加一行数据,表示块设备的信息

 

#define NBD_MAJOR        43   /* Network block device    */

     初始化gendisk结构体的数据成员,包括major,fops,queue 等赋初值

for (i = 0; i < nbds_max; i++) {struct gendisk *disk = nbd_dev[i].disk;nbd_dev[i].magic = NBD_MAGIC;INIT_LIST_HEAD(&nbd_dev[i].waiting_queue);spin_lock_init(&nbd_dev[i].queue_lock);INIT_LIST_HEAD(&nbd_dev[i].queue_head);mutex_init(&nbd_dev[i].tx_lock);init_waitqueue_head(&nbd_dev[i].active_wq);init_waitqueue_head(&nbd_dev[i].waiting_wq);nbd_dev[i].blksize = 1024;nbd_dev[i].bytesize = 0;disk->major = NBD_MAJOR;disk->first_minor = i << part_shift;disk->fops = &nbd_fops;disk->private_data = &nbd_dev[i];sprintf(disk->disk_name, "nbd%d", i);set_capacity(disk, 0);add_disk(disk);
}

     1.5 add_disk 函数激活磁盘设备

      (当调用该函数后就可以对磁盘进行操作(访问),所以调用该函数之前必须所有的准备工作就绪)

 

      nbd_init 总结:

 

  参考:https://cloud.tencent.com/developer/article/1380637

 

2. nbd_fops 注册

      根据 disk->fops = &nbd_fops;,可以看到只关注 ioctl 函数

static const struct block_device_operations nbd_fops =
{.owner =        THIS_MODULE,.ioctl =        nbd_ioctl,
};

    2.1 nbd_ioctl 函数

       从nbd server 端收到调用 ioctl,实现在 ceph 代码中的 rbd-nbd,直接关键函数 __nbd_ioctl

static int nbd_ioctl(struct block_device *bdev, fmode_t mode,unsigned int cmd, unsigned long arg)
{error = __nbd_ioctl(bdev, nbd, cmd, arg);
}

 

3. __nbd_ioctl 函数

static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,unsigned int cmd, unsigned long arg)
{

    根据 cmd 区分不同的操作类型

    3.1 NBD_DO_IT

      3.1.1 kthread_create

   在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm 指针被设置为 NULL;它只在内核空间运行,从来不切换到用户空间去

      3.1.2  wake_up_process(thread)

   线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。        

      3.1.3 nbd_do_it

 

4. do_nbd_request 函数

 

 

参考:

    https://blog.sourcerer.io/writing-a-simple-linux-kernel-module-d9dc3762c234

    http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/

    http://en.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf


http://chatgpt.dhexx.cn/article/nDEUOowJ.shtml

相关文章

用户增长 - BG/NBD概率模型预测用户生命周期LTV(二)

文章目录 1 理论1.1 BG / NBD概率模型介绍1.2 Gamma-Gamma模型2 实践案例2.1 lifetimes实践案例一&#xff1a;在线零售业务的交易2.1.1 数据解读2.1.2 BG / NBD - 预期交易的frequency /recency 热力图2.1.3 顾客留存概率热力图2.1.4 评估模型效果方式一&#xff1a;模型验证重…

使用BG/NBD模型与Gamma-Gamma模型预测客户的生命周期价值CLV/LTV

1. 背景 客户生命周期价值CLV: CLV是Customer Lifetime Value的简称&#xff0c;用来衡量一个客户&#xff08;用户&#xff09;在一段时期内对企业有多大价值&#xff0c;也称为LTV。 假如一个客户两年内在某商店内消费2000元&#xff0c;这2000元就是CLV,具有预测性。 CLV…

nbd 相关概念及操作

周五(3月6号)笔者发现有台物理机上挂载了一个并非常用的nbd设备&#xff0c;估计是之前人做的测试留下来的&#xff0c;决定卸载它&#xff0c;顺带了解了下nbd的设备信息。 什么是nbd 全称是network block device&#xff0c;类似于nfs&#xff0c;远程设备可以挂载&#xff…

qemu-nbd挂载虚拟机镜像文件系统

qemu-nbd挂载虚拟机镜像文件系统 基本原理操作步骤1.加载NBD驱动2. 连接 qemu-nbd3.挂载4.解挂 虚机文件系统为LVM实例1.加载驱动2.连接qemu-nbd3.挂载lvm分区4.卸载盘符 虚机文件系统为非LVM虚机文件系统为NTFS 基本原理 nbd&#xff08;网络块设备: Network Block Device&am…

linux qemu-nbd介绍

1. 介绍 NBD&#xff08;Network Block Device&#xff09;&#xff0c;即网络块设备。可以将一个远程主机的磁盘空间&#xff0c;当作一个块设备来使用。就像一块硬盘一样使用它&#xff0c;你可以很方便的将另一台服务器的硬盘空间,增加到本地服务器上。NBD与NFS有所不同&am…

centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件

基本原理 nbd&#xff08;网络块设备: Network Block Device&#xff09;&#xff0c;利用qemu-nbd将qemu虚拟机镜像挂载到Linux上。   展开来讲&#xff0c;nbd可以将一个远程主机的磁盘空间&#xff0c;当作一个块设备来使用&#xff0c;就像一块硬盘一样。使用它,你可以很…

linux nbd模块,Centos7.3 安装编译nbd模块-Go语言中文社区

未安装nbd模块 [zhaojqlocalhost ~]$modprobe nbd modprobe: FATAL: Module nbd not found. 查看linux版本 [zhaojqlocalhost ~]$cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [zhaojqlocalhost ~]$uname -r 3.10.0-514.26.2.el7.x86_64 安装 [rootlocalhost…

linux nbd模块,Centos7.3 安装编译nbd模块

未安装nbd模块 [[email protected] ~]$ modprobe nbd modprobe: FATAL: Module nbd not found. [[email protected] ~]$ cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [[email protected] ~]$ uname -r 3.10.0-514.26.2.el7.x86_64 安装 [[email protected] …

NBD(Network Block Device)简介及基本使用

NBD指的是Network Block Device&#xff0c;正如其名字的意思&#xff0c;NBD让用户可以通过网络访问到某个块设备&#xff0c;或者设备镜像。 你可能会想NFS&#xff08;Network File System&#xff09;不是已经可以实现通过网络挂载各种文件系统并进行访问了吗&#xff0c;…

微信开放平台开发者认证

1.邮箱注册&#xff0c;激活账号 2.企业认证 3.登陆微信开放平台&#xff0c;进行开发者认证 4.填写认证信息 5.发票选择&#xff0c;可以选择不开发票 6. 支付费用300 备注&#xff1a;如有疑问&#xff0c;请联系作者&#xff01;

微信开放平台开发(3) 移动应用微信登录

在这篇微信公众平台开发教程中&#xff0c;我们将介绍如何使用微信开放平台接口实现移动应用微信登录的功能。 移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前&#xff0c;在微信开放平台注册开发者帐号&#x…

微信开放平台之第三方平台开发,模板小程序如何提交?

大家好&#xff0c;我是悟空码字 12月25日&#xff0c;天气晴朗&#xff0c;阳光普照&#xff0c;今天是圣诞节。因为疫情影响&#xff0c;小羊人的增多&#xff0c;街上放眼望去&#xff0c;人烟稀少。楼下除了几个十一二岁的小男孩在玩耍&#xff0c;也没有像往日老人悠闲打…

微信开放平台第三方开发,注册试用小程序,一整套流程

大家好&#xff0c;我是小悟 对服务商来说&#xff0c;试用小程序的好处不言而喻&#xff0c;主打一个先创建后认证的流程。只需要提供小程序名称和openid便可快速注册一个试用小程序&#xff0c;在认证之前&#xff0c;有效期14天&#xff0c;大致流程如下。 注册试用小程序 …

微信开放平台开发第三方授权登陆(五):微信小程序

微信开放平台开发系列文章&#xff1a; 微信开放平台开发第三方授权登陆&#xff08;一&#xff09;&#xff1a;开发前期准备 微信开放平台开发第三方授权登陆&#xff08;二&#xff09;&#xff1a;PC网页端 微信开放平台开发第三方授权登陆&#xff08;三&#xff09;&a…

微信开放平台开发-授权、全网发布(PHP)

这两天做了微信开发平台的开发&#xff0c;梳理下。。。 先看看授权的流程&#xff1a; 第一步&#xff1a;接收component_verify_ticket&#xff1a; 1、微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket&#xff0c;拿到后需要在本地做好存储&…

微信开放平台开发——网页微信扫码登录(OAuth2.0)

转自 http://www.cnblogs.com/0201zcr/p/5133062.html 1、OAuth2.0 OAuth&#xff08;开放授权&#xff09;是一个开放标准&#xff0c;允许用户让第三方应用访问该用户在某一网站上存储的私密的资源&#xff08;如照片&#xff0c;视频&#xff0c;联系人列表&#xff09;&am…

微信开放平台-第三方平台开发配置及常见的问题

目录 概述 参考文档 开源项目&工具 第三方平台设置 问题及解决方法 概述 本实例&#xff1a;第三方平台微信公众号&#xff08;服务号&#xff09; 微信开放平台-第三方平台&#xff0c;为广大公众号和小程序提供运营服务和行业解决方案。分两种类型&#xff0c;定制…

微信第三方平台开发(一)

个人感觉微信在第三方平台开发者这块的开发文档写的很不友好&#xff0c;很隐晦&#xff0c;我在开发的过程总结的一些东西&#xff0c;写出来给大家分享一下。恩&#xff0c;就这样吧。 一、注册第三方平台账号 打开https://open.weixin.qq.com/cgi-bin/index?thome/index&…

微信开放平台开发第三方授权登陆(三):Android客户端

微信开放平台开发系列文章&#xff1a; 微信开放平台开发第三方授权登陆&#xff08;一&#xff09;&#xff1a;开发前期准备 微信开放平台开发第三方授权登陆&#xff08;二&#xff09;&#xff1a;PC网页端 微信开放平台开发第三方授权登陆&#xff08;三&#xff09;&a…

微信开放平台开发第三方授权登陆(二):PC网页端

微信开放平台开发系列文章&#xff1a; 微信开放平台开发第三方授权登陆&#xff08;一&#xff09;&#xff1a;开发前期准备 微信开放平台开发第三方授权登陆&#xff08;二&#xff09;&#xff1a;PC网页端 微信开放平台开发第三方授权登陆&#xff08;三&#xff09;&a…