我可以“primefaces”交换在Linux软件突袭raid5驱动器?

我的3盘raid5arrays中的一个驱动器开始显示读取错误和SMART警告。 不足以让它从arrays中跳出(如故障),但是会影响性能,可能会变坏(更糟糕)。 我显然想replace这个驱动器。

现在的问题是,如果我运行这个:(sdc是破碎的驱动器,sdd是新的):

mdadm /dev/md0 -a /dev/sdd1 -f /dev/sdc1 -r /dev/sdc1 

Linux首先将sdc1标记为有问题,并且再也不从中读取,然后从sda1和sdb1(arrays中的另外两个磁盘)同步sdd1?

如果是这样,那么我很容易在sda1或sdb1上有一个不可读的块(即使是一个!),这将导致重build失败。

想要做的就是将sdd1作为sdc1的副本同步,然后将sdc1标记为有故障。 那么我就不会处于没有冗余的情况下(尽pipe在磁盘上有一个冗余条带可以给出读取错误)。

有没有办法做到这一点在线? 离线我可以:

  • 向下数组(mdadm –stop)
  • dd sdc1到sdd1(dd if = / dev / sdc1 of = / dev / sdd1)
  • 身体上拿出sdc
  • 使用两个旧工作的和新的(mdadm -A -s)
  • 重新同步

那么,这种方法的问题是,在最后一步,如果有一个不匹配,我想新的磁盘是重写的,而不是奇偶校验(无论该条纹​​上的磁盘)。

所以“重buildsdd1作为一个新的sdc1,从sda1和sdb1获取数据,但如果失败,请复制sdc1上的内容”。

单独来说,这些命令不会做你想做的事情。

 mdadm / dev / md0 -a / dev / sdd1 
 cat / proc / mdstat;  #(你现在应该有一个raid5的备用驱动器)
 mdadm / dev / md0 -f / dev / sdc1
 cat / proc / mdstat;  #(你现在应该看到重build发生到sdd1)

对实际命令的testing确实会导致重build的发生。

唉,我不相信你现在可以做你想做的事情。

另外,我经常参考linux raid维基 ,并试验我在那里看到的使用loopback文件。

 dd if = / dev / zero = loopbackfile.0 bs = 1024k count = 100
 losetup / dev / loop0 loopbackfile.0

这给你100兆文件,可作为/ dev / loop0。 创build另外几个,并且可以使用mdadm(例如“mdadm –create / dev / md0 –level = 5 –raid-devices = 3 / dev / loop0 / dev / loop1 / dev / loop2)驱动器或数据。


注意我以前曾经这么说过

 mdadm / dev / md0 -a / dev / sdd1
 mdadm --grow / dev / md0 --raid-disks = 4

会增加你的arraysraid6。 这是错误的。 这将简单地添加第四个磁盘到您的arrays,这不会让你处于比现在更好的位置。


testing软件在沙盒中突袭!

我会build议你在箱里玩。
由于mdadm可以处理图像文件,而不仅仅是像设备文件
/dev/sda or /dev/mapper/vg00/lv_home – 为什么不testing你的迁移
在你的机器上的第二个softwarerraid内:?)

Linux操作系统

我在debian / lenny和bash下做这个:

 # cat /etc/debian_version && uname -r && bash --version 5.0.2 2.6.26-2-amd64 GNU bash, version 3.2.39(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. 

步骤1

以root身份创build像这样的4x128MB diskimages (您需要512 MB的可用磁盘空间)

 sudo su mkdir -p ~/raidtest/{root,home} && cd ~/raidtest for i in sd{a,b,c,d} ; do dd if=/dev/zero bs=128 count=1M of=$i done 

让我们看看发生了什么:

 # ls -hon --time-style=+ total 512M drwxr-xr-x 2 0 4,0K home drwxr-xr-x 2 0 4,0K root -rw-r--r-- 1 0 128M sda -rw-r--r-- 1 0 128M sdb -rw-r--r-- 1 0 128M sdc -rw-r--r-- 1 0 128M sdd 

第2步

分区的文件

我通过一个循环设备为sda创build了3个分区(20MB,40MB和56MB),/和/ home:

 # losetup /dev/loop0 sda # ! echo "n p 1 +20M t fd n p 2 +40M t 2 fd n p 3 t 3 fd w" | fdisk /dev/loop0 

