一些背景
我的一个朋友在他的办公室使用 NAS Buffalo-LS-WVL,每个磁盘有两个 1TB。这两个磁盘似乎已作为 raid 1 挂载,但正如您将读到的那样,它们可能并非如此。 NAS出现了一些极其缓慢的问题,然后突然就不再工作了。我被叫去拯救他的数据。两个磁盘具有完全相同的分区:1 个物理分区和 6 个逻辑分区,数据位于第 6 个分区(0.95 TB 中大约 80 GB)。
磁盘/dev/sdd
似乎会出现硬件问题(速度缓慢、扇区读取错误等),而 /dev/sde 是物理功能良好的磁盘。
目标是提取 NAS 中包含的数据。如果不是所有数据,提取的数据越多越好。这些数据对于我这位朋友的公司至关重要。
我已经尝试过了
第一次尝试:单独安装磁盘
这是第一次尝试,希望它能起作用,我尝试获取每个磁盘并单独安装它,然后我收到了以下消息:
root@ubuntu:~# mount /dev/sdd6 /mnt/n -or- root@ubuntu:~# mount /dev/sde6 /mnt/n
两者都给了我同样的信息:
mount: unknown filesystem type 'linux_raid_member'
第二次尝试:创建磁盘阵列 RAID 1 并尝试挂载它们
好吧,如果我无法单独安装它们,那么我需要创建一个磁盘阵列。让我们假设(最合乎逻辑的)原始配置是 raid 1,并且一次使用一个磁盘:
root@ubuntu:~# mdadm --create --run --level=1 --raid-devices=2 \ /dev/md/md-singolo-e6--create-missing /dev/sde6 missing
给出:
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.
所以,看起来最初的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/
给了:
mount: /dev/md127: can't read superblock
另一个磁盘也给出了完全相同的结果。
第三次尝试:创建磁盘阵列磁盘阵列0并尝试安装它们
好的,既然已经说过是 Raid0,那么我们就开始吧:
root@ubuntu:~# mdadm --create --run --level=0 --raid-devices=2 \ /dev/md/md001hw /dev/sdd6 /dev/sde6
给出:
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.
好的,创建后我尝试安装它:
root@ubuntu:~# mount /dev/md/md001hw /mnt/n mount: you must specify the filesystem type
此时指定的所有 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
这适用于有问题的磁盘(最小块大小,更安全)
root@ubuntu:~# dd if=/dev/sde6 of=/media/pietro/4TBexthdd/sdd6-noerror-sync.img conv=noerror,sync
获得这两个映像后,我尝试使用上面指定的命令将它们用作 RAID 0。无事可做,得到的答案是图像“不是块设备”并且它不会创建数组。
第五次尝试:逐字节挽救一些数据
好的,如果正确的安装不起作用,让我们通过逐字节读取以及页眉和页脚信息来提取数据。我用了*最重要的是*在每个磁盘上执行此作业:对于磁盘 1:
root@ubuntu:~# foremost -i /dev/sde6 -o /media/pietro/4TBexthdd/foremost_da_sde6/
它会创建带有文件扩展名的子文件夹,但其中根本不包含任何内容。而对于磁盘 2(损坏的磁盘):
root@ubuntu:~# foremost -i /dev/sdd6 -o /media/pietro/4TBexthdd/foremost_da_sdd6_disco2/
子文件夹结构都不是由mostly 创建的。
当我在 RAID 0 阵列上尝试时,结果相同:
root@ubuntu:~# foremost -i /dev/md/md001hw -o /media/pietro/4TBexthdd/foremost_da_raid_hw/
两个子文件夹结构均未创建。
我需要帮助/我的问题
- 第一个也是最重要的问题:如何拯救数据?有人有任何我没有尝试过的提示吗?
- 你们中有人能提出与我所做的不同的建议吗?
其他问题:
- 我是新手
mdadm
,我做的一切都正确吗? - 2011 年 9 月 26 日创建的原始阵列实际上是在 Raid 0 模式下创建的吗?
- 为什么我无法使用分区映像创建阵列?
附录
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
答案1
我讨厌传递坏消息,但是……
问:我是 mdadm 新手,我所做的一切都正确吗?
答:不。事实上,你几乎以最具破坏性的方式做了所有事情。您过去常常--create
销毁阵列元数据,而不是使用--assemble
它可能允许您读取数据(至少在磁盘能够读取数据的范围内)。这样做时,您会丢失关键元数据(特别是磁盘顺序、数据偏移量和块大小)。
此外,--create
可能在关键文件系统结构之上潦草地写了数组元数据。
最后,在您的步骤 (3) 中,我看到 mdadm 抱怨两个磁盘上的 RAID1 — 我希望这是您在两个磁盘上分别尝试 (2) 造成的。我真诚地希望您不要让 RAID1 开始尝试同步磁盘(例如,如果您将两个磁盘都添加到同一个 RAID1 阵列中)。
现在做什么
看来您终于创建了驱动器的映像。你应该这样做第一的,至少在尝试超越基本的任何事情之前--assemble
。但不管怎么说,
如果坏驱动器的映像丢失了大部分/所有扇区,请确定是否值得进行专业数据恢复。文件(和文件系统元数据)在 RAID0 中跨驱动器分割,因此您确实需要同时恢复两者。专业恢复可能能够读取驱动器。
如果图像除少数扇区外大部分正常,请继续。
制作图像文件的副本。仅处理图像文件的副本。我怎么强调都不为过,你可能会多次销毁这些副本,你需要能够重新开始。而且您不想再次对磁盘进行映像,尤其是因为其中一个磁盘出现故障!
回答您的其他问题之一:
问:为什么我无法使用分区镜像创建阵列?
答:要组装(或创建)图像文件数组,您需要使用环回设备。您可以使用 将图像附加到环回设备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)
注意:我假设您在这里使用 ext2/3/4;如果没有,请使用适合 NAS 实际使用的文件系统的实用程序。
尝试使用这些选项创建(在环回设备上)。看看e2fsck -n
还认不认识。如果没有,请停止该阵列,然后使用设备以其他顺序重新创建它。再试e2fsck -n
一次。
如果两者都不起作用,您应该返回到您认为正确的顺序,并尝试备份超级块。联机e2fsck
帮助页告诉您要使用什么号码;你几乎肯定有 4K 块大小。如果所有备份超级块均不起作用,请停止阵列,然后尝试其他磁盘顺序。如果这不起作用,您可能做出了错误的--create
选择;从图像的新副本开始并尝试一些不同的选项 - 我会首先尝试不同的元数据版本。
运行 e2fsck 后,查看文件系统损坏的严重程度。如果它完全被丢弃,这可能意味着您的块大小错误(停止并重新创建数组以尝试更多)。
把数据复制下来。
我建议让 e2fsck 尝试修复文件系统。这确实有破坏文件系统的风险,但是,这就是您处理副本的原因!然后你可以安装它,并复制数据。请记住,某些数据可能已损坏,并且损坏可能是隐藏的(例如,文档的页面可能已被 NULL 替换)。
我无法从 NAS 获取原始参数
那你就有麻烦了。您的另一种选择是进行猜测,直到最终起作用,或者充分了解磁盘格式以使用十六进制编辑器找出它。可能有一两个实用程序可以帮助解决此问题;我不知道。
或者,聘请数据恢复公司。