背景

背景

问题:使用Linux和mdadm,我如何读取/复制数据作为文件来自英特尔快速存储技术 RAID-0 阵列中使用的硬盘制作的磁盘映像(格式为 NTFS,安装了 Windows 7)?

问题:阵列中的一个驱动器坏了,所以我想在更换驱动器之前复制尽可能多的数据(从而破坏阵列)。

如果他们能解决我的问题,我愿意接受这个问题的替代解决方案。

背景

我有一台配备 Intel 快速存储技术控制器(在不同情况下称为 RST、RSTe 或 IMSM)的笔记本电脑,该控制器有两 (2) 个配置为 RAID-0 (FakeRAID-0) 的硬盘。 RAID-0 不是我的选择,因为笔记本电脑是按照这种配置交付给我的。其中一个磁盘似乎积累了很多坏扇区,而另一个磁盘则完全健康。总之,磁盘仍然足够健康,可以启动进入操作系统(Windows 7 64 位),但操作系统有时会在访问损坏的磁盘区域时挂起,继续尝试使用损坏的磁盘似乎是一个坏主意。我想从磁盘上复制尽可能多的数据,然后更换损坏的驱动器。由于在损坏的磁盘上进行实时操作被认为是不好的,因此我决定对两个磁盘进行映像,以便稍后可以使用 mdadm 或类似的东西来安装映像。我花费了大量时间并进行了大量阅读,但我仍然没有成功地将磁盘映像安装为(假)RAID-0 阵列。我将尝试回忆一下我在这里执行的步骤。准备一些零食和饮料,因为这很长。

首先,我有一个 USB 外部驱动器来在分区上运行 Ubuntu 15.10 64 位。使用 LiveCD 或小型 USB 拇指驱动器更容易启动,但比外部驱动器慢(并且 LiveCD 不是持久安装)。我安装了 ddrescue 并用它生成每个硬盘的映像。创建图像没有明显的问题。

获得映像后,我使用 apt 安装了 mdadm。但是,这安装了 2013 年的旧版本 mdadm。更新日志表明对 IMSM 有更好的支持,因此我使用以下命令编译并安装了 mdadm 3.4本指南,包括升级到 4.4.2 或更高版本的内核。这里唯一值得注意的问题是一些测试没有成功,但指南似乎表明这是可以接受的。

之后,我读了一篇很少 地方我需要使用环回设备才能使用图像。我将磁盘映像安装为 /dev/loop0 和 /dev/loop1 ,没有任何问题。

以下是该过程此时的一些相关信息......

mdadm --详细平台:

$ sudo mdadm --detail-platform
       Platform : Intel(R) Rapid Storage Technology
        Version : 10.1.0.1008
    RAID Levels : raid0 raid1 raid5
    Chunk Sizes : 4k 8k 16k 32k 64k 128k
    2TB volumes : supported
      2TB disks : not supported
      Max Disks : 7
    Max Volumes : 2 per array, 4 per controller
 I/O Controller : /sys/devices/pci0000:00/0000:00:1f.2 (SATA)
          Port0 : /dev/sda (W0Q6DV7Z)
          Port3 : - non-disk device (HL-DT-ST DVD+-RW GS30N) -
          Port1 : /dev/sdb (W0Q6CJM1)
          Port2 : - no device attached -
          Port4 : - no device attached -
          Port5 : - no device attached -

fdisk -l:

$ sudo fdisk -l
Disk /dev/loop0: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2bd2c32a

Device       Boot   Start        End    Sectors   Size Id Type
/dev/loop0p1 *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/loop0p2      4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT


Disk /dev/loop1: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x2bd2c32a

Device     Boot   Start        End    Sectors   Size Id Type
/dev/sda1  *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/sda2       4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT


Disk /dev/sdb: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

mdadm --examine --verbose /dev/sda:

$ sudo mdadm --examine --verbose /dev/sda
/dev/sda:
          Magic : Intel Raid ISM Cfg Sig.
        Version : 1.0.00
    Orig Family : 81bdf089
         Family : 81bdf089
     Generation : 00001796
     Attributes : All supported
           UUID : acf55f6b:49f936c5:787fa66e:620d7df0
       Checksum : 6cf37d06 correct
    MPB Sectors : 1
          Disks : 2
   RAID Devices : 1

