如何修复损坏到MBR的GUID硬盘驱动器


6

我在OS X 10.9.5上使用2013年末的iMac。

我有一个3TB硬盘驱动器,有一个不寻常的问题。

它是Western Digital 3TB Red WD30EFRX。

我用两个分区格式化它,都是1.5TB。

一个是1TB驱动器的可启动备份。备份由Carbon Copy Cloner完成,并经过几次测试和验证,以确保其有效。

另一个是我的所有共享媒体,如视频和音乐。

我用了好几个月,然后有一天它没用。

在我对它进行任何诊断之前,我在另一个机箱中尝试了它。这没有用。

磁盘工具可以看到磁盘但不能看到分区,验证磁盘的选项是否为灰色。

我使用了终端的磁盘工具,看到整个驱动器都列为'Fdisk_partition_scheme'。

我认为这是问题,因为我从未使用过Windows,也没有将硬盘格式化为这种格式。我从未使用过训练营或平行或类似的程序。

我确定我将驱动器格式化为'GUID_partition_scheme'并且我在Mac上长时间使用它没有问题的事实应该确认。

我认为目录格式已损坏,并从“GUID_partition_scheme”更改为“Fdisk_partition_scheme”,导致驱动器不可读。

磁盘工具终端文本:

/dev/disk1  
   #:                       TYPE NAME                    SIZE       IDENTIFIER  
   0:     FDisk_partition_scheme                        *3.0 TB     disk1  
   1:                       0xEE                         3.0 TB     disk1s1  

diskutil info disk1  
   Device Identifier:        disk1  
   Device Node:              /dev/disk1  
   Part of Whole:            disk1  
   Device / Media Name:      HGST Media  

   Volume Name:              Not applicable (no file system)  

   Mounted:                  Not applicable (no file system)  

   File System:              None  

   Content (IOContent):      FDisk_partition_scheme  
   OS Can Be Installed:      No  
   Media Type:               Generic  
   Protocol:                 USB  
   SMART Status:             Not Supported  

   Total Size:               3.0 TB (3000592494592 Bytes) (exactly 5860532216 512-Byte-Units)  
   Volume Free Space:        Not applicable (no file system)  
   Device Block Size:        4096 Bytes  

   Read-Only Media:          No  
   Read-Only Volume:         Not applicable (no file system)  
   Ejectable:                Yes  

   Whole:                    Yes  
   Internal:                 No  
   OS 9 Drivers:             No  
   Low Level Format:         Not supported  

我做了一些阅读并下载了gdisk但尚未对其进行任何更改。

gdisk终端文本:

GPT fdisk (gdisk) version 1.0.0  

Partition table scan:  
  MBR: protective  
  BSD: not present  
  APM: not present  
  GPT: not present  

Creating new GPT entries.  

Command (? for help):  

当然,我的最终问题是:有没有办法将我的驱动器重新格式化为原始的GUID格式,1.5TB分区而不会丢失所有数据?

我希望只需将目录从MBR更改回原始GUID,即可恢复原始分区和文件和目录。

在此先感谢您的帮助。

编辑:我google了如何检查GUID分区表的最后一个扇区,并没有找到太多的帮助。我确实尝试了gpt命令,它没有找到主要或次要标题:

sudo gpt recover /dev/disk1
Password:
gpt recover: /dev/disk1: no primary or secondary GPT headers, can't recover

编辑:转储头的输出:

sudo dd if=/dev/disk1 count=1 skip=8 | xxd
Password:
1+0 records in
1+0 records out
512 bytes transferred in 0.000337 secs (1518730 bytes/sec)
0000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

fdisk的输出:

sudo fdisk /dev/disk1
Disk: /dev/disk1    geometry: 45600/255/63 [732566527 sectors]
Sector size: 4096 bytes
Signature: 0xAA55
         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: EE 1023 254  63 - 1023 254  63 [         1 - 4294967294] <Unknown ID>
 2: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused 

@klanomath

我尝试了你的方法,它看起来很有希望,但我在几步后停了下来。首先打开卷时,我在右侧的“共享”和“备份”中看到了这两个分区的名称,这是令人鼓舞的。

我认为你的一些数字可能会关闭,因为我的磁盘扇区大小为4096字节,我在数学中看到512。我只是检查一下是否正常。

