Rya*_*yan 7 linux raid mdadm hard-disk fakeraid
问题:使用 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 --detail-platform:
$ 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 -
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这就是我遇到困难的地方。我试图组装阵列。
$ 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
Run Code Online (Sandbox Code Playgroud)
通过使用 --force 或交换 /dev/loop0 和 /dev/loop1,我得到了相同的结果。
由于 IMSM 是 CONTAINER 类型的 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
Run Code Online (Sandbox Code Playgroud)
阅读后几 更多 的东西,它似乎是这里的罪魁祸首是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.
Run Code Online (Sandbox Code Playgroud)
那是一些东西。仔细看...
$ 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
Run Code Online (Sandbox Code Playgroud)
/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)
Run Code Online (Sandbox Code Playgroud)
那看起来没问题。让我们尝试启动阵列。我找到了说使用增量组装模式来启动容器的信息(这里和这里)。
$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -I /dev/md/imsm
Run Code Online (Sandbox Code Playgroud)
那什么也没给我。让我们使用详细标志。
$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -Iv /dev/md/imsm
mdadm: not enough devices to start the container
Run Code Online (Sandbox Code Playgroud)
哦,打扰了。让我们检查 /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>
Run Code Online (Sandbox Code Playgroud)
好吧,这看起来不对 - 块的数量不匹配。仔细查看我尝试组装时的消息,似乎 mdadm 说“元数据将覆盖 /dev/loop0 上的最后一个分区”,所以我猜测与 /dev/loop0 关联的图像文件已被冲洗。谢天谢地,我有这些图像的备份副本,所以我可以抓取它们并重新开始,但即使通过 USB3 重新复制 300-600GB 也需要一段时间。
无论如何,在这一点上,我很难过。我希望有人有想法,因为此时我不知道下一步该尝试什么。
这是解决这个问题的正确途径吗,我只需要正确设置一些设置?或者上述方法对于挂载 IMSM RAID-0 磁盘映像是否完全错误?
查看和 的分区表/dev/loop0以及报告的磁盘映像大小,我倾向于建议将两个磁盘简单地连接在一起,然后为生成的虚拟磁盘构建分区表:/dev/loop0/dev/loop1
Run Code Online (Sandbox Code Playgroud)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
和
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
我的块大小为 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
Run Code Online (Sandbox Code Playgroud)
我们已经有几个正在使用的循环设备,因此我避免假设下一个空闲循环设备的名称,而是要求命令告诉losetup我它正在使用的设备;这是放入$ld. 4196532 个扇区(每个扇区 512 个字节)的偏移量对应于第二个分区的映像的偏移量。我们同样可以省略losetup命令中的偏移量并将其添加到mount选项中。