在沙箱中测试软件突袭!

在沙箱中测试软件突袭!

我的 3 磁盘 raid5 阵列中的一个驱动器开始显示读取错误和 SMART 警告。这还不足以将其踢出阵列(因为有故障),但它会影响性能并且可能会变坏(更糟)。我显然想更换这个驱动器。

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

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

Linux 是否会首先将 sdc1 标记为有故障,并且不再从中读取,然后从 sda1 和 sdb1(阵列中的另外两个磁盘)同步 sdd1?

如果是这样,那么我就很容易受到 sda1 或 sdb1 上存在不可读块(甚至只有一个!)的影响,这将导致重建失败。

要做的是在将 sdc1 标记为故障之前将 sdd1 同步为 sdc1 的副本。这样我就不会遇到没有冗余的情况(尽管一个冗余条带位于一个很容易产生读取错误的磁盘上)。

有没有办法在线完成此操作?离线我可以:

  • 关闭阵列(mdadm --stop)
  • dd sdc1 到 sdd1 (dd if=/dev/sdc1 of=/dev/sdd1)
  • 物理取出 sdc
  • 使用两个旧的工作阵列和新的工作阵列启动阵列(mdadm -A -s)
  • 重新同步

嗯,该方法的问题在于,在最后一步中,如果出现不匹配的情况,我希望新磁盘是被重写的磁盘,而不是奇偶校验磁盘(无论该条带上的磁盘是什么)。

因此“将 sdd1 重建为新的 sdc1,从 sda1 和 sdb1 获取数据,但如果它们失败,则复制 sdc1 上的内容”。

答案1

单独地,这些命令不会实现您想要的效果。

mdadm /dev/md0 -a /dev/sdd1
cat /proc/mdstat; #(您现在应该在 raid5 中有一个备用驱动器)
mdadm /dev/md0 -f /dev/sdc1
cat /proc/mdstat; #(您现在应该看到 sdd1 正在重建)

对实际命令的测试确实会导致重建发生。

唉,我不相信你现在就能做你想做的事。

顺便说一句,我经常提到Linux 突袭 维基,并使用环回文件对我所看到的内容进行实验。

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

这样你就得到了 100 MB 的文件,可以作为 /dev/loop0 使用。再创建几个,然后你就可以使用 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

会将您的阵列扩展为 raid6。这是错误的。这只会向您的阵列添加第四个磁盘,这不会使您处于比当前更好的位置。


答案2

在沙箱中测试软件突袭!

我建议你尝试一下沙箱
由于 mdadm 可以处理图像文件,而不仅仅是像
ie这样的设备文件/dev/sda or /dev/mapper/vg00/lv_home- 为什么不在
您的机器上的第二个软件阵列中测试您的迁移 :?)

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 身份创建 4x128MB 磁盘映像,如下所示(您需要 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 上为 swap、/ 和 /home 创建了 3 个分区(20MB、40MB 和 56MB):

# 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

将此分区方案复制到循环{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

使用陣容创建每个分区设备/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

创建 raid5 并观察状态
我们仍然是 root!在我的工作站上,我不使用 raid,只使用 LVM,所以我必须加载内核模块并安装包 管理

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

我使用 md{10,11,12} 进行此测试。请注意,不要在您的系统上使用它们(否则会不正常)!
使用 --force 和 -x 0,因为否则 mdadm 会将一个分区设为备用:

## 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/dev/mapper/loop*
ls -lsa /dev/disk/by-id表示向您显示当前映射。

我在 md10 上的输出以 dm-9(表示 /dev/mapper/loop0p1)开头,因为我在撰写本文时进行了测试,并且我的 LVM 使用 dm-{0,1,2}。
您还可以mdadm --examine --scan通过以下方式使用或获取更详细的信息mdadm -Q --detail /dev/md10 /dev/md11 /dev/md12

步骤5

以 root 身份静默创建文件系统和交换

# 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

安装新的 raid 设备:

# 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,可以测试迁移
我认为这里有一些很好的答案 - 在您的系统上仔细测试它们!

最后一步

完成测试后,关闭 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

测试后:将分区表复制到/dev/sdd

你的测试顺利吗?
好的,然后你必须将分区从复制/dev/sda/dev/sdd,就像我们在沙盒中对文件所做的那样:

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

现在你可以加入/dev/sdd你的团队

信息
如果由于硬盘供应商/型号不同而失败,您必须尝试 -uS (sectors), -uB (blocks), -uC (cylinders) or -uM (megabytes)- 咨询man sfdisk

我的一些实际 raidcombo 中 P-ATA <-> P-ATA 甚至 SCSCI <-> P-ATA 工作正常,除非新设备的大小等于或大于其他硬盘。
Softwareraid 非常灵活!

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

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

mdadm --detail --scan

祝你好运!

答案3

冒着陈述显而易见的风险,下一步不是要进行备份吗?或者最好是两个。

根据我对 RAID5 重建的经验,无论出于何种原因,重建失败的可能性都很大。

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

答案4

我不确定,但我相信使用 Linux raid 可以从 RAID5 切换到 RAID6。

如果可能的话,您可以添加备用设备,如果可能的话,将其切换到 RAID6,这样除了旧驱动器之外,奇偶校验还会重新生成到新驱动器上。同步完成后,拔出故障驱动器,然后切换回 RAID5。

如果您没有备份,我强烈建议您进行备份。您需要决定的问题不是您是否有能力进行备份,而是您是否能够承受数据丢失、时间损失或驱动器恢复服务上可能花费的数千美元。

相关内容