问题:使用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
选项中。