DeviceMapperMultipath配置指导书全解
- 格式:doc
- 大小:448.50 KB
- 文档页数:18
你知道linux内核中的device mapper?关于device mapper在内核中的架构信息在参考文档1,2中有很好的解释,在这里就不过多介绍,以下将详细的根据device mapper的代码解释device mapper机制。
一、LVM简介LVM2是Linux 下的逻辑卷管理器,它可以对磁盘进行分区等。
但是我们这里用LVM主要是利用用户空间的device mapper 库以及它提供的dmsetup 工具。
LVM的下载地址为:http://git.fedorahosted/git/lvm2.git。
下载后在tools文件夹下会看到dmsetup.c文件,该文件即为dmsetup工具的源码。
LVM2的安装方法为:1. 执行脚本./configure2. make device-mapper3. make install这时ls -l /sbin/dmsetup 发现该命令已经是最近编译的。
二、DM支持RAID45DM默认支持linear、mirror、striped、snapshot、multipath等 target driver,并不支持raid45。
但是在 2.6内核的几个特定版本中有提供支持raid45的补丁:http://people.redhat/heinzm/sw/dm/dm-raid45/举例kernel-2.6.30-rc3来说。
下载好内核后,需将内核名字更改为linux-2.6.30-rc3。
然后将下载的补丁放在跟刚下载的内核同目录下,执行命令patch -bp0 fn(cmd, argc--, argv++, NULL, mulTIple_devices) 即执行_create函数3._create->dm_task_create->dm_check_version->_check_version->dm_task_create->dm_task_ru n->_do_dm_ioctl->ioctl(DM_VERSION)->dm_task_run->_create_and_load_v4->dm_task_create->dm_task_run->_do_dm_ioctl->ioctl( DM_DEV_CREATE)->dm_task_create->dm_task_run->_do_dm_ioctl->ioctl(DM_TABLE_LOAD)->dmt->type=DM_DEVICE_RESUME->dm_task_run->_do_dm_ioctl->ioctl(DM_DEV_SUSP END)->case DM_DEVICE_RESUME->add_dev_node。
Oracle RAC存储多路径的设置案例以redhat6、centos6、oracle6及Asianux4为例1.安装多路径的客户端如果是FC SAN: yum install device-mapper device-mapper-multipath -y如果是IP SAN: yum install iscsi-initiator-utils device-mapper device-mapper-multipath -y2.设置一个多路径的配置文件:/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf 的文件拷贝到/etc目录下面:3.启动multipath服务/etc/init.d/multipathd restart4.将所有/etc/multipath/bindings 设置为一致,两边的内容一样[root@rac81]# cat /etc/multipath/bindings# Multipath bindings, Version : 1.0# NOTE: this file is automatically maintained by the multipath program.# You should not need to edit this file in normal circumstances.## Format:# alias wwid#mpatha 3600605b005c1b03019ae96a616049c04mpathb 3600143801259f9320000500000360000mpathc 3600143801259f9320000500000420000mpathd 3600143801259f9320000500000460000mpathe 3600143801259f93200005000004a0000mpathf 3600143801259f93200005000003e0000mpathg 3600143801259f93200005000003a0000mpathh 3600143801259f93200005000004e0000mpathi 3600143801259f9320000500000520000mpathj 3600143801259f9320000500000560000mpathk 3600143801259f93200005000005a0000mpathl 3600143801259f93200005000005e0000mpathm 3600143801259f93200005000007a00004.配置multipath.conf 文件的磁盘项目devices {device {vendor "HP"product "HSV2[01]0|HSV300|HSV4[05]0"getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"prio aluahardware_handler "0"path_selector "round-robin 0"path_grouping_policy group_by_priofailback immediaterr_weight uniformno_path_retry 18rr_min_io_rq 1path_checker tur}}上述的内容根据磁盘柜的型号定制,如HP...blacklist {#wwid "3600605b005c192d019aeb93a121ef663"wwid "3600605b005c1b03019ae96a616049c04"devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"devnode "^hd[a-z]"}上述的内容要将本地磁盘的wwid号放入blacklist中,避免产生多路径multipaths {multipath {wwid 3600143801259f9320000500000360000alias disk1}multipath {wwid 3600143801259f9320000500000420000alias disk2}multipath {wwid 3600143801259f9320000500000460000alias disk3}multipath {wwid 3600143801259f93200005000004a0000alias disk4}multipath {wwid 3600143801259f93200005000003e0000alias disk5}multipath {wwid 3600143801259f93200005000003a0000alias disk6}multipath {wwid 3600143801259f93200005000004e0000alias disk7}multipath {wwid 3600143801259f9320000500000520000alias disk8}multipath {wwid 3600143801259f9320000500000560000alias disk9}multipath {wwid 3600143801259f93200005000005a0000alias disk10}multipath {wwid 3600143801259f93200005000005e0000alias disk11}multipath {wwid 3600143801259f93200005000007a0000alias disk12}}上述的内容是设置multipath别名项defaults {udev_dir /devpolling_interval 10path_selector "round-robin 0"path_grouping_policy multibusgetuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"prio aluapath_checker readsector0rr_min_io 100max_fds 8192rr_weight prioritiesfailback immediateno_path_retry failuser_friendly_names yes}上述defaults一定要打开,一般为默认即可;5.执行multipath -F命令将原来生成错误的多路径删除[root@rac81 ~]# multipath -F6.执行multipath -v2命令生成新的多路径[root@rac81 ~]# multipath -v27.使用multipath -ll查看生成多路径的情况[root@rac81 ~]# multipath -lldisk9 (3600143801259f9320000500000560000) dm-16 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:9 sdj 8:144 failed faulty running|- 6:0:1:9 sdv 65:80 failed faulty running|- 8:0:0:9 sdah 66:16 active ready running`- 8:0:1:9 sdat 66:208 active ready runningdisk8 (3600143801259f9320000500000520000) dm-14 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:8 sdi 8:128 failed faulty running|- 6:0:1:8 sdu 65:64 failed faulty running|- 8:0:0:8 sdag 66:0 active ready running`- 8:0:1:8 sdas 66:192 active ready runningdisk12 (3600143801259f93200005000007a0000) dm-18 HP,HSV360 size=100G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:12 sdm 8:192 failed faulty running|- 6:0:1:12 sdy 65:128 failed faulty running|- 8:0:0:12 sdak 66:64 active ready running`- 8:0:1:12 sdaw 67:0 active ready runningdisk7 (3600143801259f93200005000004e0000) dm-12 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:7 sdh 8:112 failed faulty running|- 6:0:1:7 sdt 65:48 failed faulty running|- 8:0:0:7 sdaf 65:240 active ready running`- 8:0:1:7 sdar 66:176 active ready runningdisk11 (3600143801259f93200005000005e0000) dm-20 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:11 sdl 8:176 failed faulty running|- 6:0:1:11 sdx 65:112 failed faulty running|- 8:0:0:11 sdaj 66:48 active ready running`- 8:0:1:11 sdav 66:240 active ready runningdisk6 (3600143801259f93200005000003a0000) dm-6 HP,HSV360 size=1.0G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:2 sdc 8:32 failed faulty running|- 6:0:1:2 sdo 8:224 failed faulty running|- 8:0:0:2 sdaa 65:160 active ready running`- 8:0:1:2 sdam 66:96 active ready runningdisk10 (3600143801259f93200005000005a0000) dm-22 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:10 sdk 8:160 failed faulty running|- 6:0:1:10 sdw 65:96 failed faulty running|- 8:0:0:10 sdai 66:32 active ready running`- 8:0:1:10 sdau 66:224 active ready runningdisk5 (3600143801259f93200005000003e0000) dm-4 HP,HSV360 size=1.0G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:3 sdd 8:48 failed faulty running|- 6:0:1:3 sdp 8:240 failed faulty running|- 8:0:0:3 sdab 65:176 active ready running`- 8:0:1:3 sdan 66:112 active ready runningdisk4 (3600143801259f93200005000004a0000) dm-10 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:6 sdg 8:96 failed faulty running|- 6:0:1:6 sds 65:32 failed faulty running|- 8:0:0:6 sdae 65:224 active ready running`- 8:0:1:6 sdaq 66:160 active ready runningdisk3 (3600143801259f9320000500000460000) dm-8 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:5 sdf 8:80 failed faulty running|- 6:0:1:5 sdr 65:16 failed faulty running|- 8:0:0:5 sdad 65:208 active ready running`- 8:0:1:5 sdap 66:144 active ready runningdisk2 (3600143801259f9320000500000420000) dm-0 HP,HSV360 size=500G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:4 sde 8:64 failed faulty running|- 6:0:1:4 sdq 65:0 failed faulty running|- 8:0:0:4 sdac 65:192 active ready running`- 8:0:1:4 sdao 66:128 active ready runningdisk1 (3600143801259f9320000500000360000) dm-2 HP,HSV360 size=1.0G features='0' hwhandler='0' wp=rw`-+- policy='round-robin 0' prio=10 status=active|- 6:0:0:1 sdb 8:16 failed faulty running|- 6:0:1:1 sdn 8:208 failed faulty running|- 8:0:0:1 sdz 65:144 active ready running`- 8:0:1:1 sdal 66:80 active ready running[root@rac81 ~]#。
【共享服务】iscsi多路径配置⼀、安装部署1、前⾔普通的电脑主机都是⼀个硬盘挂接到⼀个总线上,这⾥是⼀对⼀的关系。
⽽到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块⽹卡及IP来连接,这样的话,就构成了多对多的关系。
也就是说,主机到存储可以有多条路径可以选择。
主机到存储之间的IO由多条路径可以选择。
每个主机到所对应的存储可以经过⼏条不同的路径,如果是同时使⽤的话,I/O流量如何分配?其中⼀条路径坏掉了,如何处理?还有在操作系统的⾓度来看,每条路径,操作系统会认为是⼀个实际存在的物理盘,但实际上只是通向同⼀个物理盘的不同路径⽽已,这样是在使⽤的时候,就给⽤户带来了困惑。
多路径软件就是为了解决上⾯的问题应运⽽⽣的。
多路径的主要功能就是和存储设备⼀起配合实现如下功能:故障的切换和恢复IO流量的负载均衡磁盘的虚拟化为了主机可以使⽤ iSCSI 多路径访问存储设备,我们需要在主机上安装多路径设备映射器 (DM-Multipath)。
多路径设备映射器可以实现主机节点和后端存储之间的多个 I/O 路径配置为⼀个单⼀逻辑设备,从⽽可以提供链路冗余和提⾼性能。
主机通过访问包含多个 I/O 路径的逻辑设备,就可以有效提⾼后端存储系统的可靠性。
2、部署说明节点主机名节点IP⾓⾊系统版本node23066.66.66.230mon、osd CentOS7.2node23166.66.66.231mon、mds、osd、target CentOS7.2node23266.66.66.232mon、mds、osd、target CentOS7.2本次⽰例由分布式存储提供⼀个1TB⼤⼩的rbd(lun01),通过node231、node232分别创建⼀个target服务共享lun01出去,客户端node220通过iscsi分别与node231、node232建⽴连接注:以下操作均在initiator端node220节点下执⾏2.1、initiator与target建⽴连接node220节点分别通过节点node231、node232与lun01建⽴连接,映射到本地磁盘下lun01通过node231、node232两个节点两条链路映射到node220节点下,映射盘符为sdc和sdd[root@node220 ~]# iscsiadm -m discovery -t st -p 66.66.66.23166.66.66.231:3260,1 :target01[root@node220 ~]# iscsiadm -m discovery -t st -p 66.66.66.23266.66.66.232:3260,1 :target01[root@node220 ~]# iscsiadm -m node -T :target01 --loginLogging in to [iface: default, target: :target01, portal: 66.66.66.231,3260] (multiple)Logging in to [iface: default, target: :target01, portal: 66.66.66.232,3260] (multiple)Login to [iface: default, target: :target01, portal: 66.66.66.231,3260] successful.Login to [iface: default, target: :target01, portal: 66.66.66.232,3260] successful.[root@node220 ~]# iscsiadm -m node ll66.66.66.231:3260,1 :target0166.66.66.232:3260,1 :target01[root@node220 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 223.6G 0 disk└─md126 9:126 0 212.4G 0 raid1├─md126p1 259:0 0 200M 0 md /boot/efi├─md126p2 259:1 0 500M 0 md /boot└─md126p3 259:2 0 211.7G 0 md├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 4G 0 lvm [SWAP]└─centos-home 253:2 0 157.7G 0 lvm /homesdb 8:16 0 223.6G 0 disk└─md126 9:126 0 212.4G 0 raid1├─md126p1 259:0 0 200M 0 md /boot/efi├─md126p2 259:1 0 500M 0 md /boot└─md126p3 259:2 0 211.7G 0 md├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 4G 0 lvm [SWAP]└─centos-home 253:2 0 157.7G 0 lvm /homesdc 8:32 0 1T 0 disksdd 8:48 0 1T 0 disk2.2、multipath配置安装multipath软件[root@node220 ~]# yum install -y device-mapper-multipath[root@node220 ~]# rpm -qa | grep multipathdevice-mapper-multipath-0.4.9-123.el7.x86_64device-mapper-multipath-libs-0.4.9-123.el7.x86_64⽣成multipath配置执⾏命令mpathconf --enable,在/etc⽬录下⽣成配置⽂件multipath.conf[root@node220 ~]# mpathconf --enable修改multipath配置修改配置⽂件/etc/mulipath.conf信息如下,之后执⾏命令systemctl restart multipathd 重启服务[root@node220 ~]# cat /etc/multipath.confdefaults {user_friendly_names yes}设置⿊名单列表,⽰例环境sda、sdb磁盘为系统RAID盘,故⽽排除blacklist {devnode "^sd[a-b]"}multipaths {multipath {path_grouping_policy multibus#path_checker readsector0prio "random"path_selector "round-robin 0"}}devices {device {vendor "vcluster"product "12.2.12"path_checker readsector0path_selector "round-robin 0"failback immediateno_path_retry fail}}[root@node220 ~]# systemctl restart multipathd查看multipath状态此时本地可以看到新增的虚拟磁盘/dev/mapper/mpathc ,该虚拟磁盘通过两条iscsi路径提供,当前配置为主备模式(同⼀时刻只有⼀条路径处于活动状态,可写⼊数据)[root@node220 ~]# multipath -llmpathc (360000000000000000e00000000150001) dm-3 vcluster,VIRTUAL-DISKsize=1.0T features='0' hwhandler='0' wp=rw|-+- policy='service-time 0' prio=1 status=enabled| `- 45:0:0:1 sdc 8:32 active ready running`-+- policy='service-time 0' prio=1 status=active`- 46:0:0:1 sdd 8:48 active ready running[root@node220 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 223.6G 0 disk└─md126 9:126 0 212.4G 0 raid1├─md126p1 259:0 0 200M 0 md /boot/efi├─md126p2 259:1 0 500M 0 md /boot└─md126p3 259:2 0 211.7G 0 md├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 4G 0 lvm [SWAP]└─centos-home 253:2 0 157.7G 0 lvm /homesdb 8:16 0 223.6G 0 disk└─md126 9:126 0 212.4G 0 raid1├─md126p1 259:0 0 200M 0 md /boot/efi├─md126p2 259:1 0 500M 0 md /boot└─md126p3 259:2 0 211.7G 0 md├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 4G 0 lvm [SWAP]└─centos-home 253:2 0 157.7G 0 lvm /homesdc 8:32 0 1T 0 disk└─mpathc 253:3 0 1T 0 mpathsdd 8:48 0 1T 0 disk└─mpathc 253:3 0 1T 0 mpath[root@node220 ~]# cat /proc/partitionsmajor minor #blocks name8 16 234431064 sdb8 0 234431064 sda9 126 222715904 md126259 0 204800 md126p1259 1 512000 md126p2259 2 221997056 md126p3253 0 52428800 dm-0253 1 4194304 dm-1253 2 165310464 dm-28 32 1073741824 sdc8 48 1073741824 sdd253 3 1073741824 dm-32.3、multipath验证验证multipath效果,看能否实现活动路径故障,备⽤路径接管写⼊的效果将多路径设备/dev/mapper/mpathc挂载到本地⽬录/client下,通过vdbench持续读写数据查看multipath主链路为node232节点,映射磁盘为/dev/sdd停⽌multipath主链路node232节点的target服务,客户端读写未出现中断情况此时multipath主链路切换⾄node231节点下查看multipath状态,主链路切换⾄node231节点下查看/var/log/messages⽇志打印,multipath检测到sdd磁盘异常,标记为fail状态,当前链路数为1 查看磁盘流量,此时磁盘读写流量切换⾄sdc磁盘下当恢复node232节点target服务之后,node232节点重新加⼊到multipath备链路下⼆、常⽤操作1、常⽤命令加载内核模块: modprobe dm-multipath; modprobe dm-round-robin刷新所有多路径配置: multipath -F查看多路径: multipath -ll。
Linux MultiPath多路径部署方案目录一、环境摘要 (3)二、检查安装multipath (3)2.1检查是否已安装模块 (3)2.2加载模块 (3)2.3设为开机自动启动 (3)三、配置multipath (4)3.1创建配置脚本 (4)3.2确认配置结果 (8)3.3正常使用磁盘 (8)四、测试 (8)4.1负载均衡测试 (8)五、常用操作命令 (9)5.1启停mulitipath服务 (9)5.2删除现有路径 (9)5.3格式化路径(重新扫描) (9)5.4查看多路径 (9)5.5重载multipathd服务 (10)一、环境摘要Suse 11 sp1二、检查安装multipath2.1检查是否已安装模块Suse 11 sp2系统默认安装有以下模块# rpm -qa |grep mapperdevice-mapper-32bit-1.02.63-18.25.1device-mapper-1.02.63-18.25.1# rpm -qa |grep multimultipath-tools-0.4.9-0.60.1# rpm -qa |grep udevlibudev0-32bit-147-0.47.2libgudev-1_0-0-147-0.47.2udev-147-0.47.2libudev0-147-0.47.22.2加载模块modprobe dm-multipathmodprobe dm-round-robin2.3设为开机自动启动chkconfig --level 35 multipathd on三、配置multipath3.1创建配置脚本Multipath的配置文件是/etc/multipath.conf,将以下内容复制到文件中,并保存:以下脚本屏蔽了华为多路径软件,并且对多路径盘进行绑定,避免系统重启后设备名发生改变。
blacklist {wwid "3600605b0042372d01159327313feb8a2" devnode"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^hd[a-z]"device{vendor "up" #屏蔽华为多路径盘product "updisk"}}defaults {udev_dir /devpolling_interval 10#prio alua#rr_min_io 10user_friendly_names yesno_path_retry 10path_checker turpath_grouping_policy failover}devices {device {vendor "HP|COMPAQ"product "HSV1[01]1\(C\)COMPAQ|HSV2[01]0|HSV300|HSV4[05]0"path_grouping_policy group_by_priogetuid_callout "/lib/udev/scsi_id -g -u /dev/%n"path_checker turpath_selector "round-robin 0"prio aluarr_weight uniformfailback immediatehardware_handler "0"no_path_retry 18rr_min_io 100}}multipaths {multipath {wwid 3600050ccd64326f8579ee51180c744a8alias mpathapath_grouping_policy failoverfailback manualno_path_retry 10}multipath {wwid 3600050ccd44326f8579ee51180c744a8alias mpathbpath_grouping_policy failoverfailback manualno_path_retry 10}multipath {wwid 3600050ccdc4326f8579ee51180c744a8 alias mpathcpath_grouping_policy failover failback manualno_path_retry 10}multipath {wwid 3600050ccde4326f8579ee51180c744a8 alias mpathdpath_grouping_policy failover failback manualno_path_retry 10}multipath {wwid 3600050cce04326f8579ee51180c744a8 alias mpathepath_grouping_policy failover failback manualno_path_retry 10}}3.2确认配置结果1、启动服务:Service multipathd restart2、多路径聚合与查看多路径:Multipath –v2multipath -ll3、其他核查方式✓会在/dev/mapper/目录下多出类似mpatha、mpathb之类设备(如果指定了alias则以别名方式显示)✓用fdisk -l命令可以看到多路径软件创建的磁盘,如/dev/dm-[0-3]等3.3正常使用磁盘要使用多路径生成的磁盘直接操作/dev/mapper/目录下的磁盘就便可。
多路径配置详解multipath.conf文件的配置接下来的工作就是要编辑/etc/multipath.conf的配置文件multipath.conf主要包括blacklist、multipaths、devices三部份的配置blacklist配置blacklist {devnode "^sda"}defaults {user_friendly_names yes}devnode_blacklist {wwid 36005076b08164f4011ae88b23efb95fedevnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"devnode "^hd[a-z]"}Multipaths部分配置multipaths和devices两部份的配置。
multipaths {multipath {wwid **************** #此值multipath -v3可以看到alias iscsi-dm0 #映射后的别名,可以随便取path_grouping_policy multibus #路径组策略path_checker tur #决定路径状态的方法path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法}}Devices部分配置devices {device {vendor "iSCSI-Enterprise" #厂商名称product "Virtual disk" #产品型号path_grouping_policy multibus #默认的路径组策略getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序prio_callout "/sbin/acs_prio_alua %d" #获取有限级数值使用的默认程序path_checker readsector0 #决定路径状态的方法path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法failback immediate #故障恢复的模式no_path_retry queue #在disable queue之前系统尝试使用失效路径的次数的数值rr_min_io 100 #在当前的用户组中,在切换到另外一条路径之前的IO请求的数目}}更新 config文件# service multipathd reload1、blacklist这个参数用作排除磁盘的。
目录1Multipath概要说明 (2)2multipath程序流程: (3)2.1multipath版本 (3)2.2multipath用户态程序依赖库 (3)2.3生成多路径信息 (4)2.3.1命令执行概要 (4)2.3.2核心数据结构 (4)2.3.3主函数调用流程 (4)2.4清除所有多路径信息 (9)2.4.1命令执行概要 (9)3multipathd程序流程 (10)1.1.checkloop线程 (12)2.2. ueventloop线程 (14)2.3.uxlsnrloop线程 (16)4device_mapper用户库接口 (17)5dm_mod、dm_multipath内核模块 (18)1Multipath概要说明Multipath用户程序有两个,包括multipath和multipathd,其中multipath程序主要用来做查询多路径状态,multipathd程序主要用来响应硬件事件,并执行相应动作。
从网上找的一张描述multipath整体调用流程的图片,从用户态到内核态2multipath程序流程:首先调用sysfs_get_mnt_path,得到sysfs文件系统的挂载目录,一般情况下为/sys;然后调用configure,这个函数执行了剩下的所有事情:1)首先通过path_discovery从/sys下找到所有当前磁盘路径,放到结构体中pathvec中2)然后调用coalesce_paths,计算pathvec中每一条路径的wwid值,如果相同就聚合成一条mpp3)最后调用domap(mpp),执行多路径动作(例如:路径创建、路径删除、路径切换等等)2.1multipath版本device-mapper-multipath-0.4.7-23.el52.2multipath用户态程序依赖库(一)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以命令执行为入口,一步步分析代码流程: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等struct vector *mpvec; # 存储聚合后的多路径信息,如dm-0、dm-1等}2.3.3主函数调用流程执行main -> configure -> path_discovery、coalesce_paths2.3.3.1path_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信息2.3.3.2coalesce_paths(聚合路径)函数流程仍然是遍历vecs->pathvec中所有路径,将path.size 和path.wwid相同的路径聚合为一条多路径,最终调用domap(ACT_CREATE)创建一条多路径,并填充到结构体vecs->mpvec中2.3.3.3domap函数流程domap 参数主要有创建ACT_CREATE、重新生成多路径ACT_RELOAD、切换路径ACT_SWITCHPG、多路径重命名ACT_RENAME根据参数不同,调用如下函数:domap(ACT_CREATE) -> dm_addmap -> dm_task_run (在libdevmapper.so.1.02库中) ->2.3.3.4dm_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.5dm_task_run函数流程内核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_DEVICE_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, {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}},{"mknodes", 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_and_load_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,2.3.3.7_do_dm_ioctl 函数流程1)首先调用_flatten函数将struct dm_task *dmt展开,将信息填入struct dm_ioctl*dmi 中,struct dm_ioctl结构体看起来很小,其实结构体后面还有很大的一块规定格式的大空间,_flatten函数是个格式编码函数2)调用ioctl,发送dmi到内核,内核将dmi反向解码,最终执行相应命令2.3.3.8内核层面<drivers/md/dm-ioctl.c> dm_ctl_ioctl 通过调用lookup_ioctl 查找调用dev_create还是table_load,然后调用copy_params将用户层参数struct dm_ioctl __user *user转换为内核结构struct dm_ioctl *param,其实就是_flatten函数的逆过程创建多路径设备:dev_create -> alloc_dev 最终调用alloc_disk创建真实的磁盘,得到struct mapped_device *md加载设备下的多路径信息:table_load函数:1)首先调用find_device查找到上面创建的md2)然后调用dm_table_create 创建dm_target3)最后调用populate_table -> dm_table_add_target 关联dm_table 和dm_target2.4清除所有多路径信息>>>multipath -F2.4.1命令执行概要获得所有多路径列表,然后依次删掉这些多路径2.4.1.1主函数执行流程main -> dm_flush_maps2.4.1.2dm_flush_maps函数流程1)创建一个struct dm_task *dmt = dm_task_create(DM_DEVICE_LIST)2)dm_task_set_name(多路径别名)3)dm_task_add_target() : 将多路径参数按格式填入4)dm_task_run() : 最终调用ioctl发往内核5)dm_task_get_names() : 获得从内核返回的多路径列表6)依次调用dm_flush_map删掉这些多路径7)dm_task_destroy()2.4.1.3dm_flush_map函数流程1)dm_map_present :检测多路径是否存在2)dm_type3)dm_remove_partmaps4)dm_get_opencount :如果多路径正在使用,则报错mpath0:map in use5)dm_simplecmd(DM_DEVICE_REMOVE) : 真正删掉一条多路径注:这些函数的实现都dm_task_create 、dm_task_set_name 、dm_task_run 、dm_task_destroy3multipathd程序流程multipathd可以有两种执行方式:前台调试、后台服务1)前台调试:multipathd–d –v 6(其中-v为日志等级,6为最高,即打印所有日志)2)后台服务:multipathd或者/etc/init.d/multipathd start这种执行方式,最终都会调用一个名为child的函数,main主流程如下:1.1.checkloop线程2.1.1. 路径状态checkloop线程主要是个while (1) 无限循环函数,根据checker模块提供的路径变动信息,向内核通知路径状态,路径状态有如下几种:PATH_UNCHECKED: checker方法获取失败,或checker_init调用失败返回PATH_WILD:sysfs接口查询设备及状态失败时返回PATH_PENDING:从sysfs获取的设备状态是blockedPATH_DOWN:从sysfs获取的设备状态是offline,或通过checker方法检查返回。
MPIO使用说明1.划分存储需要熟悉相关存储的配置,以下是一个简单配置实例:使用到的存储是Inspur AS1000,没有通过交换机与服务器用光纤线直连,如下图所示:下面开始对存储进行设置:在PC上安装存储管理软件storage manager,将PC与存储用网线连接(比如插入1口),在管理软件中设置端口IP,默认情况是:1口:192.168.128.1012口:192.168.129.1013口:192.168.128.1024口:192.168.129.102之前PC的网络也应设置在此网段上才能连通。
在管理软件中选取5个磁盘建立一个raid5阵列取名lb,大小为200G,LUN号为0。
由于采用双HBA卡,故建立一个Host,下面再建立两个HBA port,最后将此LUN与Host相关联,也即将LUN分配给主机。
自此,存储划分完毕。
在系统中fdisk –l可以看到除了本地硬盘外新增加了两个disk:/dev/sdb和/dev/sdd。
实际上这2个设备对应的是同一个LUN,只是通过不同的路径看到的。
[root@ tsjs4 ~]# fdisk -l…Disk /dev/sdb: 200 GB, 200000912000 bytes255 heads, 63 sectors/track, 65270 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDisk /dev/sdb doesn't contain a valid partition tableDisk /dev/sdd: 200 GB, 200000912000 bytes255 heads, 63 sectors/track, 65270 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDisk /dev/sdd doesn't contain a valid partition table注意:配置存储非常关键,对于操作系统而言,多路径其实是指在操作系统里看到多个/dev/下的设备(比如例中的sdb和sdd),但其实他们指向的是存储中的同一个LU。
1、准备服务器驱动光盘和驱动U盘。
-在服务器机箱内。
2、手动加载浪潮驱动lsi2.1、将浪潮驱动光盘和U盘接入PC2.2、双击光驱2.3、点击创建驱动程序2.4、选择OS版本2.5、点击驱动制作2.6、对应实际情况,输入浪潮驱动U盘盘符;2.7、点击OK;2.8、检查是否成功。
3、安装linux3.1、/boot 200M ,swap 和内存一样大, / 剩余全部可用空间3.2、安装包安装市检察院要求安装。
右键全选。
3.3、将linux 5.9安装光盘放入cdrom等待自行加载到安装界面直接输入linuxdd然后按回车键,进入加载驱动盘界面。
切记点击’yes’,然后,会有驱动器列表,/dev/sda、/dev/sdb之类的,不要怕选错,从最后一个开始,选择后有驱动器的分区列表,/dev/sdb1、/dev/sdb2之类的,一个个进去试。
直到找到然后安装即可。
3.4、安装完成后,配置关闭防火墙,关闭selinux4、linux 5.9下,HBA卡驱动安装如果不确定是否安装好驱动,或者确定需要安装驱动,先联系浪潮客服,确定HBA卡型号!!以QlogicQLE2672为例4.1、检查系统是否有驱动在终端中输入/sbin/modinfo qla2xxx|head如果返回结果如上,则驱动已经有了。
因为不同HBA卡,和不同驱动版本问题,还有lsmod|grepqlelsmod|grepqla等方法。
可以逐一验证!4.2、安装驱动新装服务器的HBA卡,如果是Qlogic的可以到他的官网/pages/default.aspx选择对应型号和系统版本来搜索下载。
选择对应型号和系统版本来搜索下载。
4.3、比如QLE2672/QLogicDriverDownloads_UI/SearchProductPreviousRelea se.aspx?ProductCategory=39&Product=1179&Os=65&ResourceCategory=Drivers&grid=1找到对应系统版本驱动。
Linux 内核中的 Device Mapper 机制简介:本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。
Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基于该机制实现的。
理解该机制是进一步分析、理解这些卷管理器的实现及设计的基础。
通过本文也可以进一步理解Linux 系统块一级 IO的设计和实现。
Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1。
图1 Device Mapper的内核体系架构在内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath 表示的就是这些 target driver。
Device mapper 进一步体现了在Linux 内核设计中策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。
Device mapper 用户空间相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等等,而具体过滤和重定向 IO 请求的工作由内核中相关代码完成。
Device Mapper Multipath配置指导书华为技术有限公司版权所有侵权必究Device Mapper Multipath配置指导书文档密级:内部公开修订记录目录目录 (1)前言 (3)1检查系统DM-Multipath (4)1.1检查DM-Multipath是否正确安装 (4)1.2查看DM-Multipath版本 (5)1.3检查DM-Multipath配置文件 (5)1.4检查DM-Multipath服务multipathd是否开机启动 (5)2修改DM-Multipath配置 (6)2.1修改multipath.conf文件 (6)2.1.1 CentOS 6.3 对接阵列S5800T 配置 (7)2.1.2 NeoKylin Advance Linux Server V5.6 对接阵列18500配置 (8)2.2 FAQ (9)2.2.1如何获取阵列vendor及product (9)2.2.2 DM-Multipath可用的磁盘在哪里 (9)3注意事项 (11)3.1集群应用 (11)3.2 DM-Multipath与UltraPath共存 (11)3.3设备屏蔽 (11)3.4驱动超时参数 (11)3.4.1 FC驱动 (11)3.4.2 ISCSI驱动 (12)附录A DM-Multipath盘符绑定 (13)附录B DM-Multipath磁盘屏蔽 (14)附录C 常用命令 (16)关键词:Device Mapper Multipath、配置摘要:本指导书是针对Linux系统自带多路径Device Mapper Multipath对接我司阵列,配置操作过程中需要的步骤、注意事项等提供的指导,本指导书描述了Multipath配置过程及注意事项。
缩略语清单:DM-Multipath(Device Mapper Multipath ):Linux系统自带多路径LUN(Logical Unit Number): 逻辑单元号ALUA(Asymmetric Logical Unit Access):非对称逻辑单元IALUA(Implicit Asymmetric Logical Unit Access):隐式ALUAEALUA(Explicit Asymmetric Logical Unit Access):显式ALUA参考资料清单:无。
前言对于以下系统,可参照Red Hat系统进行处理。
●Oracle Linux●Oracle VM Server●Asianux●Rocky 4Rocky 4.2.40 系统自带DM-Multipath配置说明见3.6小节。
●Kylin(NeoKylin)●XenServer●CentOS●Fedora●Scientific Linux对于以下系统,可参照Debian系统进行处理。
●Ubuntu●Rocky 6对于以下系统,可参考SUSE系统进行处理。
●UVP1 检查系统DM-Multipath1.1 检查DM-Multipath是否正确安装执行rpm -qa | grep device-mapper命令。
查看系统是否安装或者装全DM-Multipath,特别关注multipath相关项。
注:对于debian系统,使用deb安装包。
执行dpkg -l | grep multipath命令查询DM-Multipath是否正确安装。
例如,ubuntu的DM-Multipath包为multipath-tools。
若系统为SAN引导方式,要需要multipath-tools-boot包。
如图1-1所示,系统(Red Hat 6.3)正确安装Device Mapper时,会有多个rpm包被安装到系统中,其中与Multipath相关的有两个(如图中红框内容)。
如果没有安装,或者安装不全,须先从系统安装源获取rpm安装包,进行DM-Multipath的安装。
图1-1 Red Hat 6.3 DM-Multipath注1:不同版本会有差异,以系统发布版本的实际情况为准。
例如,Red Hat 5.7系统DM-Multipath的rpm包,如图1-2所示。
图1-2 Red Hat 5.7 DM-Multipath注2:SuSE系统multipath相关rpm包是multipath-tools-*.rpm。
例如,SuSE11SP1系统DM-Multipath的rpm包,如图1-3所示。
图1-3 SuSE11SP1 DM-Multipath1.2 查看DM-Multipath版本如1-1小节示例,图1-1中Red Hat 6.3系统中DM-Multipath版本是0.4.9;图1-2中Red Hat 5.7系统中DM-Multipath版本是0.4.7;图1-3中SuSE11SP1系统中DM-Multipath版本是0.4.8。
1.3 检查DM-Multipath配置文件查看系统中/etc/multipath.conf文件是否存在。
如果不存在,将/usr/share/doc/device-mapper-multipath-*/multipath.conf (Red Hat 6.3)或/usr/share/doc/device-mapper-multipath-*/multipath.conf.synthetic (Red Hat 5.7)或/usr/share/doc/packages/multipath-tools/multipath.conf.synthetic (SuSE11SP1)或/usr/share/doc/multipath-tools/examples/multipath.conf.synthetic (ubuntu 11.04)文件拷贝一份,文件命名为multipath.conf放置于/etc/目录下。
注:上述加粗部分“*”表示相应DM-Multipath版本。
有些版本提供mpathconf 命令,可以使用mpathconf --enable 命令来创建配置文件。
1.4 检查DM-Multipath服务multipathd是否开机启动执行chkconfig –list multipathd命令,查看multipathd服务是否开机启动。
Red Hat 6.3系统查询结果如图1-4所示。
图1-4 Red Hat 6.3查询结果若multipathd在需要的启动级别未配置开机启动,执行chkconfig --level 35 multipathd on命令,设置multipathd服务开机启动。
注:上述加粗的“35”表示系统启动级别3和5。
2 修改DM-Multipath配置2.1 修改multipath.conf文件1)执行vi /etc/multipath.conf打开配置文件,在文件的devices {}配置项中添加阵列相应配置。
具体配置内容见本小节后续内容。
Red Hat 6.3系统对接S5500T阵列的示例配置,如图2-1所示。
图2-1 Red Hat 6.3对接S5500T阵列DM-Multipath配置基本配置项说明:1. vendor 与product 阵列信息,阵列相关;2. path_grouping_policy 是路径分组策略配置,策略相关;3. getuid_callout 获取lun wwn方法,系统相关;4. path_checker 路径检查方法,策略相关;5. prio(或prio_callout) 获取路径优先级方法,版本、策略相关;6. path_selector 选路方法,策略相关;7. failback failback配置,策略相关;8. dev_loss_tmo fc超时配置,策略相关(dm-multipath低版本不支持);注意:具体配置的说明,可参考随机文档multipath.conf.annotated确保multipath.conf配置文件中,blacklist{}配置项没有设置对阵列的屏蔽。
例如,在Red Hat 5.7系统中,multipath.conf配置文件中,默认进行了如图2-2所示配置,屏蔽了所有的devnode。
需要将屏蔽设置注释掉,或者在blacklist_exceptions{}配置项中设置屏蔽例外。
图2-2 Red Hat 5.7 DM-Multipath默认配置2)配置修改完毕后,依次执行multipath –Fservice multipathd reloadmultipath –v2命令,使配置生效。
注1:/etc/multipath.conf文件修改后,需要执行service multipathd reload命令重新加载配置,否则更改不生效。
注2:debian系统重新加载multipathd 参数的命令为service multipath-tools reload。
注3:若servie multipathd rload 命令执行失败,请根据回显提示操作。
或使用multipathd reconfigure 命令更新配置。
3)执行multipath –ll命令,查看修改效果。
Red Hat 6.3系统对接S5500T阵列示例中,如图2-1的配置,查询结果如图2-3所示。
可以观察,阵列映射给主机有3个LUN,每个LUN有2条路径,每条路径通过alua获取到了不同的优先级。
例如:虚拟LUN mpatha,两条路径的物理LUN是sdb、sdd,路径优先级分别是50、10。
图2-3 Red Hat 6.3对接S5500T阵列DM-Multipath查询路径信息2.1.1 CentOS 6.3 对接阵列S5800T 配置隐式ALUA配置:## HUAWEI:S5800T IALUA#device {vendor "HUAWEI "product "S5800T"path_grouping_policy group_by_priogetuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"path_checker turprio aluapath_selector "round-robin 0"failback immediate}注:1. 本配置仅用于CentOS 6.3系统对接S5800T阵列2. 由于阵列与DM-Multipath对接,使用了IALUA配置,故须手动在阵列侧开启ALUA配置(非默认配置)。
操作方法:在ISM界面上,对相应启动器配置ALUA。
详细说明,参见阵列ISM使用手册。