Linux DRBD-9 内核对象模型详解:resource、connection、device 与 peer_device 矩阵结构

发布时间:2026/11/3 11:08:14

Linux DRBD-9 内核对象模型详解:resource、connection、device 与 peer_device 矩阵结构 Linux DRBD-9 内核对象模型详解resource、connection、device 与 peer_device 矩阵结构【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxDRBDDistributed Replicated Block Device是 Linux 内核中一个共享无、同步复制的块设备驱动常被视作网络 RAID 1是构建高可用集群时替代共享存储的基础构件。本文以内核文档>/-----------------------------.....---------------\ | resource | device | | device | -----------------------------.....--------------- | connection | peer_device | | peer_device | -----------------------------.....--------------- : : : : : : : : : : -----------------------------.....--------------- | connection | peer_device | | peer_device | \-----------------------------.....---------------/解读这张图需要把握三条规则均为文档原文的要点且可逐条在源码中得到印证横向同一行device 可以从其 resource 按**卷号volume number**索引到同理peer_device 可以从其 connection 按卷号索引到。纵向同一列/行方向对象之间通过双向链表互联。回指针back pointerspeer_device 指回它所属的 connection 和 deviceconnection 和 device 都指回它们的 resource。与文档对照 drivers/block/drbd/drbd_int.h 中struct drbd_peer_device的定义回指针的说法完全成立struct drbd_peer_device { struct list_head peer_devices; /* 挂入 device-peer_devices 链表 */ struct drbd_device *device; /* 回指针指向本地 device */ struct drbd_connection *connection; /* 回指针指向所属 connection */ struct work_struct send_acks_work; ... };而横向按卷号索引在源码中由idrID Radix tree实现struct drbd_resource中有struct idr devices; /* volume number to device mapping */见 drbd_int.h#L595struct drbd_connection中有struct idr peer_devices; /* volume number to peer device mapping */见 drbd_int.h#L630。查找入口是 drbd_int.h 中的内联函数conn_peer_device()static inline struct drbd_peer_device * conn_peer_device(struct drbd_connection *connection, int volume_number) { return idr_find(connection-peer_devices, volume_number); }这正是文档所说peer_devices can be accessed from connections by their volume number的代码级实现。3. 全局索引drbd_resources 链表与 drbd_devices idr文档指出除了矩阵内部关系外还有两套全局索引所有 resource都挂在drbd_resources这条双向链表中所有 device可以通过次设备号minor device number经drbd_devices这个 idr 查找到。源码中这两个全局对象在 drivers/block/drbd/drbd_main.c 定义并在 drbd_int.h 中导出注释明确写明了并发约束——RCU 保护、更新需持有 genl_lock()/* drbd_int.h */ extern struct idr drbd_devices; /* RCU, updates: genl_lock() */ extern struct list_head drbd_resources; /* RCU, updates: genl_lock() */按 minor 查找 device 的入口是 drbd_int.h#L942-L945static inline struct drbd_device *minor_to_device(unsigned int minor) { return (struct drbd_device *)idr_find(drbd_devices, minor); }resource 的创建与入链过程在 drbd_main.c 的drbd_create_resource()中可以看到全貌分配对象、kref_init()初始化引用计数、idr_init(resource-devices)初始化卷号索引、INIT_LIST_HEAD(resource-connections)初始化连接链表最后list_add_tail_rcu(resource-resources, drbd_resources)把新 resource 以 RCU 方式挂到全局链表尾部——与文档All resources are in the drbd_resources double-linked list一一对应。此外DRBD 代码提供了一整套遍历宏来沿这些结构游走均定义在 drbd_int.h#L958-L983#define for_each_resource(resource, _resources) \ list_for_each_entry(resource, _resources, resources) #define for_each_resource_rcu(resource, _resources) \ list_for_each_entry_rcu(resource, _resources, resources) #define for_each_connection(connection, resource) \ list_for_each_entry(connection, resource-connections, connections) #define for_each_peer_device(peer_device, device) \ list_for_each_entry(peer_device, device-peer_devices, peer_devices)每一组都有普通 /_rcu/_safe三个变体分别对应直接遍历、RCU 读侧遍历和遍历中允许删除的安全遍历。这解释了文档所说的objects are connected by double linked lists在工程上是如何被安全地消费的读路径如 drbd_main.c 中for_each_resource_rcu()无锁写路径如 drbd_main.c#L2333 中for_each_resource_safe()持锁删除。4. 引用计数与对象生命周期文档最后一段明确了四类对象的生命周期规则这是理解整个对象模型谁拥有谁的关键drbd_resource、drbd_connection、drbd_device 对象是引用计数的peer_device 对象仅用于在 device 与 connection 之间建立链接其生命周期由它所引用的 device 和 connection 的生命周期决定。对应源码证据struct drbd_resource内嵌struct kref kref;drbd_int.h#L594struct drbd_connection内嵌struct kref kref;drbd_int.h#L629struct drbd_device内嵌struct kref kref;drbd_int.h#L768而struct drbd_peer_device中没有 kref 成员它只有list_head、两个回指针和一个工作项drbd_int.h#L739-L747。也就是说peer_device 是一个关系对象只要某个 device 还存在、某条 connection 还连着重它们交叉点上的 peer_device 就存在device 或 connection 任一被销毁peer_device 随之消失。这种设计让矩阵的规模卷数 × 连接数不需要额外的生命周期管理代码。5. 结构体要点速查从源码看每类对象持有什么为便于把文档概念落到代码上下面按文档骨架列出四类对象的关键成员摘录自 drivers/block/drbd/drbd_int.h5.1 struct drbd_resourcedrbd_int.h#L586-L610成员作用char *name资源名struct kref kref引用计数struct idr devices卷号 → device 的映射矩阵横向索引struct list_head connections该资源的连接双向链表矩阵纵向struct list_head resources挂入全局drbd_resources链表的节点struct res_opts res_opts资源级配置struct mutex conf_update/adm_mutex配置热更新、管理操作串行化unsigned susp:1; susp_nod:1; susp_fen:1;三种挂起状态用户挂起、无数据挂起、fence 处理挂起enum write_ordering_e write_ordering写排序策略创建时默认WO_BDEV_FLUSH见 drbd_main.c#L2528cpumask_var_t cpu_mask该资源线程绑定的 CPU 掩码5.2 struct drbd_connectiondrbd_int.h#L621-L707成员作用struct list_head connections挂入resource-connections链表的节点struct drbd_resource *resource回指针指向所属资源struct kref kref引用计数struct idr peer_devices卷号 → peer_device 的映射矩阵横向索引enum drbd_conns cstate连接状态文档说明取值范围为 C_STANDALONE 至 C_WF_REPORT_PARAMSstruct net_conf *net_confRCU 保护的网络配置struct drbd_socket data/meta双通道套接字数据/屏障/状态包 与 ping/ack 元数据包分离struct list_head transfer_log尚未完全处理完的请求Transfer Logstruct drbd_thread receiver / worker / ack_receiver接收线程、工作线程、ack 接收线程struct drbd_work_queue sender_work发送侧工作队列可以看到一条 connection 同时承载了矩阵纵列的角色connections链表 resource回指针 peer_devicesidr与完整的网络收发基础设施。5.3 struct drbd_devicedrbd_int.h#L749-L839成员作用struct drbd_resource *resource回指针指向所属资源struct list_head peer_devices该设备上所有 peer_device 的双向链表矩阵纵向unsigned int vnr卷号volume number within the connectionunsigned int minor次设备号是全局drbd_devicesidr 的键struct kref kref引用计数struct drbd_backing_dev *ldev下层块设备drbdsetup 配置struct request_queue *rq_queue/struct gendisk *vdisk暴露给块层的请求队列与虚拟磁盘即/dev/drbdX背后的 gendiskunion drbd_dev_state state磁盘状态D_ 前缀集合atomic_t ap_pending_cnt等一组原子计数in-flight 请求统计网络在途、等待本地完成等struct rb_root read_requests / write_requests未完成本地请求的区间树5.4 struct drbd_peer_device如第 2 节所示仅四个实质成员peer_devices链表节点、device回指针、connection回指针、send_acks_work。它是纯粹的连接关系载体。6. 把文档模型落到运行时的三条查找路径综合以上文档描述的矩阵模型对应三条最常用运行路径均在源码中可直接验证用户态 → device内核接口拿到 minor 后调用minor_to_device(minor)经全局drbd_devicesidr 直接定位O(log N)见 drbd_int.h#L942-L945。resource → device按卷号idr_find(resource-devices, volume_number)语义的 idr 查找resource-devices在drbd_create_resource()中初始化drbd_main.c#L2526。connection → peer_device按卷号conn_peer_device(connection, volume_number)drbd_int.h#L952-L956。反向的游走则靠双向链表与遍历宏从 device 出发for_each_peer_device()找到它在所有连接上的映像从 resource 出发for_each_connection()找到所有对端连接。例如 drbd_nl.c#L3755 与 drbd_main.c#L2763 都采用了先定位 device、再for_each_peer_device遍历其对端的模式正是矩阵纵列遍历的典型用法。7. 小结这套数据结构解决了什么问题回到文档的动机——Starting with Linux v3.14 we are reorganizing DRBD to use this data structure从 Linux v3.14 起DRBD 重组为使用这套数据结构。DRBD-9 的对象模型可以用三点总结矩阵化device 与 connection 的笛卡尔积由 peer_device 承载天然支持多卷多 volume× 多对端含 dual-Primary、多节点组网的场景双索引横向用 idr 按卷号 O(log N) 定位纵向用双向链表RCU 友好遍历另加全局drbd_devicesidr 支持按 minor 直接寻址生命周期分层resource / connection / device 三级引用计数保证共享安全peer_device 无计数、随宿主对象存亡避免了对矩阵交叉点的额外引用管理负担。文档本身很短但它勾勒的骨架是阅读 drivers/block/drbd 全部约 25 个源文件的地图先建立这四类对象与矩阵关系的心智模型再去读 drbd_main.c对象创建与生命周期、drbd_nl.cnetlink 管理接口如何遍历这些结构以及 drbd_int.h结构与遍历宏就能把 DRBD 的每个请求处理路径写数据、resync、fencing放到正确的对象上理解。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/25 7:44:39

