RHEL ENTERPRISE 6.4多路径软件multi-path 配置操作手册

目录

一、什么是多路 ................................................................................................................. 1

      1.1 多路径的主要功能 ....................................................................................................... 1

      1.2 UUID的作用及意义 ..................................................................................................... 2

二、Linuxmultipath介绍 ................................................................................................... 2

      2.1 查看multipath是否安装 ............................................................................................. 2

      2.2 Linuxmultipath需要以下工具包介绍 ................................................................... 2

三、multipathRedhat中的基本配置过程 ........................................................................ 3

      3.1 安装和加载多路径软件包 ........................................................................................... 3

      3.2 设置开机启动 ........................................................................................................... 4

      3.3 生成multipath配置文件 ............................................................................................. 4

四、multipath 高级配置 ......................................................................................................... 4

      4.1 获取存储设备的UUID/wwid和路径 .......................................................................... 5

      4.2 配置/etc/multipath.conf 文件例子 ............................................................................. 5

      4.3 关于:scsi_id .......................................................................................................... 8

五、multipath 基本命令 ....................................................................................................... 8

六、multipath.conf配置文件说明 .......................................................................................... 9

七、multipath磁盘的基本操作 ....................................................................................... 10

八、使用multipath的一个例子 ........................................................................................... 12

九、PV/VG/LV常用操作命令 ................................................................................................ 12

十、使用udev配置固定iSCSI磁盘设备名称 ..................................................................... 16

 

一、 什么是多路径

      普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系。

      也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择。每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个实际存在的物理盘,但实际上只是通向同一个物理盘的不同路径而已,这样是在使用的时候,就给用户带来了困惑。多路径软件就是为了解决上面的问题应运而生的。

      另外在linux中,同样的设备在重新插拔、系统重启等情况下,自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序,就有可能导致设备名分配不一致。

 

1.1 多路径的主要功能

多路径的主要功能就是和存储设备一起配合实现如下功能:

1.故障的切换和恢复

2.IO流量的负载均衡

3.磁盘的虚拟化 

      由于多路径软件是需要和存储在一起配合使用的,不同的厂商基于不同的操作系统,都提供了不同的版本。并且有的厂商,软件和硬件也不是一起卖的,如果要使用多路径软件的话,可能还需要向厂商购买license才行。

      比如EMC公司基于linux下的多路径软件,就需要单独的购买license。好在, RedHatSuse2.6的内核中都自带了免费的多路径软件包,并且可以免费使用,同时也是一个比较通用的包,可以支持大多数存储厂商的设备,即使是一些不是出名的厂商,通过对配置文件进行稍作修改,也是可以支持并运行的很好的。

 

1.2 UUID的作用及意义

原因1:它是真正的唯一标志符

       UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题。   

原因2:设备名并非总是不变的

      自动分配的设备名称并非总是一致的,它们依赖于启动时内核加载模块的顺序。如果你在插入了USB盘时启动了系统,而下次启动时又把它拔掉了,就有可能导致设备名分配不一致。如何让它保持在任何系统中的标识,那就是UUID唯一性标识。

 

二、 Linuxmultipath介绍

2.1 查看multipath是否安装

查看multipath是否安装如下:

[root@testvm1 disk]# rpm -qa |grep device-mapper

device-mapper-event-libs-1.02.74-10.el6.x86_64

device-mapper-multipath-libs-0.4.9-56.el6.x86_64

device-mapper-event-1.02.74-10.el6.x86_64

device-mapper-1.02.74-10.el6.x86_64

device-mapper-libs-1.02.74-10.el6.x86_64

device-mapper-multipath-0.4.9-56.el6.x86_64

 

2.2 Linuxmultipath需要以下工具包介绍

1device-mapper-multipath:即multipath-tools

      主要提供multipathdmultipath等工具和 multipath.conf等配置文件。这些工具通过device mapperioctr的接口创建和配置multipath设备(调用device-mapper的用户空间库。创建的多路径设备会在/dev/mapper中)。

 

2 device-mapper