[ARRAY]:
           UUID : e4d3f954:2f449bfd:43495615:e040960c
     RAID Level : 0
        Members : 2
          Slots : [_U]
    Failed disk : 0
      This Slot : ?
     Array Size : 1250275328 (596.18 GiB 640.14 GB)
   Per Dev Size : 625137928 (298.09 GiB 320.07 GB)
  Sector Offset : 0
    Num Stripes : 2441944
     Chunk Size : 128 KiB
       Reserved : 0
  Migrate State : idle
      Map State : normal
    Dirty State : clean

  Disk00 Serial : W0Q6DV7Z
          State : active failed
             Id : 00000000
    Usable Size : 625136142 (298.09 GiB 320.07 GB)

  Disk01 Serial : W0Q6CJM1
          State : active
             Id : 00010000
    Usable Size : 625136142 (298.09 GiB 320.07 GB)

mdadm --examine --verbose /dev/sdb:

$ sudo mdadm --examine --verbose /dev/sdb
/dev/sdb:
          Magic : Intel Raid ISM Cfg Sig.
        Version : 1.0.00
    Orig Family : 81bdf089
         Family : 81bdf089
     Generation : 00001796
     Attributes : All supported
           UUID : acf55f6b:49f936c5:787fa66e:620d7df0
       Checksum : 6cf37d06 correct
    MPB Sectors : 1
          Disks : 2
   RAID Devices : 1

  Disk01 Serial : W0Q6CJM1
          State : active
             Id : 00010000
    Usable Size : 625137928 (298.09 GiB 320.07 GB)

[ARRAY]:
           UUID : e4d3f954:2f449bfd:43495615:e040960c
     RAID Level : 0
        Members : 2
          Slots : [_U]
    Failed disk : 0
      This Slot : 1
     Array Size : 1250275328 (596.18 GiB 640.14 GB)
   Per Dev Size : 625137928 (298.09 GiB 320.07 GB)
  Sector Offset : 0
    Num Stripes : 2441944
     Chunk Size : 128 KiB
       Reserved : 0
  Migrate State : idle
      Map State : normal
    Dirty State : clean

  Disk00 Serial : W0Q6DV7Z
          State : active failed
             Id : 00000000
    Usable Size : 625137928 (298.09 GiB 320.07 GB)

这就是我遇到困难的地方。我尝试组装阵列。

$ sudo mdadm --assemble --verbose /dev/md0 /dev/loop0 /dev/loop1
mdadm: looking for devices for /dev/md0
mdadm: Cannot assemble mbr metadata on /dev/loop0
mdadm: /dev/loop0 has no superblock - assembly aborted

通过使用 --force 或交换 /dev/loop0 和 /dev/loop1 得到相同的结果。

由于 IMSM 是容器类型的 FakeRAID,因此我看到一些迹象表明您必须创建容器而不是组装它。我试过...

$ sudo mdadm -CR /dev/md/imsm -e imsm -n 2 /dev/loop[01]
mdadm: /dev/loop0 is not attached to Intel(R) RAID controller.
mdadm: /dev/loop0 is not suitable for this array.
mdadm: /dev/loop1 is not attached to Intel(R) RAID controller.
mdadm: /dev/loop1 is not suitable for this array.
mdadm: create aborted

读完一篇后很少 更多的 事物,看来这里的罪魁祸首是IMSM_NO_PLATFORM和IMSM_DEVNAME_AS_SERIAL。在尝试让环境变量与 sudo 保持一致之后,我尝试...

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -CR /dev/md/imsm -e imsm -n 2 /dev/loop[01]
mdadm: /dev/loop0 appears to be part of a raid array:
       level=container devices=0 ctime=Wed Dec 31 19:00:00 1969
mdadm: metadata will over-write last partition on /dev/loop0.
mdadm: /dev/loop1 appears to be part of a raid array:
       level=container devices=0 ctime=Wed Dec 31 19:00:00 1969
mdadm: container /dev/md/imsm prepared.

那是一件事。仔细看看...

$ ls -l /dev/md
total 0
lrwxrwxrwx 1 root root 8 Apr  2 05:32 imsm -> ../md126
lrwxrwxrwx 1 root root 8 Apr  2 05:20 imsm0 -> ../md127