好的,看看发生了什么:

 # fdisk -l /dev/loop0 Disk /dev/loop0: 134 MB, 134217728 bytes 255 heads, 63 sectors/track, 16 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0xe90aaf21 Device Boot Start End Blocks Id System /dev/loop0p1 1 3 24066 fd Linux raid autodetect /dev/loop0p2 4 9 48195 fd Linux raid autodetect /dev/loop0p3 10 16 56227+ fd Linux raid autodetect 

复制这个partitionscheme到循环{1,2,3} ^ = sd {b,c,d}

 # losetup /dev/loop1 sdb # sfdisk -d /dev/loop0 | sfdisk /dev/loop1 # losetup /dev/loop2 sdc # sfdisk -d /dev/loop0 | sfdisk /dev/loop2 # losetup /dev/loop3 sda # sfdisk -d /dev/loop0 | sfdisk /dev/loop3 

可选:如果已安装parted,请在设备上运行partprobe以更新内核表

 # partprobe /dev/loop0 # partprobe /dev/loop1 # partprobe /dev/loop2 # partprobe /dev/loop3 

第3步

使用kpartx创build/dev/mapper/

 aptitude install kpartx dmsetup # kpartx -av /dev/loop0 add map loop0p1 (254:3): 0 48132 linear /dev/loop0 63 add map loop0p2 (254:4): 0 96390 linear /dev/loop0 48195 add map loop0p3 (254:5): 0 112455 linear /dev/loop0 144585 # kpartx -av /dev/loop1 add map loop1p1 (254:6): 0 48132 linear /dev/loop1 63 add map loop1p2 (254:7): 0 96390 linear /dev/loop1 48195 add map loop1p3 (254:8): 0 112455 linear /dev/loop1 144585 # kpartx -av /dev/loop2 add map loop2p1 (254:9): 0 48132 linear /dev/loop2 63 add map loop2p2 (254:10): 0 96390 linear /dev/loop2 48195 add map loop2p3 (254:11): 0 112455 linear /dev/loop2 144585 # kpartx -av /dev/loop3 add map loop3p1 (254:12): 0 48132 linear /dev/loop3 63 add map loop3p2 (254:13): 0 96390 linear /dev/loop3 48195 add map loop3p3 (254:14): 0 112455 linear /dev/loop3 144585 

步骤4

创build你的raid5并观察状态
我们还是根! 在我的工作站上,我不使用RAID,只是LVM,所以我必须加载内核模块并安装软件包mdadm 。

 # modprobe raid5 # aptitude install mdadm # cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] unused devices: <none> 

我使用md {10,11,12}进行这个testing。 注意,它们没有在你的系统上使用(这将是不正常的)!
–force和-x 0被使用,因为否则mdadm放置一个分区als spare:

 ## the 20MB Partition # mdadm --create --force -l 5 -n3 -x 0 /dev/md10 /dev/mapper/loop0p1 /dev/mapper/loop1p1 /dev/mapper/loop2p1 mdadm: array /dev/md10 started. ## the 40MB Partition # mdadm --create --force -l 5 -n3 /dev/md11-x 0 /dev/mapper/loop0p2 /dev/mapper/loop1p2 /dev/mapper/loop2p2 mdadm: array /dev/md11 started. ## the 56MB Partition # mdadm --create --force -l 5 -n3 /dev/md12-x 0 /dev/mapper/loop0p3 /dev/mapper/loop1p3 /dev/mapper/loop2p3 mdadm: array /dev/md12 started. 

现在看起来如何:

 # cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md12 : active raid5 dm-11[2] dm-8[1] dm-5[0] 112256 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] md11 : active raid5 dm-10[2] dm-7[1] dm-4[0] 96256 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] md10 : active raid5 dm-9[2] dm-6[1] dm-3[0] 48000 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] unused devices: <none> 

信息
输出不好 。 mdstat只显示dm-3 .. dm-11 ,meaing /dev/mapper/loop*
但是ls -lsa /dev/disk/by-id显示当前映射。

我在md10上的输出始于dm-9(意思是/ dev / mapper / loop0p1),因为我在写这篇文章时做了testing,我的LVM使用了dm- {0,1,2}。
你也可以通过mdadm -Q --detail /dev/md10 /dev/md11 /dev/md12使用mdadm --examine --scan或更详细的信息