此外,409642的起始值并不接近HFSJ,几分钟后我退出了find命令。从磁盘HFSJ开始搜索,偏移量为0000209736666

我还重新计算了磁盘的中间部分366283263,从那里我发现了下一个HFSJ的实例,偏移量为1500936938486

在此输入图像描述

所以在那一点上我很高兴,但我停止等待你对重新考虑4096扇区规模的其他部分的建议。

谢谢你的帮助

编辑以添加前三个块的请求屏幕截图:

前三个街区的截图


我要做的第一件事就是看看GPT表的备份是否存在于磁盘的末尾。
大卫安德森

我该怎么办?我主要使用磁盘工具并开始探索gpt fdisk。我也有数据救援3,没有帮助。
junkelly 2015年

你可以谷歌这个:MBR表对它可以处理的磁盘大小有2.2 TB的限制。这是假设扇区(块)大小为512字节。您有一个高级格式化驱动器。这可能意味着您的扇区(块)大小可能是4096字节。实际上你发布的输出distutil显示了这个。这将允许MBR表处理更大的磁盘,但是用于检查磁盘的任何第三方工具可能无法处理高级格式化磁盘。许多工具都是硬编码的512字节扇区(块)大小。他们可能错误地读取此类磁盘。
大卫安德森

如果需要,可以尝试以十六进制格式转储标头。命令是sudo dd if=/dev/disk1 count=1 skip=8 | xxd。你可以发布输出。这里给出了您应该看到的内容的描述。大多数人不能解释十六进制输出,所以我不指望你。无论如何,这是我接下来要做的。如果也不会伤害添加输出sudo fdisk /dev/disk1
大卫安德森

Answers:


8

修复磁盘和恢复GUID分区表的方法与我对类似问题的答案有关:HFS +无效的分配块数硬盘驱动器不再可访问

基本上你必须找到JHFS +卷的特征字符串,使用一些简单的数学和常识,并有一些运气来修复GUID。当面对这个答案的墙壁时,不要忘记你的目标。

此外,还有一些固定的大小和规则(对于512b的逻辑块大小有效 - 4096b设备的规则略有不同),可帮助您确定一些大小以及“”的一些起始块和结束块“删除“分区。

 1. 1st block (block 0)                             = PMBR
 2. 2nd block (block 1)                             = Pri GPT header
 3. 3rd - 34th block (block 2 - block 33)           = Pri GPT table
 4. 41st - 409640th block (block 40 - block 409639) = EFI (aligned)
 5. 409641st - ??? block (block 409640 - block ???) = partition 1 (aligned)
 6. empty space 262144 blocks (aligned)
 7. ??? - ??? block (block ??? - block ???)         = partition 2 (aligned)
 8. empty space 262144 blocks (aligned)
 9. 7 empty blocks to keep alignment
10. the last 33 blocks except the very last one     = Sec GPT table
11. last block                                      = Sec GPT header
12. alignment rule: the start block and the sizes of all partitions (EFI, partition 1 & 2) and the major empty spaces are dividable by 8
13. The 3rd block of a regular JHFS+ volume contains the string "HFSJ" starting at offset 8

本演练不适用于包含Recovery HD的内部或外部磁盘或具有CoreStorage / ExFAT / NTFS卷的磁盘。虽然主要是解决方案的方法类似,但上述一些规则是不同的。

最后一个gpt命令应该产生类似于这个输出的东西:

root# gpt -r -vv show /dev/disk1
gpt show: /dev/disk0: mediasize=3000592498688; sectorsize=512; blocks=5860532224
gpt show: /dev/disk0: PMBR at sector 0
gpt show: /dev/disk0: Pri GPT at sector 1
gpt show: /dev/disk0: Sec GPT at sector 5860532223
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34           6         
          40      409600      1  GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
      409640  2930844728      2  GPT part - 48465300-0000-11AA-AA11-00306543ECAC
  2931254368      262144         
  2931516512  2928753528      3  GPT part - 48465300-0000-11AA-AA11-00306543ECAC
  5860270040      262151         
  5860532191          32         Sec GPT table
  5860532223           1         Sec GPT header

提示:由于我无法在Parallel Desktop中创建与您相同大小的磁盘,因此某些尺寸与原始尺寸不同

