Pie*_*oAM 4 raid mdadm data-recovery hard-disk
我的一个朋友在他的办公室里使用了一个 NAS Buffalo-LS-WVL,其中有两个 1TB 的磁盘。似乎这两个磁盘是作为 raid 1 挂载的,但是,正如您将看到的,它们可能不是。NAS 出现了一些非常缓慢的问题,然后突然不再工作了。我被要求拯救他的数据。两个磁盘都具有完全相同的分区:一个物理分区和 6 个逻辑分区,第 6 个数据位于(大约 80GB,共 0.95TB)。
磁盘/dev/sdd
似乎会带来硬件问题(缓慢、扇区读取错误等),而 /dev/sde 是物理运行良好的磁盘。
目标是提取包含在 NAS 中的数据。如果不是所有数据,提取的数据越多越好。这些数据对我这位朋友的陪伴至关重要。
第一次尝试:单独挂载磁盘
这是第一次尝试,希望它有效,我尝试获取每个磁盘并单独安装它,我收到了以下消息:
root@ubuntu:~# mount /dev/sdd6 /mnt/n
-or-
root@ubuntu:~# mount /dev/sde6 /mnt/n
Run Code Online (Sandbox Code Playgroud)
两者都给了我相同的信息:
mount: unknown filesystem type 'linux_raid_member'
Run Code Online (Sandbox Code Playgroud)第二次尝试:创建磁盘阵列 RAID 1 并尝试挂载它们
好吧,如果我不能单独挂载它们,那么我需要创建一个磁盘阵列。让我们假设(最合乎逻辑的)原始配置是 raid 1,并且一次使用一个磁盘:
root@ubuntu:~# mdadm --create --run --level=1 --raid-devices=2 \
/dev/md/md-singolo-e6--create-missing /dev/sde6 missing
Run Code Online (Sandbox Code Playgroud)
给出:
mdadm: /dev/sde6 appears to be part of a raid array:
level=raid0
devices=2
ctime=Mon Sep 26 10:23:48 2011
mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/md-singolo-e6--create-missing started.
Run Code Online (Sandbox Code Playgroud)
因此,似乎原始raid处于0模式而不是1模式。坏新,因为磁盘会出现扇区问题。
无论如何,我尝试挂载新创建的 RAID1 阵列(即使我知道这是没有意义的):
root@ubuntu:~# mkdir /mnt/md-singolo-e6--create-missing
root@ubuntu:~# mount /dev/md/md-singolo-e6--create-missing \
/mnt/md-singolo-a6--create-missing/
Run Code Online (Sandbox Code Playgroud)
给:
mount: /dev/md127: can't read superblock
Run Code Online (Sandbox Code Playgroud)
对另一个磁盘给出了完全相同的结果。
第三次尝试:创建磁盘阵列RAID 0并尝试挂载它们
好的,正如有人说它是 Raid0,让我们继续吧:
root@ubuntu:~# mdadm --create --run --level=0 --raid-devices=2 \
/dev/md/md001hw /dev/sdd6 /dev/sde6
Run Code Online (Sandbox Code Playgroud)
给出:
mdadm: /dev/sdd6 appears to be part of a raid array:
level=raid1
devices=2
ctime=Mon Oct 14 16:38:33 2013
mdadm: /dev/sde6 appears to be part of a raid array:
level=raid1
devices=2
ctime=Mon Oct 14 17:01:01 2013
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/md001hw started.
Run Code Online (Sandbox Code Playgroud)
好的,一旦创建,我尝试挂载它:
root@ubuntu:~# mount /dev/md/md001hw /mnt/n
mount: you must specify the filesystem type
Run Code Online (Sandbox Code Playgroud)
此时所有指定的 ext2,3,4-t
都给出了错误。
第四次尝试:创建磁盘映像并使用它们
好的,因为磁盘有问题,最好处理数据分区的副本 (dd),在块读取错误(错误)的情况下填充 0(同步)。因此,我创建了两个图像:
这是一个好的磁盘(4MB 块,速度更快):
root@ubuntu:~# dd bs=4M if=/dev/sde6 of=/media/pietro/4TBexthdd/sde6-bs4M-noerror-sync.img conv=noerror,sync
Run Code Online (Sandbox Code Playgroud)
这个是针对有问题的磁盘(最小块大小,为了更安全)
root@ubuntu:~# dd if=/dev/sde6 of=/media/pietro/4TBexthdd/sdd6-noerror-sync.img conv=noerror,sync
Run Code Online (Sandbox Code Playgroud)
获得这两个映像后,我尝试使用上面指定的命令将它们用作 RAID 0。无事可做,得到的答案是图像“不是块设备”并且它不会创建数组。
第 5 次尝试:逐字节抢救一些数据
好的,如果正确的安装不起作用,让我们通过逐字节读取以及页眉和页脚信息来提取数据。我使用*foremost * 来完成这项工作,都在每个磁盘上:对于磁盘 1:
root@ubuntu:~# foremost -i /dev/sde6 -o /media/pietro/4TBexthdd/foremost_da_sde6/
Run Code Online (Sandbox Code Playgroud)
它创建带有文件扩展名的子文件夹,但其中根本没有人口。而对于磁盘 2(损坏的磁盘):
root@ubuntu:~# foremost -i /dev/sdd6 -o /media/pietro/4TBexthdd/foremost_da_sdd6_disco2/
Run Code Online (Sandbox Code Playgroud)
子文件夹结构都不是由foremost创建的。
当我首先在 RAID 0 阵列上尝试时,结果相同:
root@ubuntu:~# foremost -i /dev/md/md001hw -o /media/pietro/4TBexthdd/foremost_da_raid_hw/
Run Code Online (Sandbox Code Playgroud)
没有创建子文件夹结构。
其他问题:
mdadm
,我做对了吗? 这是dmesg
从故障磁盘 ( /dev/sdd
)读取时的输出:
[ 958.802966] sd 8:0:0:0: [sdd] Unhandled sense code
[ 958.802976] sd 8:0:0:0: [sdd]
[ 958.802980] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 958.802984] sd 8:0:0:0: [sdd]
[ 958.802987] Sense Key : Medium Error [current]
[ 958.802994] sd 8:0:0:0: [sdd]
[ 958.802999] Add. Sense: Unrecovered read error
[ 958.803003] sd 8:0:0:0: [sdd] CDB:
[ 958.803006] Read(10): 28 00 00 d5 c7 e0 00 00 f0 00
[ 958.803021] end_request: critical target error, dev sdd, sector 14010336
[ 958.803028] quiet_error: 36 callbacks suppressed
[ 958.803032] Buffer I/O error on device sdd, logical block 1751292
[ 958.803043] Buffer I/O error on device sdd, logical block 1751293
[ 958.803048] Buffer I/O error on device sdd, logical block 1751294
[ 958.803052] Buffer I/O error on device sdd, logical block 1751295
[ 958.803057] Buffer I/O error on device sdd, logical block 1751296
[ 958.803061] Buffer I/O error on device sdd, logical block 1751297
[ 958.803065] Buffer I/O error on device sdd, logical block 1751298
[ 958.803069] Buffer I/O error on device sdd, logical block 1751299
[ 958.803074] Buffer I/O error on device sdd, logical block 1751300
[ 958.803078] Buffer I/O error on device sdd, logical block 1751301
[ 961.621228] sd 8:0:0:0: [sdd] Unhandled sense code
[ 961.621236] sd 8:0:0:0: [sdd]
[ 961.621238] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 961.621241] sd 8:0:0:0: [sdd]
[ 961.621243] Sense Key : Medium Error [current]
[ 961.621248] sd 8:0:0:0: [sdd]
[ 961.621251] Add. Sense: Unrecovered read error
[ 961.621254] sd 8:0:0:0: [sdd] CDB:
[ 961.621255] Read(10): 28 00 00 d5 c8 d0 00 00 10 00
[ 961.621266] end_request: critical target error, dev sdd, sector 14010576
[ 964.791077] sd 8:0:0:0: [sdd] Unhandled sense code
[ 964.791084] sd 8:0:0:0: [sdd]
[ 964.791087] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 964.791090] sd 8:0:0:0: [sdd]
[ 964.791092] Sense Key : Medium Error [current]
[ 964.791096] sd 8:0:0:0: [sdd]
[ 964.791099] Add. Sense: Unrecovered read error
[ 964.791102] sd 8:0:0:0: [sdd] CDB:
[ 964.791104] Read(10): 28 00 00 d5 c8 00 00 00 08 00
[ 964.791114] end_request: critical target error, dev sdd, sector 14010368
[ 964.791119] quiet_error: 22 callbacks suppressed
[ 964.791122] Buffer I/O error on device sdd, logical block 1751296
Run Code Online (Sandbox Code Playgroud)
我讨厌成为坏消息的传播者,但是......
问:我是 mdadm 的新手,我做的一切都正确吗?
答:不。事实上,你几乎以最具破坏性的方式做了所有事情。您过去常常--create
销毁阵列元数据,而不是使用--assemble
它可能允许您读取数据(至少,在磁盘能够这样做的范围内)。这样做时,您丢失了关键元数据(特别是磁盘顺序、数据偏移量和块大小)。
此外,--create
可能在关键文件系统结构之上有乱写的数组元数据。
最后,在您的步骤 (3) 中,我看到 mdadm 在两个磁盘上都抱怨 RAID1 — 我希望这是您分别在两个磁盘上尝试 (2) 的结果。我真诚地希望您没有让 RAID1 开始尝试同步磁盘(例如,您是否将两者都添加到同一个 RAID1 阵列)。
看起来您终于创建了驱动器的图像。你应该这样做第一,至少尝试任何超出基本前--assemble
。但无论如何,
如果坏驱动器的图像丢失了大部分/所有扇区,请确定专业数据恢复是否值得。文件(和文件系统元数据)在 RAID0 中的驱动器之间拆分,因此您确实需要两者来恢复。专业恢复可能能够读取驱动器。
如果图像除少数扇区外基本正常,请继续。
制作图像文件的副本。仅处理图像文件的副本。我怎么强调都不为过,您可能会多次破坏这些副本,您需要能够重新开始。并且您不想再次对磁盘进行映像,尤其是当一个磁盘出现故障时!
要回答您的其他问题之一:
Q:为什么不能使用分区镜像创建阵列?
答:要组合(或创建)一组图像文件,您需要使用环回设备。您可以使用 将图像附加到环回设备losetup
。阅读联机帮助页,但它将是类似于losetup --show -f /path/to/COPY-of-image
. 现在,您mdadm
在循环设备上使用(例如,/dev/loop0
)。
确定原始数组布局
您需要找出最初用于创建数组的所有 mdadm 选项(因为您之前销毁了该元数据--create
)。然后,您可以--create
完全使用这些选项在两个环回设备上运行。您需要确定元数据版本 ( -e
)、RAID 级别 ( -l
, 似乎为 0)、块大小 ( -c
)、设备数量 ( -n
, 应为 2) 以及设备的确切顺序。
最简单的方法是获取两个新磁盘,然后放入 NAS,然后让 NAS 在它们上创建一个新阵列。最好与最初使用的 NAS 固件版本相同。IOW,重复初始设置。然后将磁盘拉出,并mdadm -E
在其中一个成员上使用。这是一个来自 RAID10 阵列的示例,因此略有不同。我省略了一堆行来突出显示您需要的行:
Version : 1.0 # -e
Raid Level : raid10 # -l
Raid Devices : 4 # -n
Chunk Size : 512K # -c
Device Role : Active device 0 # gets you the device order
Array State : AAAA ('A' == active, '.' == missing)
Run Code Online (Sandbox Code Playgroud)
注意:我将假设您在这里使用 ext2/3/4;如果没有,请为 NAS 实际使用的文件系统使用适当的实用程序。
尝试使用这些选项创建(在环回设备上)。看看e2fsck -n
能不能认出来。如果不是,请停止阵列,然后使用其他顺序的设备重新创建阵列。再试e2fsck -n
一次。
如果两者都不起作用,您应该回到您认为正确的顺序,并尝试备份超级块。该e2fsck
手册页告诉你什么号码使用; 你几乎可以肯定有一个 4K 的块大小。如果所有备份超级块都不起作用,请停止阵列,然后尝试其他磁盘顺序。如果这不起作用,您可能有错误的--create
选择;从图像的新副本重新开始并尝试一些不同的选项——我会先尝试不同的元数据版本。
一旦你让 e2fsck 运行,看看文件系统损坏的严重程度。如果它完全被破坏,那可能意味着您的块大小错误(停止并重新创建数组以尝试更多)。
复制数据。
我建议让 e2fsck 尝试修复文件系统。这确实有破坏文件系统的风险,但是,这就是您要处理副本的原因!然后你可以挂载它,并复制数据。请记住,某些数据可能已损坏,而损坏可能是隐藏的(例如,文档的一页可能已被 NULL 替换)。
那你就麻烦了。您的另一种选择是猜测直到最终成功,或者了解足够的磁盘格式以使用十六进制编辑器来弄清楚。可能有一两个实用程序可以帮助解决这个问题;我不知道。
或者,聘请数据恢复公司。