一次软raid5上面的lvm的恢复过程
2008-11-04    刘世伟   
打印自: 安恒公司
地址: HTTP://honeypot.anheng.com.cn/news/article.php?articleid=1467
未整理


错误状态:
npc:/cangku# cat /proc/mdstat
Personalities :
md0 : inactive sdc5[0](S) sdd5[3](S) sdb5[2](S) sda5[1](S)
43053568 blocks

unused devices: <none>

第一步.先把每个分区的原始信息记录下来:
mdadm -E /dev/sda5 >/root/sda5.txt
mdadm -E /dev/sdb5 >/root/sdb5.txt
mdadm -E /dev/sdc5 >/root/sdc5.txt
mdadm -E /dev/sdd5 >/root/sdd5.txt

从信息里面, 可以找到阵列的meta版本, 和盘的次序,为后面的强制恢复做准备,
如果重组过一次,这些信息就都变了。
比如:

# mdadm -E /dev/sdb5
root@lims:~# mdadm -E /dev/sdb5
/dev/sdb5:
Magic : a92b4efc
Version : 1.2
  /*meta版本1.2*/
Feature Map : 0x0
Array UUID : 37792427:72f50e5b:c12a5c5f:3c6c28be
Name : bak1:1
Creation Time : Thu Jun 13 19:02:06 2013
Raid Level : raid5
Raid Devices : 5 /*一共5个盘*/

Avail Dev Size : 917912045 (437.69 GiB 469.97 GB)
Array Size : 1835823104 (1750.78 GiB 1879.88 GB)
Used Dev Size : 917911552 (437.69 GiB 469.97 GB)
Data Offset : 2048 sectors   /* 这一行很重要  数据在分区上的偏移  数值是扇区,mdadm里面是K,所以要 --data-offset=1024 */
Super Offset : 8 sectors
State : clean
Device UUID : 60eae82d:05ee82fd:b266ad88:8035495f

Update Time : Fri Jun 14 10:01:15 2013  /*最后使用时间*/
Checksum : 9e56f23e - correct
Events : 2

Layout : left-symmetric
Chunk Size : 512K

Device Role : Active device 2    /* 分区顺序 */

Array State : AAA.. ('A' == active, '.' == missing)

==============上面红字部分,是需要注意的地方

npc:/cangku# /etc/init.d/mdadm restart
Stopping MD monitoring service: mdadm --monitor.
Starting MD monitoring service: mdadm --monitor.

npc:/cangku# /etc/init.d/mdadm-raid restart
Stopping MD array md0...done (stopped).
Assembling MD array md0...failed (not enough devices).
Generating udev events for MD arrays...done.

恢复md0运行失败:
npc:/cangku# mdadm --manage -R /dev/md0
mdadm: failed to run array /dev/md0: Input/output error

查看md0详细信息, 有2个硬盘离线:
npc:/cangku# mdadm --misc -D /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Mon Jan  1 08:12:15 2007
Raid Level : raid5
Used Dev Size : 10763392 (10.26 GiB 11.02 GB)
Raid Devices : 4
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Wed Oct 29 19:23:53 2008
State : active, degraded, Not Started
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 64K

UUID : 213d6f53:4c19e916:df285044:5b83b7ec
Events : 0.1481220

Number   Major   Minor   RaidDevice State
0      22        5        0      active sync   /dev/hdc5
1       3        5        1      active sync   /dev/hda5
2       0        0        2 removed
3       0        0        3 removed

把2个硬盘添加回去:。
添加命令:
npc:/cangku# mdadm --manage /dev/md0 -a /dev/sda5
mdadm: re-added /dev/sda5

npc:/cangku# mdadm --manage /dev/md0 -a /dev/hdb5
mdadm: re-added /dev/hdb5

npc:/cangku# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : inactive hdb5[2] sda5[3] hdc5[0] hda5[1]
43053568 blocks

unused devices: <none>

npc:/cangku# mdadm  -R /dev/md0
mdadm: started /dev/md0


如果添加失败, 可以停止md0,然后重新建立, 数据不会丢失。
停止md0:
mdadm -S /dev/md0

重建md0(如果有坏盘,可以用missing代替相应的位置,当然raid5只允许一个missing,一定要排好磁盘分区的顺序),:

注意,data-offset这个参数, 后面的1024是k, 对应上面的2048扇区,   这个数值要根据前面  -E 显示出来的data offset 数值,来确定 2048/2=1024

data-offset这个参数, 只有新版本的mdadm才可以使用。

mdadm --create --level=5 --data-offset=1024  -n 4 /dev/md0 /dev/hdc5 /dev/hda5 /dev/hdb5 /dev/hdd5

重建后UUID会改变, 要更新/etc/mdadm/mdadm.conf的UUID

如果重建失败,就要用无校验的强制重建了,无校验重建, 一定要排好磁盘分区的顺序,和raid的版本,
磁盘分区的顺序,
可以通过mdadm -E /dev/sdf6 来看metadata的版本和分区次序, 一般版本有0.9或者1.0或者1.1或者1.2 如果用错版本, 数据就很难回来了,
还可以从以前的syslog里面找,启动过程中,会有提示。当然最好是事先有记录。根据bios设置不同, 磁盘次序会有变化,最好对应到磁盘序列号, ls /dev/disk/by-id -l
如果这个也不能找到, 就用hexedit去查看每个分区的边界吧,运气好能够按照顺序排起来,4K一个段.也有直接检查raid5的物理块的工具。
强制重建,例如:
mdadm --create --assume-clean --level=5 -e 0.9  --data-offset=1024  --raid-devices=4 /dev/md4 /dev/hdc5 /dev/hda5 /dev/hdb5 /dev/hdd5



参考:https://raid.wiki.kernel.org/index.php/RAID_Recovery


如果磁盘有坏道, 重建过程就会失败, 所以要事先进行磁盘扫描修复:http://anheng.com.cn/news/html/net_admin_blog/linux_badblocks_online_fix.html
如果不能修复, 要用dd_rescue 把坏磁盘复制到新磁盘, 然后用新磁盘进行重建


完成之后的情况:
npc:/cangku# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 hdb5[2] sda5[3] hdc5[0] hda5[1]
32290176 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>

如果是强制组建的,最好做一下手动sync检查:
sudo echo check > /sys/block/md0/md/sync_action

后面lvm恢复就比较简单了,pvs先搜索一下看看,
有时候强制组建的raid, 如果磁盘顺序错误,lv是可以列出来的,但是,文件系统是不能加载的。
npc:/cangku# /etc/init.d/lvm2  start
Setting up LVM Volume Groups  Reading all physical volumes.  This may take a while...
Found volume group "main" using metadata type lvm2
6 logical volume(s) in volume group "main" now active
.
npc:/cangku# ls /dev/main/
liushiwei  root       swap       tmp        usr        var
责任编辑: admin