Ceph iSCSI Gateway:tcmu-runner代码原理详解

这篇具有很好参考价值的文章主要介绍了Ceph iSCSI Gateway:tcmu-runner代码原理详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

tcmu-runner在ceph iscsi gateway中是linux内核到ceph rbd间的桥梁,用于识别SCSI命令字,并根据命令字含义,调用librbd接口实现命令字的处理。详细描述见Ceph iSCSI Gateway:架构原理详解一文。

本文结论

  • 设备添加
    • 通过监听netlink识别iSCSI块设备添加。
    • 添加过程中mmap共享内存(用于内核和用户态的命令字传输),并进行rbd_open。
  • SCSI命令字处理
    • 通过启动一个线程扫描mmap中为处理的命令字。
    • 扫描到命令字后调用rbd相关接口处理。
    • 处理完成后将处理结果和数据填写到mmap共享内存中。
  • exclusive锁处理
    • tcmu-runner采用了其中描述的显式加锁方法StandardPolicy。
    • 一定不能将multipath配置成AA模式,配置成AA模式会导致exclusive-lock在不同的tcmu-runner客户端一直切换。

代码详解

创建块设备

通过netlink与内核configfs交互,当target中新增rbd image后,此tcmu-runner客户端会收到消息,并创建块设备。核心代码包括:

  • 注册netlink
  • 创建块设备

设置netlink

函数调用关系如下:

static struct genl_cmd tcmu_cmds[] = {
	{
		.c_id		= TCMU_CMD_ADDED_DEVICE,
		.c_name		= "ADDED DEVICE",
		.c_msg_parser	= handle_netlink,
		.c_maxattr	= TCMU_ATTR_MAX,
		.c_attr_policy	= tcmu_attr_policy,
	},
	{
		.c_id		= TCMU_CMD_REMOVED_DEVICE,
		.c_name		= "REMOVED DEVICE",
		.c_msg_parser	= handle_netlink,
		.c_maxattr	= TCMU_ATTR_MAX,
		.c_attr_policy	= tcmu_attr_policy,
	},
	{
		.c_id		= TCMU_CMD_RECONFIG_DEVICE,
		.c_name		= "RECONFIG DEVICE",
		.c_msg_parser	= handle_netlink,
		.c_maxattr	= TCMU_ATTR_MAX,
		.c_attr_policy	= tcmu_attr_policy,
	},
};

static struct genl_ops tcmu_ops = {
	.o_name		= "TCM-USER",
	.o_cmds		= tcmu_cmds,
	.o_ncmds	= ARRAY_SIZE(tcmu_cmds),
};

int main(int argc, char **argv)
	tcmulib_initialize
		setup_netlink
			genl_register_family(&tcmu_ops); // 通过注册ops,在内核回调时进行相应处理。

添加块设备

在netlink回调之后,根据id执行添加device的流程。

handle_netlink
	device_add
		device_parse_cfg // 读取configfs中关于rbd image的相关配置
		device_open_shm // 使用uio打开共享内存
			tcmu_dev_get_memory_info // 获取内核创建的uio设备/sys/class/uio/%s/maps/map0/
			mmap // 映射共享内存,有读写权限。
		dev_added
			...... // 创建命令字处理队列、锁、相关block属性
			tcmu_rbd_open // 打开image,获取context
				...... // 调用open前,配置image相关参数
				tcmu_rbd_image_open
					rados_create
					rados_connect // 链接rados
					rados_ioctx_create // 获取ioctx
					rbd_open // 打开image,获取imagectx
					tcmu_rbd_service_register // 注册cephmgr daemon
				rbd_stat // 检查image状态
				...... // 配置image一些属性,如granularity、cache等
			pthread_create(tcmur_cmdproc_thread) // 启动监听uio共享内存中SCSI命令字线程。

SCSI命令字处理

在添加tcmu设备时,启动了uio共享内存的监听线程,循环获取命令字并进行后续处理。代码主要包括:

  • 获取命令字。
  • 命令字处理。
  • 命令字处理结果返回。