主要包括两大部分:内核部分和用户部分。

      内核部分主要有device mapper核心(dm.ko)和一些target drivermd-multipath.ko)。

核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。同时,在核心部分,提供了一个接口,用户通过ioctr可和内核部分通信,以指导内核驱动的行为,比如如何创建mappered device,这些divece的属性等。

       用户空间部分主要包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。这些库主要抽象、封装了与ioctr通信的接口,以便方便创建和配置mappered devicemultipath-tool的程序中就需要调用这些库。

 

3dm-multipath.kodm.ko

       dm.kodevice mapper驱动。它是实现multipath的基础。dm-multipath其实是dm的一个target驱动。

 

4scsi_id

      包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径对应了同一设备。这个是多路径实现的关键。

      scsi_id是通过sg驱动,向设备发送EVPD page80page83 inquery命令来查询scsi设备的标识。但一些设备并不支持EVPD inquery命令,所以他们无法被用来生成               multipath设备。但可以改写scsi_id,为不能提供scsi设备标识的设备虚拟一个标识符,并  输出到标准输出。

      multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该直来确定scsi id是否已经成功得到。

 

三、 multipathRedhat中的基本配置过程

3.1 安装和加载多路径软件包

# rpm -ivh device-mapper-1.02.39-1.el5.rpm    #安装映射包

# rpm -ivh device-mapper-multipath-0.4.7-34.el5.rpm  #安装多路径包

或者使用yum进行安装

# yum -y install device-mapper-multipath-libs.x86_64 

# yum -y isntall device-mapper-multipath.x86_64

 

3.2 设置开机启动

#是否开机自启动

[root@testvm1 dev]# chkconfig --list|grep multipathd

multipathd      0:off   1:off   2:off   3:off   4:off   5:off   6:off

# chkconfig --level 2345 multipathd on          #设置成开机自启动multipathd

# modprobe -l |grep multipath   #来检查安装是否正常,内核中是否存在

kernel/drivers/md/dm-multipath.ko

至此进行了安装并设置了开机启动,但是multipath服务现在还没有启动,如果启动两种办法:

一、重启启动系统 reboot  ,开机自动载入内核并启动服务。

二、手工加载

# modprobe dm-multipath        #加载到内核 #modprobe dm-round-robin

# service multipathd start        #重启服务

 

3.3 生成multipath配置文件

/sbin/mpatchconf  --enable生成multipath.conf 

[root@testvm2 ~]# /sbin/mpatchconf  --enable

[root@testvm2 ~]# ls /etc/multipath.conf /etc/multipath.conf

(也可以按上面提示将/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf文件复制到/etc)

 

四、 multipath 高级配置

       除了可以multipath命令来的默认配置multipath,比如映射设备的名称、multipath负载均衡。

也可以按照我们自己定义的方法来配置multipath
首先,需要获取uuid

4.1 获取存储设备的UUID/wwid和路径

通过/sbin/scsi_id -g -u -s /block/sdf 获取uuid/wwid

通过 multipath -v3 命令查看, 注意,会默认生成设备的路径。

multipath -v3

编辑/etc/fstab

# vim /etc/fstab

/dev/vg1/lv1 /data1 ext3    _netdev,defaults  0 0

如果需要修改LV的名字,则只要简单的做以下操作:        

# umount /dev/vg01/lvol1

# mv /dev/vg01/lvol1 /dev/vg01/lvdata        

# mv /dev/vg01/rlvol1 /dev/vg01/rlvdata        

# mount /dev/vg01/lvdata   

修改PV

      有关PV的参数选项中,有一个是最常用的:-t,它是LVM对硬盘相应所等待的时间(timeout值),默认的值是30秒。可以用一下命令修改成120秒的timeout值:

# pvchange -t 120 /dev/dsk/cXtXdX


如果要去掉
timeout,可以用以下命令: 

# pvchange -t 0 /dev/dsk/cXtXdX   

 

