Multipath用户进程代码解析

上传人:re****.1 文档编号:499002648 上传时间:2023-02-01 格式:DOCX 页数:19 大小:112.76KB
返回 下载 相关 举报
Multipath用户进程代码解析_第1页
第1页 / 共19页
Multipath用户进程代码解析_第2页
第2页 / 共19页
Multipath用户进程代码解析_第3页
第3页 / 共19页
Multipath用户进程代码解析_第4页
第4页 / 共19页
Multipath用户进程代码解析_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《Multipath用户进程代码解析》由会员分享,可在线阅读,更多相关《Multipath用户进程代码解析(19页珍藏版)》请在金锄头文库上搜索。

1、目录1 Multipath 概要说明 22 multipath 程序流程: 32.1 multipath 版本 32.2multipath 用户态程序依赖库 32.3生成多路径信息 42.3.1 命令执行概要 42.3.2 核心数据结构 42.3.3主函数调用流程 42.4清除所有多路径信息 92.4.1命令执行概要 93 multipathd 程序流程 101.1. checkloop 线程 122.2. ueventloop 线程 142.3. uxlsnrloop 线程 164 device_mapper 用户库接口 175 dm_mod 、 dm_multipath 内核模块 181

2、Multipath 概要说明Multipath用户程序有两个,包括multipath和multipathd,其中multipath程序主要用来做查询多路径状态, multipathd 程序主要用来响应硬件事件,并执行相应动作。从网上找的一张描述multipath整体调用流程的图片,从用户态到内核态testmanual execadidel block device calls erecskernel spacefailed1) wait devmap events2) reinstate paths31 swilcti path group (fail bach)rejconfigure rn

3、uiii|am deviDemaps1) add path2) remove path3) add devnap4) remove devrrapdevicerrapperuser spaceconfigure pa rations dwicemapsNetLinkblaclow level device dmersncEplugmjftipathdmultipath2 multipath 程序流程:首先调用sysfs_get_mnt_path,得到sysfs文件系统的挂载目录,一般情况下为/sys;然后调用configure,这个函数执行了剩下的所有事情:1)首先通过path_discove

4、ry从/sys下找到所有当前磁盘路径,放到结构体中 pathvec 中2)然后调用coalesce_paths,计算pathvec中每一条路径的wwid值,如果相同 就聚合成一条 mpp3)最后调用domap(mpp),执行多路径动作(例如:路径创建、路径删除、路 径切换等等)2.1 multipath 版本device-mapper-multipath-0.4.7-23.el52.2 multipath 用户态程序依赖库(一)libsysfs.so从sysfs子系统内提取/sys/block/sda,sdb.磁盘信息 对应源码包: sysfsutils2.0.06.src.rpm(二)lib

5、devmapper.so重新封装ioctl接口,供libmultipath.so库以及kpartx调用主要提供函数接口如:dm_task_create dm_task_run dm_task_destroy等 对应源码包: devicemapper1.02.282.el5.src.rpm(三)libmultipath.so供 multipath、multipathd 等程序调用 主要提供函数接口如: coalesce_paths、add_map_without_path、add_map_with_path、remove_map、remove_maps 等对应源码包:device-mapper-

6、multipath-0.4.7-23.el5.src.rpm以命令执行为入口,一步步分析代码流程:2.3 生成多路径信息 multipath -v32.3.1 命令执行概要扫描 sysfs 下所有磁盘,得到所有块设备,包括本机硬盘, U 盘,所有 scsi 存储,过滤 掉黑名单(blacklist)中的设备,通过scsi_id命令得到磁盘的scsi-id,并将相同scsi-id的磁盘归 类为一个多路径,最后调用ioctl发往内核2.3.2 核心数据结构struct vectors vecs struct vector *pathvec; #存储单独的一条磁盘信息,如sda、sdb等 struc

7、t vector *mpvec; #存储聚合后的多路径信息,如dm-0、dm-1等2.3.3 主函数调用流程执行 main - configure - path_discovery、 coalesce_paths2.3.3.1 path_discovery 函数流程从sysfs子系统提取所有路径,如sda,sdb.遍历这些路径,依次调用path_discover,在 path_discover中,过滤掉黑名单(blacklist)中的磁盘设备,再调用pathinfo获得与磁盘有 关的信息:wwid、vendor_id、product_id、sg_id.host_no,channel,scsi_