第5步

作为root创build静默文件系统和交换

 # mkswap /dev/md10 > /dev/null 2>&1 # mke2fs -m0 -Lroot /dev/md11 -F > /dev/null 2>&1 # mke2fs -m0 -Lhome /dev/md12 -F > /dev/null 2>&1 

安装新的raiddevices:

 # swapon /dev/md10 # mount /dev/md11 root/ # mount /dev/md12 home/ 

看看结构,如果/ dev / md10是一个有效的交换分区:
(我的工作站也使用/ dev / mapper / vg00-swap,因此优先级较高)

 # \tree . |-- home | `-- lost+found |-- root | `-- lost+found |-- sda |-- sdb |-- sdc `-- sdd # cat /proc/swaps Filename Type Size Used Priority /dev/mapper/vg00-swap partition 9764856 53688 -1 /dev/md10 partition 47992 0 -2 

哇,沙盒上的工作太多了 – 但是当你想玩mdadm的时候,它是值得的 – 使用它!

现在你有一个正在运行的raid5,可以testing迁移
我想这里有一些很好的答案 – 在你的系统上仔细testing它们!

最后一步

完成testing后,closures你的mds并删除你的/dev/loop*

 # mdadm --stop /dev/md10 # mdadm --stop /dev/md11 # mdadm --stop /dev/md12 # kpartx -dv /dev/loop0 # kpartx -dv /dev/loop1 # kpartx -dv /dev/loop2 # kpartx -dv /dev/loop3 

重新启动后重新启动它

 sudo su cd ~/raidtest # connecting the files to /dev/loop* losetup /dev/loop0 sda losetup /dev/loop1 sdb losetup /dev/loop2 sdc losetup /dev/loop3 sdd # access to the partions in /dev/loop* kpartx -av /dev/loop0 kpartx -av /dev/loop1 kpartx -av /dev/loop2 kpartx -av /dev/loop3 # start the raid again mdadm --assemble /dev/md10 /dev/mapper/loop0p1 /dev/mapper/loop1p1 /dev/mapper/loop2p1 mdadm --assemble /dev/md11 /dev/mapper/loop0p2 /dev/mapper/loop1p2 /dev/mapper/loop2p2 mdadm --assemble /dev/md12 /dev/mapper/loop0p3 /dev/mapper/loop1p3 /dev/mapper/loop2p3 # show active raids cat /proc/mdstat 

经过testing:将分区表复制到/ dev / sdd

你的testing进行得很好?
好的,那么你必须把分区从/dev/sda复制到/dev/sdd就像我们在沙箱中用我们的文件所做的那样:

 sfdisk -d /dev/sda | sfdisk /dev/sdd 

现在你可以将/dev/sdd添加到你的raid中

信息
如果由于不同的硬盘供应商/型号而导致失败,则必须使用-uS (sectors), -uB (blocks), -uC (cylinders) or -uM (megabytes) ,请参阅man sfdisk

一些P-ATA P-ATA,甚至SCSCI P-ATA的现实生活中,除非新设备的尺寸与其他硬盘相同或更大,否则它们可以正常工作。
Softwareraid非常灵活!

更新你的/etc/mdadm/mdadm.conf

如果你有一个/etc/mdadm/mdadm.conf请查看并更新它! mdadm可以帮助您显示正确的语法:

 mdadm --detail --scan 

祝你好运!

冒着明显的风险,是不是下一步做备份? 或者最好是两个。

我对RAID5重build的经验是无论出于什么原因都有很大的失败机会。

如果您担心sda1或sdb1的状态,请启动恢复CD并检查驱动器是否脱机。

我不确定,但是我相信Linux raid可能会从RAID5切换到RAID6。

如果可以的话,那么你可以添加备用设备,并且如果可能的话,将其切换到RAID6,以便除旧驱动器之外,奇偶校验将被重新生成到新驱动器上。 一旦同步完成,请拔出发生故障的驱动器,然后切换回RAID5。

我强烈build议你做一个备份,如果你没有一个。 你需要决定的问题不是如果你有能力进行备份,问题是,你将能够承担数据的损失,你的时间损失,或你可能花费在驱动器上的数千人恢复服务。