制备:

备份Mac,然后分离除要恢复的驱动器之外的所有外部驱动器。
下载并安装wxHexEditor。启用root用户并以root用户身份登录。

提示:使用wxHexEditor时不要使用复制和粘贴。手动输入一切!您可能不小心直接写入磁盘。

术语

:扇区(在wxHexEditor中)
偏移量:以“字节0”开头的相对于设备/卷开头的字节数。例如,块(512)0包含字节0 - 字节511。

确定您的分区边界:

打开计算器。打开wxHexEditor。检查您是否以只读模式工作(“选项” - >“文件模式” - >“只读”)。在菜单栏中转到“设备” - >“打开磁盘设备” - >选择相应的diskNumber。可能是disk1。磁盘应该有一个分区(disk1s1)。请尝试使用红色直线排列wxHexEditor窗口,如下例所示。

然后点击“转到偏移”按钮(用绿色圆圈标记)并输入409640,如下图所示。有时你会两次跳到正确的扇区。通过在计算器中输入偏移量(标记为红色)并将其除以512来重新检查正确的扇区。

在此输入图像描述

如果你看到一张类似的图片,你已经找到了第一个分区的开头(请注意块409642中的字符串HFSJ!)。

现在跳到磁盘中间:按“Go to offset”按钮并输入块编号(磁盘总块数/ 2)~2930266108。
如果您之前使用“磁盘工具”分区磁盘,只需选择下拉菜单中有2个分区。如果您之后调整了两个分区之间的滑块,例如放大的分区1,则必须跳到稍大的偏移。

现在点击“查找”按钮(标有绿色圆圈)并输入HFSJ,如下图所示,点击查找。可能还要等一下。

在此输入图像描述

如果搜索成功,您就找到了第二个分区的开头。记下块偏移量(= BlockOffset2)。在我的示例中,偏移量为1500936455168.如果滚动到较低的偏移数,则磁盘应填充0。

由于您已找到两个卷的起始扇区,其余通常由前面提到的规则1-12确定,因此您现在可以修复GUID表。退出wxHexEditor。如果要求您保存更改,请不要保存!


现在你必须做一些数学运算:

第一个HFSJ字符串通常位于JHFS +卷的第3个块中。

所以第一个JHFS +卷开始于块409640(也是规则5)。第二个JHFS +卷开始于StartBlockOfVolume2 = BlockOffset2 / 512 - 2.在我的例子中,1500936455168 /512 = 2931516514 -2 = 2931516512。

使用第2卷的起始块和规则6的固定空白区域,您可以确定第1卷的结束块:

卷2的第一块 - 262144(规则6) - 1 = EndBlockOfVolume1

在我的例子中,这是2931516512 - 262144 - 1 = 2931254367

SizeOfVolume1 = EndBlockOfVolume1 - 开始块卷1(规则5)+ 1

在我的例子中,这是2931254367 - 409640 + 1 = 2930844728

您唯一需要忽略的是卷2的大小:

根据上面的规则8-11,您现在可以确定第2卷的最后一个块。

区块中磁盘的总大小 - 1(规则11) - 32(规则10)-7(规则9) - 262144(规则8) - 1 = LastBlockOfVolume2

SizeOfVolume2 = LastBlockOfVolume2 - StartBlockOfVolume2 +1


重建一个合适的GPT:

这里我假设您的外部磁盘的标识符是disk1。首先,您必须在终端中卸载外部磁盘:

diskutil umountDisk disk1

用gpt删除当前的fdisk mbr:

gpt create -f /dev/disk1

首先使用以下方法重建EFI条目:

gpt add -b 40 -i 1 -s 409600 -t C12A7328-F81F-11D2-BA4B-00A0C93EC93B disk1

然后添加第一个JHFS +分区条目:

gpt add -b 409640 -i 2 -s SizeOfVolume1 -t 48465300-0000-11AA-AA11-00306543ECAC disk1

然后输入:

diskutil umountDisk disk1

并添加第二个JHFS +分区条目:

gpt add -b StartBlockOfVolume2 -i 3 -s SizeOfVolume2 -t 48465300-0000-11AA-AA11-00306543ECAC disk1

然后再输入:

diskutil umountDisk disk1

