背景
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