/dev/md/imsm0 和 /dev/md127 与物理磁盘驱动器(/dev/sda 和 /dev/sdb)关联。 /dev/md/imsm(指向/dev/md126)是基于环回设备新创建的容器。仔细看看……

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -Ev /dev/md/imsm
/dev/md/imsm:
          Magic : Intel Raid ISM Cfg Sig.
        Version : 1.0.00
    Orig Family : 00000000
         Family : ff3cb556
     Generation : 00000001
     Attributes : All supported
           UUID : 00000000:00000000:00000000:00000000
       Checksum : 7edb0f81 correct
    MPB Sectors : 1
          Disks : 1
   RAID Devices : 0

  Disk00 Serial : /dev/loop0
          State : spare
             Id : 00000000
    Usable Size : 625140238 (298.09 GiB 320.07 GB)

    Disk Serial : /dev/loop1
          State : spare
             Id : 00000000
    Usable Size : 625140238 (298.09 GiB 320.07 GB)

    Disk Serial : /dev/loop0
          State : spare
             Id : 00000000
    Usable Size : 625140238 (298.09 GiB 320.07 GB)

看起来还不错。让我们尝试启动数组。我找到了资料(这里这里)说的是使用增量组装模式来启动一个容器。

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -I /dev/md/imsm

那没有给我任何东西。让我们使用详细标志。

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -Iv /dev/md/imsm
mdadm: not enough devices to start the container

哦,麻烦了。让我们检查/proc/mdstat。

$ sudo cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md126 : inactive loop1[1](S) loop0[0](S)
      2210 blocks super external:imsm

md127 : inactive sdb[1](S) sda[0](S)
      5413 blocks super external:imsm

unused devices: <none>

嗯,这看起来不对——块的数量不匹配。仔细查看我尝试组装时的消息,似乎 mdadm 说“元数据将覆盖 /dev/loop0 上的最后一个分区”,所以我猜测与 /dev/loop0 关联的图像文件已被删除。值得庆幸的是,我有这些图像的备份副本,因此我可以获取这些图像并重新开始,但即使通过 USB3 重新复制 300-600GB 也需要一段时间。

无论如何,在这一点上,我很困惑。我希望有人有一个想法,因为目前我不知道下一步要尝试什么。

这是解决这个问题的正确途径吗?我只需要进行一些正确的设置?或者上述方法对于挂载 IMSM RAID-0 磁盘映像完全错误?

答案1

查看 和 的分区表/dev/loop0以及报告的磁盘映像大小/dev/loop0/dev/loop1我倾向于建议将两个磁盘简单地连接在一起,然后为生成的虚拟磁盘构建分区表:

Disk /dev/loop0: 298.1 GiB, 320072933376 bytes, 625142448 sectors

Device       Boot   Start        End    Sectors   Size Id Type
/dev/loop0p1 *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/loop0p2      4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT

Disk /dev/loop1: 298.1 GiB, 320072933376 bytes, 625142448 sectors

如果我们将两个磁盘的大小分别设为 298.1 GiB 和 298.1 GiB,则总共会得到 596.2 GiB。然后,如果我们将两个分区的大小设为 2G + 594.2G,我们也会得到 596.2 GiB。(这里假设“G”表示 GiB。)

您已经警告过您无法mdadm识别超级块信息,因此纯粹根据磁盘分区标签,我将尝试构建如下阵列:

mdadm --build /dev/md0 --raid-devices=2 --level=0 --chunk=128 /dev/loop0 /dev/loop1
cat /proc/mdstat

我的块大小为 128KiB,以匹配磁盘上仍然存在的元数据描述的块大小。

如果有效,您就可以继续访问生成的 RAID0 中的分区。

ld=$(losetup --show --find --offset=$((4196352*512)) /dev/md0)
echo loop device is $ld
mkdir -p /mnt/dsk
mount -t ntfs -o ro $ld /mnt/dsk

我们已经有几个正在使用的循环设备,因此我避免假设下一个空闲循环设备的名称,而是要求命令losetup告诉我它正在使用的设备;这是放入$ld. 4196532 个扇区(每个扇区 512 个字节)的偏移量对应于第二个分区的映像的偏移量。我们同样可以省略losetup命令中的偏移量并将其添加到mount选项中。

相关内容