8、id,lun等,最终将所有单 条路径信息填入vecs-pathvec结构中其中获得wwid的函数为get_uid,主要就是调用程序/sbin/scsi_id -g -u -s /block/%n获得 磁盘 wwid 信息2332 coalesce_paths(聚合路径)函数流程仍然是遍历 vecs-pathvec 中所有路径,将 path.size 和 path.wwid 相同的路径聚合为一 条多路径,最终调用domap(ACT_CREATE创建一条多路径,并填充到结构体vecs-mpvec中2333 domap 函数流程domap参数主要有 创建ACT_CREATE、重新生成多路径 ACT_

9、RELOAD、切换路径ACT_SWITCHPG、多路径重命名 ACT_RENAME根据参数不同,调用如下函数:函数名函数说明dm_addmap创建一条多路径dm_map_present检测内核是否已经存在某条多路径dm_flush_map删除一条多路径dm_switchgroup主备模式下的路径切换dm_fail_path废掉一条路径dm_reinstate_path恢复一条路径dm_queue_if_no_path改变多路径行为:若多路径下没有任何可用路径,是否缓存写队 列dm_rename重命名某条多路径的别名(alias)domap(ACT_CREATE) - dm_addmap - d

10、m_task_run 在 libdevmapper.so.1.02库中)-2.3.3.4 dm_addmap 函数流程1) 创建一个 struct dm_task *dmt = dm_task_create(DM_DEVICE_CREATE)2) dm_task_set_name (多路径别名)3) dm_task_add_target() : 将多路径参数按格式填入4) dm_task_run() : 最终调用 ioctl 发往内核5) dm_task_destroy()注:上面以 dm_task 开头的函数都是 libdevmapper.so 库提供的2.3.3.5 dm_task_run

11、 函数流程内核ioctl接口一共提供如下几种类型的命令# lib/libdevmapper.henum DM_DEVICE_CREATE,DM_DEVICE_RELOAD,DM_DEVICE_REMOVE,DM_DEVICE_REMOVE_ALL,DM_DEVICE_SUSPEND,DM_DEVICE_RESUME,DM_DEVICE_INFO,DM_DEVICE_DEPS,DM_DEVICE_RENAME,DM_DEVICE_VERSION,DM_DEVICE_STATUS,DM_DEVICE_TABLE,DM_DEVICE_WAITEVENT,DM_DEVICE_LIST,DM_DEVIC

12、E_CLEAR,DM_DEVICE_MKNODES,DM_DEVICE_LIST_VERSIONS,DM_DEVICE_TARGET_MSG,DM_DEVICE_SET_GEOMETRY;# lib/ioctl/libdm-iface.cstatic struct cmd_data _cmd_data_v4 = create,DM_DEV_CREATE,4, 0, 0,reload,DM_TABLE_LOAD,4, 0, 0,remove,DM_DEV_REMOVE,4, 0, 0,remove_all,DM_REMOVE_ALL,4, 0, 0,suspend,DM_DEV_SUSPEND,

13、4, 0, 0,resume,DM_DEV_SUSPEND,4, 0, 0,info,DM_DEV_STATUS,4, 0, 0,deps,DM_TABLE_DEPS,4, 0, 0,rename,DM_DEV_RENAME,4, 0, 0,version,DM_VERSION,4, 0, 0,status,DM_TABLE_STATUS,4, 0, 0,table,DM_TABLE_STATUS,4, 0, 0,waitevent,DM_DEV_WAIT,4, 0, 0,names,DM_LIST_DEVICES,4, 0, 0,clear,DM_TABLE_CLEAR,4, 0, 0,mk

14、nodes,DM_DEV_STATUS,4, 0, 0,versions,DM_LIST_VERSIONS,4, 1, 0,message,DM_TARGET_MSG,4, 2, 0,setgeometry,DM_DEV_SET_GEOMETRY,4, 6, 0,;通过将 dmt.type 在枚举项和_create_andoad_v4 中找到命令,如 create、reload、remove等等,最终调用_do_dm_ioctl但是创建一条多路径的情况比较特殊(dmt.type=DM_DEVICE_CREATE的情况下)直接调用 _create_and_load_v42.3.3.6 _create_and_load_v4 函数流程调用两遍 dm_task_run(dmt.)1) 先要创建 mpath0 : dmt.type = DM_DEVICE_CREATE 、 command = DM_DEV_CREATE2) 再将 sda,sdb 写到 table 表中:dmt.type = DM_DEVICE_RELOAD、command= DM_DEV_LOAD

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号