输入exit并退出终端。

打开“磁盘工具”并验证磁盘和两个卷是否有错误,但不要修复它们。如果未找到任何错误,请装入卷。


附录:4k外壳中的4k设备

如果你碰巧有一个高级格式硬盘驱动器,在一个仅4k的机箱中有一个4096字节(4K)扇区大小(一个硬盘驱动器机箱,控制器没有正确报告AF硬盘的512字节的逻辑块大小)一些修改必须对上述解决方案做出:

要跳转到给定的扇区,您必须将上述数据除以8。

例子:

  • 代替跳转到块(512b)409640以找到卷1的假设开始扇区,跳转到块(4096b)51205。

  • 要查找硬盘中间跳转到磁盘总块数(512b)/ 16而不是磁盘总块数(512b)/ 2

数学部分保持不变。虽然可能令人困惑但使用块(512b)或块(4096b)没有太大区别。通过在重建适当的GPT部分后引入因子1/8,可以很容易地采用变化。

棘手的是重建一个合适的GPT部分。gpt命令会检测512 B或4096 B块吗?

我确实会从512 B开始并首先添加最后一个分区(原因如下所述):

gpt add -b StartBlockOfVolume2 -i 1 -s SizeOfVolume2 -t 48465300-0000-11AA-AA11-00306543ECAC disk1

自从您发布截图后,我甚至可以输入正确的值:

volume2的第二个块(4096b)从偏移量1500936941568开始 - >第一个块(4096b)从偏移量1500936941568 - 4096 = 1500936937472开始。这是块(4096b)1500936937472/4096 = 366439682或块(512b)= 8 x 366439682 = 2931517456。

磁盘的最后一个块(4096b)是块号为732566526的732566527块。使用上面的规则(规则8-11),卷2的最后一个块(4096b)是732533754,卷2的大小是732533754 - 366439682 = 366094072块(4096b)。
磁盘的最后一个块(512b)是块号为5860532215的5860532216块。根据上面的规则,卷2的最后一个块(512b)是5860270032,卷2的大小是5860270032 - 2931517456 = 2928752576块(512b)

gpt add期望4096个B块的正确命令是:

gpt add -b 366439682 -i 1 -s 366094072 -t 48465300-0000-11AA-AA11-00306543ECAC disk1

gpt add期望512个B块的正确命令是:

gpt add -b 2931517456 -i 1 -s 2928752576 -t 48465300-0000-11AA-AA11-00306543ECAC disk1

首先我要输入gpt(512b)命令,因为如果gpt使用4096个B块代替它,它应该给你一个错误 - 磁盘太小:如果使用秘密4096个B块,volume2将从~12 TB开始并结束在24 TB。如果输入gpt(4096b)并秘密使用512 B块,则可能会破坏卷1,因为分区将从187 GB开始并以373 GB结束。

如果gpt(512b)命令错误 - 并且gpt(4096b)是正确的 - 则错误消息然后指出“gpt add:disk1:设备上没有可用空间”。
然后使用gpt(4096b)代替并重新构建一个合适的GPT:但是将所有值除以8.一个例外是卷的起始块:由于字符串“HFSJ”已经在第一个块(4096b)中,所以你不要不得不减去2/8块(512b)。

如果gpt(512b)命令正确,则可能会安装以前的volume2。您可以使用“磁盘工具”检查音量。

然后使用以下命令卸载disk1:

diskutil umountDisk disk1

并删除分区

gpt remove -i 1 disk1

并重新开始重建适当的GPT:

请重新计算/重新检查上面最后一部分中的所有值。尽管我尽可能准确,但命令/值可能有问题。始终认为块编号和“块数”是不同的:块编号0是第一个块(或块编号455是第456块)。


最后,我创建了一个Excel表来进行数学运算。它可以在这里找到

截图:

在此输入图像描述


我希望这可以恢复你丢失的音量。

如果你遇到问题(例如,你找不到第二卷的正确起始部分),验证会引发很多错误,有疑问或问题立即停止并与@klanomath发表评论联系我!


@klanomath请重新上传excel电子表格 - 旧的上传已过期,这是一个非常有用的工具。

@ Max108我已经更新了链接,现在可以在github上找到该文件。
klanomath 2016年
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.