获取命令字

tcmur_cmdproc_thread
	while (1) { // 无限循环,如果没有命令字,就用ppoll机制等待。
		tcmulib_get_next_command // 获取未处理的命令字
		tcmur_generic_handle_cmd // 命令字处理
	}
	ppoll // 等待命令字

命令字处理

命令字包括write、read、unmap等多种,处理时调用rbd接口如下:

命令字 tcmu-runner入口函数 rbd接口
READ handle_read rbd_aio_read/rbd_aio_readv
WRITE handle_write rbd_aio_write/rbd_aio_writev
UNMAP handle_unmap rbd_aio_discard
SYNCHRONIZE_CACHE handle_flush rbd_aio_flush
EXTENDED_COPY handle_xcopy rbd_aio_read/rbd_aio_readv + rbd_aio_write/rbd_aio_writev
COMPARE_AND_WRITE handle_caw rbd_aio_compare_and_write
WRITE_VERIFY handle_write_verify rbd_aio_write/rbd_aio_writev
WRITE_SAME handle_writesame rbd_aio_writesame
FORMAT_UNIT handle_format_unit rbd_aio_write/rbd_aio_writev

下面以write为例进行代码梳理。

tcmur_cmd_handler
	alua_check_state // 检查当前客户端是否拿到exclusive-lock,并进行相应处理
	handle_write
		aio_request_schedule // 由于rbd没有配置队列,因此直接执行写函数write_work_fn
			write_work_fn
				tcmu_rbd_write
					tcmu_rbd_aio_write
						rbd_aio_write
						rbd_finish_aio_generic // rbd_aio_write后回调函数
							tcmur_cmd_complete
								handle_generic_cbk
									aio_command_finish
										tcmur_tcmulib_cmd_complete
											tcmulib_command_complete
												tcmu_sts_to_scsi // 将执行结果写入共享内存中,内核获取结果后返回

exclusive-lock

exclusive-lock是rbd的关键feature,用来保证不同客户端数据操作的互斥。详细分析见Ceph RBD:exclusize-lock代码详解 + 使用方法一文。tcmu-runner采用了其中描述的显式加锁方法StandardPolicy。
此外ceph-iscsi默认使用implicit alua配置,详见Ceph iSCSI Gateway:Multipath支持一文,本文后面的代码也基于此进行分析。
由于锁使用的是StandardPolicy,因此一定不能将multipath配置成AA模式,配置成AA模式会导致exclusive-lock在不同的tcmu-runner客户端一直切换。

加锁流程

alua_check_state
	alua_implicit_transition
		alua_event_work_fn
			tcmu_acquire_dev_lock
				tcmu_rbd_lock
					tcmu_rbd_lock_break // 调用rbd_aio_break,将所有io加入blacklist中。
					rbd_lock_acquire // 调用rbd接口加锁,此处会将锁的policy强制从AutomaticPolicy设置为StandardPolicy。

参考文献

Ceph RBD:exclusize-lock代码详解 + 使用方法
Ceph iSCSI Gateway:Multipath支持
Ceph iSCSI Gateway:架构原理详解
TCMU学习笔记文章来源地址https://www.toymoban.com/news/detail-523522.html