双梁吊钩桥式起重机小车起升机构设计全解析

简介:双梁吊钩桥式起重机小车起升机构设计毕业设计论文,面向机械设计及自动化专业毕业生与工程技术人员,完整呈现起升机构从总体方案到关键零部件的设计计算流程,应用性强。内容从桥式起重机发展概况、国内外现状切入,…

2026/10/31 17:28:58

不用 PS:IOPaint 本地抹除照片里的路人、水印和文字

不用 PS:IOPaint 本地抹除照片里的路人、水印和文字 【免费下载链接】IOPaint Image inpainting tool powered by SOTA AI Model. Remove any unwanted object, defect, people from your pictures or erase and replace(powered by stable diffusion) any thing on…

2026/11/3 11:07:36

MOTOTRBO固件升级避坑指南:CPS版本、CODE plug与编程线驱动三重校验

简介:本资源是一份面向MOTOTRBO专业无线通信设备运维人员、无线电工程师及系统集成技术人员的标准化软件升级操作指南,解决设备固件与CODE plug版本更新过程中的流程不清、操作风险高、版本选择困惑等实际问题。文档以Step-by-step图文流程形式&#xff…

2026/11/3 11:07:36

算法竞赛中的前后缀分解技巧与应用

1. 题目解析与算法背景这道题目来自PA 2022(波兰算法竞赛)的Podwyżki问题,题目编号P9255,难度标记为"普及"级别。从标题中的【前后缀分解】可以判断,这是一道典型的需要运用前后缀预处理技巧的算法题。在算…