修改VG

        vgchange命令可以用来激活/不激活VG其中max_pe这个参数只能在VG创建的时候指定,默认的PE数是1016。由于默认的pe_size的大小是4M,而如果采用默认的max_pe的话,我们只能使用到4G的空间。这在动辄上百G的硬盘时代,这些默认值肯定不符合需求了。除了在创建PV的时候指定pe_size更大以外(但这有个缺点,就是容易造成空间的浪费),还能够在创建VG的时候指定max_pe,虽然默认值是1016,但是实际上,LVM会根据硬盘的实际大小和pe_size来决定max_pe——不过这又引起另外一个问题,例如:我们现在使用的硬盘是36G,而后来空间不够,我们又加了一个72G的硬盘,这个时候,由于在创建VG的时候,max_pe已经固定了,这可能就会导致空间的浪费。我们可以根据数据的增量,来考虑设定max_pe的值。而max_pe的值,可以在1——65535之间。

为了修改VG的名字,我们可以有两个办法来实现:

(即系统默认仅vg00是加了tag的,其他vg要激活必须手动在某一节点上加tag来激活卷)

修改名字要保证vg是激活

# vgchange --addtag tagname emcvg02 (加tag)

# vgchange -ay emcvg02 (激活卷)

改名过程:

lv

(此文件系统需umount状态)

# lvchange -an /dev/newvg2/newlv2 (去激活才能改名)

# lvrename /dev/vg2/lv2 /dev/newvg2/newlv2

vg

# vgrename emcvg02 newvgname

激活newlv2

# lvchange  -ay /dev/newvg2/newlv2

注意:

       如果使用multipath进行设备多路径绑定,有部分multipath版本存在与lvm兼容的问题。当使用device-mapper设备创建lvm完成,重启后,虽然lvm仍存在,但/dev/mapper下的设备丢失。可以参考:https://bugs.launchpad.net/ubuntu/+source/multipath-tools/+bug/230006

解决方法:

/etc/lvm/lvm.conf文件中加入:

types=["device-mapper", 1]

 

十、 使用udev配置固定iSCSI磁盘设备名称

       相同名称的设备文件在不同的系统中可能对应的是不同的磁盘。以下展示了一个实例,挂载到本地服务器的设备名称都是/dev/sdd,但对应的却不是同一个iSCSI磁盘。

 

节点1通过执行fdisk -l查看到的/dev/sdd设备文件大小情况如下:

         1. Disk /dev/sdd: 5502 MB, 5502926848 bytes  

         2. 170 heads, 62 sectors/track, 1019 cylinders  

         3. Units = cylinders of 10540 * 512 = 5396480 bytes

节点1/dev/sdd设备文件对应的LUN大小为5502MB

节点2通过执行fdisk -l查看到的/dev/sdd设备文件大小情况如下:

         1. Disk /dev/sdd: 1073 MB, 1073741824 bytes  

         2. 34 heads, 61 sectors/track, 1011 cylinders  

         3. Units = cylinders of 2074 * 512 = 1061888 bytes

       节点2/dev/sdd设备文件对应的LUN大小为1073MB。显然,两个节点/dev/sdd对应的并不是同一个设备。

       如果在环境中使用/dev/sd*的设备文件来管理和使用存储,而相同名称的设备文件对应的iSCSI磁盘却是不同的,这样就会导致操作的失败。例如,在第一个节点将分区/dev/sdd1格式化成OCFS2挂载到某个节点,在第二个节点执行同样的挂载命令就会失败,因为第二个节点的/dev/sdd1分区和第一个节点并不是同一个分区,即使挂载成功也不是相同的共享存储。

       Linux平台为了解决这个问题,使两个节点的设备文件都能相互对应,需要使用udev动态设备文件管理工具。它是一个默认安装并在系统启动时最先加载的工具,使用它能配置相应的设备加载规则,udev通过定义的规则来生成相应的设备文件。在指定规则下能够使用磁盘唯一标识的属性作为生成设备文件名称的一部分,就能在不同的节点保证相同名称的设备文件指向相同的iSCSI磁盘。

 

下面举例说明udev的配置方法。

       udev的配置主目录是/etc/udev,包含以下文件和目录:

