如何在另一台机器上作为mdadm raid 1一部分的磁盘上装载/恢复数据?


18

一些背景

  • 磁盘本身是由一位朋友“处理过”的,据说仍然完好无损,并且仍可安装/恢复。
  • 该磁盘是Ubuntu 12.04上的软件团队1的一部分
  • 原始RAID 1中的另一个磁盘已格式化并用于其他目的,从技术上讲,使当前磁盘(有问题的磁盘)在RAID中仍然不存在

我已经尝试过的

  • 基本安装

    • 我在fstab中添加了一个条目,将磁盘标记为ext3 / ext4并尝试挂载。
    • 安装后出现以下错误

      wrong fs type, bad option, bad superblock on

    • 并在dmesg中

      EXT4-fs (sdc1): VFS: Can't find ext4 filesystem

  • 我试图找到磁盘的文件系统类型,并提出了

    $sudo file -s /dev/sdc
    /dev/sdc: x86 boot sector; partition 1: ID=0x83, starthead 254, startsector 63, 1953520002 sectors, code offset 0xb8

我需要帮助的地方/我的问题

  • 有没有办法在不损坏数据的情况下将磁盘转换为ext4?
  • 有没有简单的方法可以挂载Linux 83文件类型磁盘并恢复数据?
  • 我有另一个当前可用的磁盘,以防以某种方式重建团队
  • 我的主要目标是从磁盘恢复数据。我愿意接受所有选择。

更新资料

