zoukankan      html  css  js  c++  java
  • device-mapper: multipath: Failing path recovery【转载】

     

     
    digoal 2016-04-05 10:09:42 浏览180 评论0

    摘要: 由于扇区损坏导致多路径设备failed. 现象如下 :  # dmesg : device-mapper: multipath: Failing path 8:128. qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detecte...

    由于扇区损坏导致多路径设备failed.
    现象如下 : 
    # dmesg : 
    device-mapper: multipath: Failing path 8:128.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    qla2xxx 0000:07:00.1: scsi(1:0:0:1): Mid-layer underflow detected (40000 of 40000 bytes)...returning error status.
    sd 1:0:0:1: SCSI error: return code = 0x00070000
    end_request: I/O error, dev sda, sector 3870947799
    device-mapper: multipath: Failing path 8:0.
    sd 0:0:0:1: SCSI error: return code = 0x08000002
    sdi: Current: sense key: Medium Error
        Add. Sense: Unrecovered read error
    
    Info fld=0x0
    end_request: I/O error, dev sdi, sector 3870947799

    # multipath -ll
    msa2vd01vol01 (3600c0ff000xxxxxxf810394c01000000) dm-0 HP,MSA2312fc
    [size=1.8T][features=1 queue_if_no_path][hwhandler=0][rw]
    \_ round-robin 0 [prio=50][enabled]
     \_ 0:0:0:1 sdi 8:128 [failed][ready]
    \_ round-robin 0 [prio=10][enabled]
     \_ 1:0:0:1 sda 8:0   [failed][ready]


    扇区损坏可能是前段时间存储故障, 以及存储的volume write back缓存机制导致的.
    修复先要将多路径设备搞好 : 
    echo 1 > /sys/block/sda/device/delete
    echo 1 > /sys/block/sdi/device/delete
    echo "- - -" > /sys/class/scsi_host/${HBA}/scan, 如下
    echo "- - -" > /sys/class/scsi_host/host0/scan
    echo "- - -" > /sys/class/scsi_host/host1/scan

    # multipath -v2
    : checker msg is "readsector0 checker reports path is down"
    reload: msa2vd01vol01 (3600c0ff000xxxxxxf810394c01000000)  HP,MSA2312fc
    [size=1.8T][features=0][hwhandler=0][n/a]
    \_ round-robin 0 [prio=50][undef]
     \_ 0:0:0:1 sda 8:0   [undef][ready]
    \_ round-robin 0 [prio=10][undef]
     \_ 1:0:0:1 sde 8:64  [undef][ready]

    dmesg : 
      Vendor: HP        Model: MSA2312fc         Rev: M112
      Type:   Direct-Access                      ANSI SCSI revision: 05
    SCSI device sda: 3902343744 512-byte hdwr sectors (1998000 MB)
    sda: Write Protect is off
    sda: Mode Sense: 93 00 00 08
    SCSI device sda: drive cache: write back
    SCSI device sda: 3902343744 512-byte hdwr sectors (1998000 MB)
    sda: Write Protect is off
    sda: Mode Sense: 93 00 00 08
    SCSI device sda: drive cache: write back
     sda: sda1
    sd 0:0:0:1: Attached scsi disk sda
    sd 0:0:0:1: Attached scsi generic sg1 type 0
      Vendor: HP        Model: MSA2312fc         Rev: M112
      Type:   Direct-Access                      ANSI SCSI revision: 05
    SCSI device sde: 3902343744 512-byte hdwr sectors (1998000 MB)
    sde: Write Protect is off
    sde: Mode Sense: 93 00 00 08
    SCSI device sde: drive cache: write back
    SCSI device sde: 3902343744 512-byte hdwr sectors (1998000 MB)
    sde: Write Protect is off
    sde: Mode Sense: 93 00 00 08
    SCSI device sde: drive cache: write back
     sde: sde1
    sd 1:0:0:1: Attached scsi disk sde
    sd 1:0:0:1: Attached scsi generic sg6 type 0


    # multipath -ll
    msa2vd01vol01 (3600c0ff000xxxxxxf810394c01000000) dm-0 HP,MSA2312fc
    [size=1.8T][features=1 queue_if_no_path][hwhandler=0][rw]
    \_ round-robin 0 [prio=50][enabled]
     \_ 0:0:0:1 sda 8:0   [active][ready]
    \_ round-robin 0 [prio=10][enabled]
     \_ 1:0:0:1 sde 8:64  [active][ready]

    umount 挂载点.
    然后使用fsck修复.
    fsck -v -p /dev/mapper/msa2vd01vol01p1

    查看文件系统信息 : 
    dumpe2fs /dev/mapper/msa2vd01vol01p1 >~/dumpe2fs.log
    Filesystem volume name:   <none>
    Last mounted on:          <not available>
    Filesystem UUID:          63d08b38-6214-4a28-8f3e-0b8fd9c1734e
    Filesystem magic number:  0xEF53
    Filesystem revision #:    1 (dynamic)
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
    Default mount options:    (none)
    Filesystem state:         clean
    Errors behavior:          Continue
    Filesystem OS type:       Linux
    Inode count:              243908608
    Block count:              487791627
    Reserved block count:     24389581
    Free blocks:              117876429
    Free inodes:              243257871
    First block:              0
    Block size:               4096
    Fragment size:            4096
    Reserved GDT blocks:      907
    Blocks per group:         32768
    Fragments per group:      32768
    Inodes per group:         16384
    Inode blocks per group:   512
    Filesystem created:       Wed Jul 21 19:10:23 2010
    Last mount time:          Tue May 14 07:38:24 2013
    Last write time:          Tue May 14 07:38:24 2013
    Mount count:              1
    Maximum mount count:      36
    Last checked:             Mon May 13 22:19:35 2013
    Check interval:           15552000 (6 months)
    Next check after:         Sat Nov  9 22:19:35 2013
    Reserved blocks uid:      0 (user root)
    Reserved blocks gid:      0 (group root)
    First inode:              11
    Inode size:               128
    Journal inode:            8
    Default directory hash:   tea

    计算扇区对应的数据块id : 
    blocksize=4096, 扇区大小为512字节, 所以扇区号为3870947799对应的blockid=3870947799/8=483868474.875
    找dumpe2fs.log, 看看这个blockid是在哪个group中.
    Group 14766: (Blocks 483852288-483885055)
      Block bitmap at 483852288 (+0), Inode bitmap at 483852289 (+1)
      Inode table at 483852290-483852801 (+2)
      1027 free blocks, 16384 free inodes, 0 directories
      Free blocks: 483855860-483856886
      Free inodes: 241926145-241942528


    使用badblocks检查坏块.
    badblocks -v -b 4096 -o ./badblocks.20130514 /dev/sda 483868480 483868460

    定位到坏块为483868476
    # cat badblocks.20130514
    483868476

    接下来是修复 : 
    # dd if=/dev/sda of=./badblock483868476.data bs=4096 skip=483868476 count=1
    dd: reading `/dev/sda': Input/output error
    0+0 records in
    0+0 records out
    0 bytes (0 B) copied, 0.003665 seconds, 0.0 kB/s

    如果读出数据来了, 那么可以将数据回写进行修复.
    dd if=./badblock483868476.data of=/dev/sda seek=483868476 bs=4096 count=1


    多遍尝试后如果数据无法读取, 则可以采用覆写的方法修复. 直接放弃这个数据块.
    badblocks -f -v -w -b 4096 /dev/sda 483868477 483868476
    /dev/sda is apparently in use by the system; badblocks forced anyway.
    Checking for bad blocks in read-write mode
    From block 483868476 to 483868477
    Testing with pattern 0xaa: done                                
    Reading and comparing: done                                
    Testing with pattern 0x55: done                                
    Reading and comparing: done                                
    Testing with pattern 0xff: done                                
    Reading and comparing: done                                
    Testing with pattern 0x00: done                                
    Reading and comparing: done                                
    Pass completed, 0 bad blocks found.

    再次检测已无坏块 : 
    # badblocks -v -b 4096 /dev/sda 483868480 483868460
    Checking blocks 483868460 to 483868480
    Checking for bad blocks (read-only test): done                                
    Pass completed, 0 bad blocks found.


    # 接下来是将数据库中的这部分数据重建. 
    如果是PostgreSQL 可以使用
    ZERO_DAMAGED_PAGES = true

    将数据读出后重新写入. 
    如果是greenplum, 并且是压缩表的话, 可能会有解压错误, 所以建议重新抽取数据.
    ERROR:  ZLIB uncompress failed (detail: 'The compressed data was corrupted', output buffer length 32568, compressed length 12136, (block count 3651)) (gp_compress.c:355)  (seg4 slice1 dw-host37-if2:51001 pid=5024)


    【参考】 4. dumpe2fs
    5. tune2fs
    6. fsck
    7. e2fsck
    8. badblocks
    9. mkfs.ext3时可以忽略badblocks检测到的坏扇区.
     
    [其他摘录]
    现在的硬盘,在内部会有一保留区域,来替换出现坏块的扇区,这对于磁盘外的系统来说是透明的,
    如果已经存在了坏道,硬盘会在写入的时候将它替换到别的位置, 注意, 只有在写入的时候,才进行重定位。
    我們完全不必要使用上层的文件系统的坏道表功能, 只要对坏块位置进行写入,就可以修复了。
     
    使用badblocks 可以查出坏块,然后badblocks本是具有写测试功能,我們只需要用badblocks就可以了,
    因为不用向上层的文件系统提供坏道表, 所以我們在扫描坏道时,不用设置块大小参数(-b),
    首先扫描坏道
    badblocks -b 4096 -o /root/sdb.bad /etc/sdb 
    经过慢长的时间,我們得到了一个文件/root/sdb.bad :
    16435904
    sdb 有1个坏块
    先用dd尽量备份坏块
    dd if=/dev/sdb bs=4096 skip=16435904 of=/tmp/15435904.dat count=1
    如果显示读取字节数是0就多试几次, 不行就可能丢失此块数据, 倒是不用担心,一般不会有太大问题.
    用badblocks的写测试功能,对这些坏块进行重写(注意! -w写测试会覆盖数据):
    badblocks -w -f /dev/sdb5 16435904 16435904
    如果前面的操作有成功的备份/tmp/15435904.dat, 就把它写回:
    dd if=/tmp/15435904.dat of=/dev/sdb seek=15435904 bs=4096 count=1
    其实我們不需要等待badblocks扫描完成, 就可以进行修复。
     
    badblocks是对块设备进行处理, 所以可以实现对挂载中的系统进行处理。
     
    数据比硬盘值钱, 这只可以作为临时措施,出现坏道, 还是应该换硬盘,现在硬盘不贵。
     
    ///badblocks -v /dev/sda  这个是检查硬盘有无坏道/坏扇区的命令//
       硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁 死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个检查坏道位置的工 具。
    一、命令参数
    badblocks使用格式为:
    引用
    badblocks  [  -svwnf  ]  [  -b block-size ] [ -c blocks_at_once ] [ -i
          input_file ] [ -o output_file ] [ -p num_passes ] [ -t test_pattern  ]
          device [ last-block ] [ start-block ]
     
    参数含义是:
    引用
    -b blocksize 
     指定磁盘的区块大小,单位为字节,默认值为“block 4K ”(4K/block)
    -c blocksize 
     每个区块检查的次数,默认是16次
    -f
     强制在一个已经挂载的设备上执行读写或非破坏性的写测试操作
     (我们建议先umount设备,然后再进行坏道检测。仅当/etc/mtab出现误报设备挂载错误的时候可以使用该选项)
    -i file
     跳过已经显示在file文件中的坏道,而不进行检测(可以避免重复检测)
    -o file 
     把检测结果输出到file文件
    -p number
     重复搜寻设备,直到在指定通过次数内都没有找到新的坏块位置,默认次数为0 
    -s
     在检查时显示进度
    -t pattern 
     通过按指定的模式读写来检测区块。你可以指定一个0到ULONG_MAX-1的十进制正值,或使用random(随机)。
     如果你指定多个模式,badblocks将使用第一个模式检测所有的区块,然后再使用下一个模式检测所有的区块。
     Read-only方式仅接受一个模式,它不能接受random模式的。
    -v
     执行时显示详细的信息
    -w
     对每个区块都先写入,然后再从它读取信息
    [device]
     指定要检查的磁盘装置。
    [last-block]
     指定磁盘装置的区块总数。
    [start-block]
     指定要从哪个区块开始检查
     
    二、示例
    badblocks以4096的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里
     
    # badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
     
    hda-badblocks-list”是个文本文件,内容如下:
    引用
    # cat hda-badblocks-list 
    51249 
    51250 
    51251 
    51253 
    51254 
    ……
    61245 
    ……
     
    可以针对可疑的区块多做几次操作。下面,badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中,由第51000 block开始,到63000 block结束
     
    # badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000
     
    这 次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同,其输出的结果也不完全是相同的。重复几次同样的操 作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,直到产生最后的hda-badblock-list.final文件。
     
    三、其他
    1、fsck使用badblocks的信息
    badblocks只会在日志文件中标记出坏道的信息,但若希望在检测磁盘时也能跳过这些坏块不检测,可以使用fsck的-l参数:
    # fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1
     
    2、在创建文件系统前检测坏道
    badblocks可以随e2fsck和mke2fs的-c删除一起运行(对ext3文件系统也一样),在创建文件系统前就先检测坏道信息:
     
    # mkfs.ext3 -c /dev/hda1
     
    代码表示使用-c在创建文件系统前检查坏道的硬盘。
    这 个操作已经很清楚地告知我们可以采用“mkfs.ext3 -c”选项用“read-only”方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相 当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。
     
    转自:

    device-mapper: multipath: Failing path recovery-博客-云栖社区-阿里云
    https://yq.aliyun.com/articles/18067

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/paul8339/p/5782882.html
Copyright © 2011-2022 走看看