Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

Redhat El5如何映射裸设备到逻辑卷

| Comments

之前的版本如何做,这里不做描述,自行 Google。 之前通常的方法,在该版本,KERNEL并不能直接获得设备名称或者主次设备号,我们需要通过dmsetup指令来间接获得。 一下操作的目录均在/etc/udev/rules.d/

  1. 编辑90-dm.rules文件,注释掉下面这行
    KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"

  2. 编辑60-raw.rules文件,加入下面几行:

     KERNEL!="dm-[0-9]*",GOTO="skip_dm"
     PROGRAM!="/sbin/dmsetup  ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
     RESULT=="vg1-lv1", RUN+="/bin/sh -c '/bin/raw /dev/raw/raw1 $MAJOR $MINOR'"
     LABEL=skip_dm
    

    上面第一行代码表示如果不是dm设备,则直接跳到skip_dm处 第二行表示如果后面的指令返回为假(非0值),则跳到skip_dm处。

如果以上条件满足,则来到真正的裸设备映射指令。注意要注意的是RESULT给出的结果是/dev/mapper下的lv名称,而不是大家通过google查询到的一些资料所宣称的mpath1,当然,到底这里结果值是多少,我们下面会通过测试来获得。后面的RUN指令就比较浅白了,直接通过主次设备号来做绑定。

如果还有其他LVM设备需要绑定,依次添加类似行。

但是,但是,如果你有上百个LVM设备需要做裸设备映射呢?难道写上几百行。当然不需要这样,我们可以通过匹配方式来操作,就像下面这样:

    RESULT=="vg1-lv[0-9]*",RUN+="/bin/sh -c '/bin/raw /dev/raw/raw$MINOR $MAJOR $MINOR'"

这里我们通过次设备号来作为裸设备的编号依次映射。
恩,看上去很好,But,这里有个bug,那就是我们无法对raw0这样的设备进行映射,而第一个LV对应的MINOR恰好是0的话(很不幸,大部分情况是这样),那我们该怎么办。简单的办法是每次给MINOR+1来作为裸设备的编号。就像下面这样:

    RESULT=="vg1-lv[0-9]*",RUN+="/bin/sh -c '/bin/raw /dev/raw/raw$((MINOR+1)) $MAJOR $MINOR'"

看上去很美好,很遗憾,我在Asianux 3.0 SP2,Centos 5.4版本上均没有成功。所以我采取了下面折衷的办法:

    KERNEL!="dm-[0-9]*",GOTO="skip_dm"
    PROGRAM!="/sbin/dmsetup ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
    RESULT=="vg1-lv[0-9]*", RUN+="/bin/sh -c 'if [ $MINOR -eq 0 ]; then /bin/raw /dev/raw/raw256 $MAJOR $MINOR; else /bin/raw /dev/raw/raw$MINOR $MAJOR  $MINOR;fi'"
    LABEL=skip_dm

上面的做法是如果次设备号是0的话,我们尽可能把他映射到裸设备编号靠后的设备,这里采取的是256。如果你需要映射的设备操作超过256的话,你知道该怎么办

保存该文件后,执行start_udev,然后执行raw -qa,看看是不是已经绑定了,类似如下:

/dev/raw/raw1:  bound to major 253, minor 1
/dev/raw/raw2:  bound to major 253, minor 2
/dev/raw/raw3:  bound to major 253, minor 3
/dev/raw/raw4:  bound to major 253, minor 4
/dev/raw/raw5:  bound to major 253, minor 5
/dev/raw/raw6:  bound to major 253, minor 6
/dev/raw/raw7:  bound to major 253, minor 7
/dev/raw/raw8:  bound to major 253, minor 8
/dev/raw/raw9:  bound to major 253, minor 9
/dev/raw/raw10: bound to major 253, minor 10
/dev/raw/raw11: bound to major 253, minor 11
/dev/raw/raw12: bound to major 253, minor 12
/dev/raw/raw13: bound to major 253, minor 13
/dev/raw/raw14: bound to major 253, minor 14
/dev/raw/raw15: bound to major 253, minor 15
/dev/raw/raw16: bound to major 253, minor 16
/dev/raw/raw17: bound to major 253, minor 17
/dev/raw/raw18: bound to major 253, minor 18
/dev/raw/raw19: bound to major 253, minor 19
/dev/raw/raw256:    bound to major 253, minor 0

Comments