- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
目录
TOC \o 1-3 \h \z \u 1 Multipath概要说明 h 2
2 multipath程序流程: h 3
2.1 multipath版本 h 3
2.2 multipath用户态程序依赖库 h 3
2.3 生成多路径信息 h 4
2.3.1 命令执行概要 h 4
2.3.2 核心数据结构 h 4
2.3.3 主函数调用流程 h 4
2.4 清除所有多路径信息 h 9
2.4.1 命令执行概要 h 9
3 multipathd程序流程 h 10
1.1. checkloop线程 h 12
2.2. ueventloop线程 h 14
2.3. uxlsnrloop线程 h 16
4 device_mapper用户库接口 h 17
5 dm_mod、dm_multipath内核模块 h 18
Multipath概要说明
Multipath用户程序有两个,包括multipath和multipathd,其中multipath程序主要用来做查询多路径状态,multipathd程序主要用来响应硬件事件,并执行相应动作。
从网上找的一张描述multipath整体调用流程的图片,从用户态到内核态
multipath程序流程:
首先调用sysfs_get_mnt_path,得到sysfs文件系统的挂载目录,一般情况下为/sys;
然后调用configure,这个函数执行了剩下的所有事情:
首先通过path_discovery从/sys下找到所有当前磁盘路径,放到结构体中pathvec中
然后调用coalesce_paths,计算pathvec中每一条路径的wwid值,如果相同就聚合成一条mpp
最后调用domap(mpp),执行多路径动作(例如:路径创建、路径删除、路径切换等等)
multipath版本
device-mapper-multipath-0.4.7-23.el5
multipath用户态程序依赖库
libsysfs.so
从sysfs子系统内提取/sys/block/{sda,sdb...} 磁盘信息
对应源码包:sysfsutils-2.0.0-6.src.rpm
libdevmapper.so
重新封装ioctl接口,供libmultipath.so库以及kpartx调用
主要提供函数接口如:dm_task_create dm_task_run dm_task_destroy等
对应源码包:device-mapper-1.02.28-2.el5.src.rpm
libmultipath.so
供multipath、multipathd等程序调用
主要提供函数接口如:coalesce_paths、add_map_without_path、add_map_with_path、remove_map、remove_maps等
对应源码包:device-mapper-multipath-0.4.7-23.el5.src.rpm
以命令执行为入口,一步步分析代码流程:
生成多路径信息
multipath -v3
命令执行概要
扫描sysfs下所有磁盘,得到所有块设备,包括本机硬盘,U盘,所有scsi存储,过滤掉黑名单(blacklist)中的设备,通过scsi_id命令得到磁盘的scsi-id,并将相同scsi-id的磁盘归类为一个多路径,最后调用ioctl发往内核
核心数据结构
struct vectors vecs {
struct vector *pathvec; # 存储单独的一条磁盘信息,如sda、sdb等
struct vector *mpvec; # 存储聚合后的多路径信息,如dm-0、dm-1等
}
主函数调用流程
执行 main - configure - path_discovery、coalesce_paths
path_discovery函数流程
从sysfs子系统提取所有路径,如sda,sdb... 遍历这些路径,依次调用path_discover,在path_discover中,过滤掉黑名单(blacklist)中的磁盘设备,再调用pathinfo获得与磁盘有关的信息:wwid、vendor_id、product_id、sg_id.{host_no,channel,scsi_id,lun}等,最终将所有单条路径信息填入vecs-pathvec结构中
其中获得wwid的函数为get_uid,主要就是调用程序/sbin/scsi_id -g -u -s /block/%n 获得磁盘wwid信息
coalesce_paths(聚合路径)
文档评论(0)