需要查找 RAID-10 阵列中哪些驱动器是镜像的

需要查找 RAID-10 阵列中哪些驱动器是镜像的

我有一个运行 openSUSE 12.2 的家庭媒体服务器。我在 RAID-10 配置中使用了八个 2TB 驱动器。我特意购买了两种不同类型的驱动器:四个 Seagate Barracuda Green 和四个 Western Digital Red。我的目标是配置 RAID,使阵列中的每个镜像对都由不同的驱动器组成(即一个 Seagate 驱动器和一个 WD 驱动器)。不幸的是,YaST2 分区程序没有给我这种阵列结构选择,所以现在我试图找出默认的 RAID10 结构是什么样的。

我知道以下内容:

  • sdc、sdd、sde 和 sdf 均为 WD 硬盘
  • sdg、sdh、sdi 和 sdj 均为 Seagate 硬盘

创建 RAID 时,我选择了默认的“n2”布局。根据这两个来源的信息,我猜测相邻的驱动器是镜像的(即 sdc==sdd、sde==sdf 等),但我想确定:

以下是‘mdadm --detail /dev/md0’的输出:

/dev/md0:
        Version : 1.0
  Creation Time : Sat Mar 16 12:55:11 2013
     Raid Level : raid10
     Array Size : 7814045696 (7452.05 GiB 8001.58 GB)
  Used Dev Size : 1953511424 (1863.01 GiB 2000.40 GB)
   Raid Devices : 8
  Total Devices : 8
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Sat Mar 16 13:09:37 2013
          State : active, resyncing
 Active Devices : 8
Working Devices : 8
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 2048K

  Resync Status : 1% complete

           Name : aldaris:0  (local to host aldaris)
           UUID : c6cc3943:97394500:b77d44cd:f02ed876
         Events : 149

    Number   Major   Minor   RaidDevice State
       0       8       33        0      active sync   /dev/sdc1
       1       8       49        1      active sync   /dev/sdd1
       2       8       65        2      active sync   /dev/sde1
       3       8       81        3      active sync   /dev/sdf1
       4       8       97        4      active sync   /dev/sdg1
       5       8      113        5      active sync   /dev/sdh1
       6       8      129        6      active sync   /dev/sdi1
       7       8      145        7      active sync   /dev/sdj1

/proc/mdstat 的内容如下:

Personalities : [raid10] md0 : active raid10 sdj1[7] sdi1[6] sdh1[5] sdg1[4] sdf1[3] sde1[2] sdd1[1] sdc1[0]
      7814045696 blocks super 1.0 2048K chunks 2 near-copies [8/8] [UUUUUUUU]
      [>....................]  resync =  4.8% (375163456/7814045696) finish=1206.5min speed=102751K/sec
      bitmap: 57/59 pages [228KB], 65536KB chunk

unused devices: <none>

我的问题是:

  1. 我如何知道哪些驱动器是彼此的镜像?
  2. 有没有办法改变这种情况,或者我应该只交换电线(因为这将交换驱动器号)然后重建 RAID?

提前致谢。


切题说明,如果有人想知道我这样做的理由,那就是:相同型号和批次的驱动器,在类似的使用负载、正常运行时间和温度下运行,几乎没有系统性变化,驱动器之间的故障时间差异主要由制造过程中的随机变化造成。这增加了多个驱动器同时损坏的风险。通过购买不仅来自不同批次而且来自完全不同制造商的驱动器,我将系统性变化引入我的阵列,从而影响哪些驱动器会在相似的时间发生故障。

答案1

最新版本mdadm在数组的详细信息中显示了这一点。示例来自mdadm v3.3 - 3rd September 2013

 $ mdadm --detail /dev/md1

/dev/md1:
        Version : 1.1
  Creation Time : Tue Aug 23 11:45:41 2016
     Raid Level : raid10
     Array Size : 3864803328 (3685.76 GiB 3957.56 GB)
  Used Dev Size : 1932401664 (1842.88 GiB 1978.78 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Fri Aug 26 09:39:28 2016
          State : active
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : px4-300r-THXOAP:1  (local to host px4-300r-THXOAP)
           UUID : 5ee06437:83dfdb64:808feaa2:5d57b1e6
         Events : 620

    Number   Major   Minor   RaidDevice State
       4       8       50        0      active sync set-A   /dev/sdd2
       1       8       34        1      active sync set-B   /dev/sdc2
       2       8       18        2      active sync set-A   /dev/sdb2
       3       8        2        3      active sync set-B   /dev/sda2

请注意符号set-Aset-B。在上述情况下,sddsdb可以同时失败而不会丢失数据。不过,在阵列重建期间,这些数据可能不可用。

答案2

我遇到了同样的问题,在谷歌搜索了一段时间后,我没有找到可靠的答案。经过一番思考,我发现镜像具有相同的数据,因此我们可以比较其中的一部分。

注意:请小心,如果有超过 2 个驱动器具有相同的校验和,则您可能正在比较空磁盘空间,请选择另一个偏移量(跳过选项)。

通过这几个命令,你就可以弄清楚:

for disk in sda sdb sdc sdd
do
  echo -n "$disk = ";
  dd if=/dev/$disk skip=1M bs=1M count=1 2>/dev/null | md5sum;
done

这将输出类似以下内容的内容:

sda = 7c4ef0f3e0143b35e044d5d65908a3a2  -
sdb = 7c4ef0f3e0143b35e044d5d65908a3a2  -
sdc = e02f7d61ad3791bd691da5b7516928a5  -
sdd = e02f7d61ad3791bd691da5b7516928a5  -

现在我们知道 sda/sdb 是一个镜像,sdc/sdd 是另一个镜像。必须保留其中一个以避免数据丢失。

“dd”命令一次(count=1)读取一兆字节(bs=1M),从磁盘开始(skip=1M)偏移一兆字节。不要 skip=0,因为磁盘的开头包含不同的信息。数据通常在 1MB 之后开始。

答案3

您始终可以通过粗略地比较数据来验证哪些是镜像,例如:

# dd if=/dev/sda1 bs=1M skip=10 count=50 2> /dev/null | md5sum -
7c01afa434fc74aeddc8ec0546e4c332  -
# dd if=/dev/sdb1 bs=1M skip=10 count=50 2> /dev/null | md5sum -
1f0f8166857710d555cb35db4a23891a  -
# dd if=/dev/sdg1 bs=1M skip=10 count=50 2> /dev/null | md5sum -
7c01afa434fc74aeddc8ec0546e4c332  -
# dd if=/dev/sdf1 bs=1M skip=10 count=50 2> /dev/null | md5sum -
1f0f8166857710d555cb35db4a23891a  -

(如果你没有得到任何匹配,你可能需要增加跳过=,因为你没有跳过 RAID 超级块;如果你对超过 2 个磁盘获得相同的 md5sum,则可能需要增加數量=,因为您可能正在读取和 m5summing 零 - 为了防止这种情况发生,您应该先将一些数据放在 raid 上,否则它们可能充满零)

至于交换线路,你不需要这样做 - mdadm 应该使用命令行中指定的设备创建 raidmdadm --create,因此您只需在命令行上以不同的顺序指定驱动器。

答案4

在每个组件设备(即 /dev/sda1、/dev/sdb1 等)上运行“mdadm --examine device”。那里的信息应该可以帮助您确定哪些组件是彼此的镜像。

相关内容