2026/11/3 11:07:36

SickOs-2靶机渗透实战:从Web漏洞到提权完整解析

1. SickOs-2靶机渗透实战解析 在网络安全实战训练领域,SickOs系列靶机以其高度仿真的漏洞环境和层层递进的技术挑战著称。作为vulhub靶场生态中的重要组成部分,SickOs-2延续了前作的设计理念,将多个典型漏洞有机整合在一个Linux系统中&#x…

2026/11/3 11:07:36

文字点选验证码技术解析与安全防护实践

1. 文字点选验证码的技术背景与应用场景文字点选验证码作为当前主流的交互式验证手段,已经广泛应用于各类网站的登录、注册等关键环节。相比传统的字符输入验证码,这种验证方式通过要求用户点击图片中特定位置的文字,实现了更高的安全性和更好…

2026/11/3 11:07:36

中小企业动态成本核算系统的微服务架构实践

1. 项目背景与定位《看潮企业管理软件》是一款面向中小企业的综合管理解决方案,这个项目编号"03-008"表明它是我们团队在"编程与数学"系列中的第三个实战项目。作为开发者,我参与了这个项目从需求分析到功能实现的全过程&#xff0c…

2026/11/3 11:02:35

Design Compiler综合实战:从环境配置到时序收敛的完整闭环

简介:本资源是一份面向数字电路设计初学者与EDA工程师的Design Compiler(DC)中文入门教程,聚焦电路综合核心原理与全流程实操。内容系统讲解综合的转换、优化、映射三阶段机制,深入剖析时序约束设置(如时钟…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