到了这里,关于Ceph iSCSI Gateway:tcmu-runner代码原理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初识Ceph --组件、存储类型、存储原理

    ceph Ceph(分布式存储系统)是一个开源的分布式存储系统,设计用于提供高性能、高可靠性和可扩展性的存储服务,可以避免单点故障,支持块存储、对象存储以及文件系统存储应用。使用C++语言开发。ceph能够通过网络将数据分散存储在多台独立设备上 ceph具有可扩展性:

    2024年02月05日
    浏览(37)
  • ceph-mon运行原理分析

    1.ceph-deploy部署ceph-mon的工作流程及首次启动 1)通过命令创建ceph-mon,命令为:ceph-deploy create mon keyring 2)在创建mon时,会根据传入的args参数生成配置文件ceph.conf。 3)检查ceph-mon组件工作目录(/var/lib/ceph/mon/mycluster-myhostname)是否存在,不存在就创建,除了创建该目录外,还需

    2024年02月14日
    浏览(30)
  • 【Ceph】基于ceph-deploy部署Ceph集群详解

    DAS(直接附加存储,是 直接接到计算机主板总线上的存储 ) IDE、SATA、SCSI、SAS、USB接口的磁盘 所谓接口就是一种 存储设备驱动下的磁盘设备 ,提供 块级别的存储 NAS(网络附加存储,是 通过网络附加到当前主机文件系统之上的存储 ) NFS、CIFS、FTP 文件系统级别的存储,本

    2024年02月16日
    浏览(39)
  • ConvNeXt原理+代码详解(通透)

    ConvNeXt 论文名称: A ConvNet for the 2020s 论文下载链接: https://arxiv.org/abs/2201.03545 源码链接: https://github.com/facebookresearch/ConvNeXt 太阳花的小绿豆的视频讲解: https://www.bilibili.com/video/BV1SS4y157fu 自从 ViT(Vision Transformer) 在CV领域大放异彩,越来越多的研究人员开始拥入 Transformer 的怀

    2024年02月06日
    浏览(33)
  • 【Ceph集群应用】Ceph块存储之RBD接口详解

    接上文基于ceph-deploy部署Ceph集群详解 (1)创建一个名为rbd-demo的专门用于RBD的存储池 (2)将存储池转换为RBD模式 (3)初始化存储池 (4)创建镜像 (5)镜像管理 查看存储池下存在哪些镜像 查看镜像的详细信息 修改镜像大小 直接删除镜像 推荐使用trash命令,这个命令删除

    2024年02月16日
    浏览(55)
  • Kafka第二课-代码实战、参数配置详解、设计原理详解

    引入依赖 生产者代码以及参数详解 消费者代码以及参数详解 实体类 引入基本依赖 配置application.yml 当配置ack-mode: MANUAL_IMMEDIATE时,需要手动在消费者提交offset,否则会一直重复消费 消费者 测试,访问生产者控制层,可以自动监听到消费者 Kafka核心总控制器Controller 在Kafka集

    2024年02月16日
    浏览(37)
  • 小梅哥-DDS原理和代码详解

    DDS(Direct Digital Synthesis):是一种信号产生器。 DDS主要通过频率控制字(FWORD)和相位控制字(PWORD)来对信号的频率和相位进行改变。输出频率的公式为,其中B是FWORD,Fclk为系统时钟。公式这么写的原理推导如下: 由DDS结构图可知频率控制字对频率进行改变后,将其和相位控

    2024年02月08日
    浏览(37)
  • CLIP模型原理与代码实现详解

    目前,大模型十分活跃,openai公司呈现GPT系列,特别是Chat-GPT给人深刻印象,意识到大模型厉害之处,随后推出GPT4模型,更是将大模型进一步推到一个高度,并将多模态融合技术留下深刻印象,同时,学者也对多模态融合技术研究呈现百花齐放之势。然而,多模态模型大多以

    2024年02月07日
    浏览(44)
  • 【Ceph集群应用】Ceph对象存储系统之RGW接口详解

    接上文基于ceph-deploy部署Ceph集群详解 (1)对象存储概念 对象存储(object storage)是非结构数据的存储方法,对象存储中每一条数据都作为单独的对象存储,拥有唯一的地址来识别数据对象,通常用于云计算环境中。 不同于其他数据存储方法, 基于对象的存储不使用目录树

    2024年02月17日
    浏览(40)
  • Stable Diffusion原理详解(附代码实现)

    回顾AI绘画的历史,GAN(Generative Adversarial Nets)是比较出众的一个。GAN的出现让AI绘画成为可能,当时GAN给AI绘画提供了一种新的思路,现在回顾当时的绘画可以算是相当粗糙。 gan-results.jpg 初代GAN出现后,出现了大量GAN的变种,比如StyleGAN、CycleGAN、DCGAN等。而StyleGAN已经可以生

    2024年02月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包