udev.conf文件。这是udev输出日志的配置文件,默认的配置是:udev_log=“err”udev_log还可以被配置为infodebug。一般默认即可,如果修改为infodebug将有大量的日志信息被输出。

 

rules.d目录。此目录是最重要的配置目录,里面包含的都是配置的udev加载规则,udev会根据配置的规则来生成相应的设备文件。所有的规则文件都必须以“.rules”作为扩展名。

 

scripts目录。此目录保存着加载规则需要执行的脚本。

 

/etc/udev/rules.d目录下创建55-openiscsi.rules规则文件,将以下内容保存到文件中:

# /etc/udev/rules.d/55-openiscsi.rules

KERNEL=="sd*",BUS=="scsi",PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"

 

       以上规则的含义是:为设备名以“sd”开头、设备的总线类型为scsi的设备创建链接文件。

       PROGRAM参数包含的是一条命令,SYMLINK中的%c代表的是PROGRAM命令的输出结果

       SYMLINK参数表示链接文件存储的位置以及文件名,链接文件存放在/dev/iscsi/目录,文件名是part,由于所有的设备文件都存放在/dev/目录下,所以在这个设置前面没有指定/dev目录。

下面是PROGRAM中指定的iscsidev.sh脚本。

#!/bin/sh

# FILE: /etc/udev/scripts/iscsidev.sh BUS=${1} HOST=${BUS%%:*}

[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname" target_name=$(cat ${file})

# This is not an open-scsi drive

if [ -z "${target_name}" ]; then   

         exit 1

fi

echo "${target_name##*.}"

       以上脚本的含义是将表2-6iSCSI Target IQN的最后一个小数点之后的名称提取出来,作为udev创建链接文件的目录。由于iSCSI Target的名称是唯一的,通过这种方式就能使所有节点通过udev新创建的链接文件指向相同的iSCSI磁盘。

 

将刚才创建的shell脚本修改为可执行文件:

# chmod 755 /etc/udev/scripts/iscsidev.sh

       相应的配置工作结束之后,需要重启服务器链接文件才能生成。其实,配置udev和在生产环境中安装多路径软件的效果是相同的,都是生成相应设备的链接文件,通过对链接文件的访问实现对设备的访问。重启服务器之后生成如下的文件结构。

[root@rhel1 iscsi]# pwd  /dev/iscsi  

[root@rhel1 iscsi]# tree

.  |-- dbfile1  |   `-- part -> ../../sda      

   |-- dbfile2  |   `-- part -> ../../sdd

   |-- fra1  |   `-- part -> ../../sdb  |-- ocrvdisk1  |   `-- part -> ../../sdf  |-- ocrvdisk2  |   `-- part -> ../../sdc  `-- ocrvdisk3      `-- part -> ../../sde  6 directories, 6 files

 

节点2执行结果:

[root@rhel2 iscsi]# pwd  /dev/iscsi

[root@rhel2 iscsi]# tree  .  |-- dbfile1

|   `-- part -> ../../sdf  |-- dbfile2  |   `-- part -> ../../sdc  |-- fra1  |   `-- part -> ../../sda  |-- ocrvdisk1  |   `-- part -> ../../sde  |-- ocrvdisk2  |   `-- part -> ../../sdb  `-- ocrvdisk3      `-- part -> ../../sdd

      上面的执行结果dbfile1dbfile2fra1ocrvdisk1ocrvdisk2ocrvdisk3表示的是目录,目录下面的part才是链接文件,链接文件对应的sd*就是链接对象。两个节点相同路径的链接文件对应的设备文件名不是完全相同的,但它们对应的共享磁盘确是完全一致的,不同节点对相同链接文件的访问能够确保访问的是相同的共享存储。

 

      链接文件是新生成的,并没有改动原有的以“sd”开头的设备文件,所以不同节点的/dev目录下以“sd”开头的设备文件依然不能正确地对应iSCSI磁盘。RHEL_ENTERPRISE_6.docx

请使用浏览器的分享功能分享到微信等