一些命令的输出

  • fdisk -l / dev / sdc

    $fdisk -l /dev/sdc

    Disk /dev/sdc: 1000.2 GB, 1000204886016 bytes
    255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 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 identifier: 0x0005ed9c

    Device Boot Start End Blocks Id System
    /dev/sdc1 63 1953520064 976760001 83 Linux

  • 文件-s / dev / sdc1

    $file -s /dev/sdc1
    /dev/sdc1: data

  • hexdump -C -n 32256 / dev / sdc(不确定是否可以帮助)

    $hexdump -C -n 32256 /dev/sdc`
    00000000  fa b8 00 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |................|
    00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
    00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
    00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|
    00000040  4c 02 cd 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|
    00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001b0  00 00 00 00 00 00 00 00  9c ed 05 00 00 00 00 fe  |................|
    000001c0  ff ff 83 fe ff ff 3f 00  00 00 82 59 70 74 00 00  |......?....Ypt..|
    000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00007e00
    

问题在于该分区认为它具有一些RAID卷,而不是ext4fs。而且内核是正确的。但是,由于它是raid 1,所以恰好是ext4fs。一个mount -f ext4 /dev/sdc1 /mountpoint应该做的把戏。-f 强制使mount假定ext4而不是寻找文件系统
Bananguin

1
强制安装不会出现任何错误,但是安装点为空白。数据丢失了,或者安装没有按预期工作。进行一次df显示,表明新安装的磁盘的使用率为2%,大大低于预期。
亚当

@ user1129682,如果mount表示它不是ext4,则不是...试图强制它不会有帮助。
psusi

@psusi:为我工作。Gilles的答案解释了为什么它在某些情况下会起作用
Bananguin

@Bananguin你的意思不是mount -t ext4吗?-f标志用于“假”安装(ubuntu 14.04)。
Quantum7 2013年

Answers:


12

这在Ubuntu 14.04中表现出色:

sudo -i
mdadm --assemble --scan

你会得到:

mdadm: /dev/md/1 has been started with 1 drive (out of 2)

然后挂载并查看您的文件:

cd /mnt && mkdir to-restore-md1 && mount /dev/md1 to-restore-md1
ls -la to-restore-md1

在作为阵列一部分的故障硬盘上出现“存在但不是md阵列”的情况,而且效果比所有其他建议都更好。已成功安装,现在正在忙于复制数据。
Zayne S Halsall,2013年

此选项对我来说效果很好。RAID1中有2个Intel SSD。拉出一个,并从SATA端口中将slave移至运行suse linux的PC。最初显示为/dev/sdc/dev/md127。那时mdadm --assemble --scan这就造成了/dev/md/Volume0_0p1/dev/md/Volume0_0p2等相对应的是磁盘上的4个分区。P2是我需要的一个:mkdir /p2 随后mount /dev/md/Volume0_0p2 /p2安装它是EXT3,我可以轻松地访问和复制数据。它还将其安装为可读写。
罗恩

你让我今天一整天都感觉很好!谢谢!
Gooshan

有时,该--scan模式无法启动缺少磁盘的阵列,就我而言,我不得不停止自动组装的阵列,然后通过mdadm --assemble --force /dev/md/1 /dev/sdc1
BrunoJCM '19

7

Linux mdraid具有几种元数据格式。格式0.9和1.0将元数据放在包含设备的末尾,而有效负载(文件系统)从设备的开头开始,可以直接访问而无需经过raid层。格式1.1和1.2分别将元数据放在包含设备的中间和开头,因此有效负载处于偏移位置。

Ubuntu安装程序使用1.2元数据格式创建卷,因此您的数据在元数据之后而不是在设备开始处开始。

访问该数据的最简单方法是组装RAID设备。在RAID-1卷中,单个设备就足够了。

madadm -A /dev/sdc1

(在这里停止,除非您喜欢痛苦。)

您还可以偏移量访问数据。我能看到的唯一一点是您是否必须在不支持1.x mdraid格式的旧内核中工作。首先,确定偏移量mdadm -E /dev/sdc1:寻找行Data Offset : SSS sectors。mdadm扇区为512字节。

sectors=$(mdadm -E /dev/sdc1 | awk -F: '$1 ~ /Data offset/ {print $2}')
bytes=$(($sectors * 512))
losetup -f -o $bytes /dev/sdc1

绝望的是,对于1.x格式,数据偏移量存储在元数据的字节128-135中,即低端字节1。设备开始后的1.2元数据为4096字节。

您还可以更改分区表以使其进一步启动。算术时要非常小心。仅当您想在无法访问RAID设备的旧系统中长期使用磁盘时,才这样做。

¹ 还是具有平台字节序?我不确定。


数据可以从不同的偏移量开始(请参见mdadm -E /dev/sdc1确切位置),但对于1.2元数据来说肯定不能从4k开始,因为4k正是存储元数据的位置。又见unix.stackexchange.com/q/57477/22565
斯特凡Chazelas

@StephaneChazelas糟糕,是的,放屁了。谢谢。
吉尔(Gilles)'所以

3
mdadm -A /dev/sdc1输出mdadm: device /dev/sdc1 exists but is not an md array.我进一步使用了mdadm,看看是否还有其他信息... mdadm --misc --examine /dev/sdc1输出mdadm: No md superblock detected on /dev/sdc1.。有没有一种方法可以重写此磁盘上的超级块,以将其标记为RAID组件可用的磁盘?
亚当,

@Gilles A mdadm -E /dev/sdc为我返回了以下内容:/dev/sdc: MBR Magic : aa55 Partition[0] : 1953520002 sectors at 63 (type 83) 但是没有关于/ dev / sdc1的信息
Adam

1
@Adam如果mdadm找不到其元数据,则您无能为力:您不能强迫它做某事,因为它不知道要做什么。您需要寻找一个文件系统,如果psusi的建议在任何地方都没有成功,那么前景将是一片黯淡。也许磁盘前几千字节的十六进制转储可能会启发某人(请注意,它可能会公开一些机密数据)。
吉尔斯(Gilles)'所以

5

令我惊讶的是,我仅通过使用foremost就能够恢复数据。

这里获得的帮助是无价的。在尝试了各种建议的组合以及自己的混入之后,理想的方法(正常安装和使用磁盘)似乎不再是一种选择。在这种情况下,依靠数据恢复是我的解决方案。


我意识到这是前一段时间!但是您还记得是否无需挂载分区就可以使用它吗?
PhillipOReilly

抱歉,我不再记得这个细节了。:/
亚当

3

看来您已经改变了mdadm超级块。如果它曾经在那里并且格式为1.1或1.2,则很可能文件系统位于2048个偏移扇区。您可以运行e2fsck /dev/sdc1?offset=2048以强制其从该偏移量开始查找文件系统。如果找到它,则可以修改分区表以指向文件系统实际启动的位置。您可以使用parted /dev/sdcunit s命令来使用扇区单位。 print在表中,请注意起始和终止扇区,然后rm是分区,然后使用mkpart并使用相同的终止扇区重新创建分区,但是将偏移量添加到起始扇区。

如果2048不起作用,您也可以尝试1985。


运行e2fsck /dev/sdc1?offset=2048(我也运行offset = 1985)输出Bad magic number..Superblock invalid...,并提示超级块已损坏,并尝试使用备用超级块运行e2fsck。似乎我应该为它提供一个替代的超级块以继续前进。
亚当

@Adam,不,您只需要获取正确的偏移量即可。 testdisk应该能够进行详细的扫描并为您修复分区表。
psusi

testdisk对我来说是全新的领域。一个基本的运行(分析)节目No ext2, JFS, Reiser.. marker. Bad relative sector. No partition is bootable.还提供以下内容:1 P Linux 0 1 1 121600 254 63 1953520002为了帮助解决这种情况,我该如何理解?
亚当

@Adam,我自己从未使用过它,我只知道它应该能够扫描并找到超级块。您确实在整个磁盘而不是分区上运行它?
psusi

在整个磁盘上运行分析后,它没有显示任何分区。目前正在运行深度扫描。如果这没有任何作用,我不确定从这里去哪里。
亚当
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.