无法访问外部硬盘。“磁盘结构已损坏且无法读取”

Anu*_*ana 11 hard-drive data-recovery bad-sectors chkdsk external-hard-drive

我有一个 1 TB AgentGoFlex 希捷外置硬盘。

最近它导致了一些问题,比如一些有数据的文件夹没有显示任何文件。一些文件夹没有打开等。

所以我尝试chkdsk在 Windows 8 上运行,但它没有成功完成。所以我卸下了硬盘。现在当我将硬盘连接到系统时,它没有被识别。在 Linux 中它根本不被识别。

在 Win8 中,当我尝试从命令提示符访问磁盘时,它显示“磁盘结构已损坏且无法读取”。

Evenchkdsk现在失败并出现错误:“文件系统是 NTFS。无法确定卷版本和状态。chkdsk 中止。”

当尝试从F运行“检查实用程序”时 → 右键单击​​ → 属性 → 工具 → 检查,出现以下错误。

错误截图:无法进行磁盘检查,因为Windows无法访问磁盘

格式化磁盘不是一种选择,因为我有非常重要的数据。

请建议可以做什么来启用对硬盘的访问。

LSe*_*rni 10

首先,不要在磁盘上做更多的事情(至少永远不要写入它)。未被识别的磁盘(与“被识别并发现为空或具有不可读数据”相反)似乎表明磁盘已被完全炸毁,这chkdsk不会发生,或者磁盘的分区表或几何结构有问题,或 USB 外壳处理它的方式。硬件故障也是可能的。

当 USB 机箱尝试在磁盘和它们所连接的计算机之间进行协商时,这可能并且将会发生。因此,首先要做的是在最接近物理级别的(显然更大的)磁盘上拍摄磁盘映像,dd在 Linux 下使用。然后,您可以根据自己的喜好修改图像副本,而不会进一步损坏真实磁盘。

更新:Linux 中的设备识别

我们的“外部磁盘”中有不少于三个实体。USB 外壳硬件,作为块设备公开。机箱内的物理磁盘。物理设备,即LBA扇区从头到尾的顺序。最后是零个或多个数据分区,托管文件系统。要“识别”并显示在桌面上,链的所有链接都需要工作。但是要拍摄物理设备的图像,您只需要前两个。如果您插入设备并运行命令行dmesg(以 root 身份),您应该看到如下内容:

[4984939.028491] usb 8-6: new high speed USB device using ehci_hcd and address 3
[4984939.166658] usb 8-6: configuration #1 chosen from 1 choice
[4984939.170660] scsi7 : SCSI emulation for USB Mass Storage devices
[4984939.172003] usb-storage: device found at 3
[4984939.172005] usb-storage: waiting for device to settle before scanning
Run Code Online (Sandbox Code Playgroud)

...这是外壳被识别,然后识别自身及其内容:

[4984939.170660] usb 8-6: New USB device found, idVendor=1058, idProduct=1021
[4984939.170660] usb 8-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[4984939.170660] usb 8-6: Product: Ext HDD 1021
[4984939.170660] usb 8-6: Manufacturer: Western Digital
[4984939.170660] usb 8-6: SerialNumber: 574D43305431303831303734
[4984944.400970] usb-storage: device scan complete
Run Code Online (Sandbox Code Playgroud)

接下来你会看到司机告知其几何形状,性质,以及其隐含的设备节点,在这里sdd(SCSI磁盘四,因为sdasdbsdc已经采取的):

[4984944.404739] scsi 7:0:0:0: Direct-Access     WD      Ext HDD 1021    2021 PQ: 0 ANSI: 4
[4984944.404739] sd 7:0:0:0: [sdd] 1953519616 512-byte hardware sectors (1000202 MB)
[4984944.407367] sd 7:0:0:0: [sdd] Write Protect is off
[4984944.407369] sd 7:0:0:0: [sdd] Mode Sense: 17 00 10 08
[4984944.407371] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[4984944.408741] sd 7:0:0:0: [sdd] 1953519616 512-byte hardware sectors (1000202 MB)
Run Code Online (Sandbox Code Playgroud)

然后内核识别出有一个分区(如果你没有看到这个,则该分区不存在或无效):

[4984944.411497]  sdd: sdd1
Run Code Online (Sandbox Code Playgroud)

现在 Linux 拥有它需要的一切并报告成功的附件:

[4984944.416739] sd 7:0:0:0: [sdd] Attached SCSI disk
[4984944.416739] sd 7:0:0:0: Attached scsi generic sg4 type 0
Run Code Online (Sandbox Code Playgroud)

于是开始搜索数据分区,即,好的,我们有sdd1,但是那里有什么?,答案是:

[4984997.498613] NTFS driver 2.1.29 [Flags: R/W MODULE].
[4984997.554613] NTFS volume version 3.1.
[4984997.568859] NTFS-fs error (device sdd1): load_system_files(): $LogFile is not clean.  Mounting read-only.  Mount in Windows.
[4985390.027808] NTFS-fs error (device sdd1): ntfs_remount(): Volume has errors and is read-only.  Cannot remount read-write.
[4985442.423299] NTFS volume version 3.1.
[4985442.425032] NTFS-fs error (device sdd1): load_system_files(): $LogFile is not clean.  Mounting read-only.  Mount in Windows.
Run Code Online (Sandbox Code Playgroud)

以上是一个“好”的坐骑。但是,仅仅知道该设备sdd,或sdc或者sdb,允许我做一个二进制副本(假设我有足够的可用空间/mnt/backupdisk):输入文件/dev/sdd,输出文件DiskImage.raw块大小为1 MB

# dd if=/dev/sdd of=/mnt/backupdisk/DiskImage.raw bs=1M
Run Code Online (Sandbox Code Playgroud)

请注意,输入文件是/dev/sdd 和不是 /dev/sdd1 (或任何其他数字)。现在,如果我愿意,我可以在 中找出数据分区的偏移量DiskImage.raw,并在循环设备的帮助下安装它。在这里你会发现肮脏的细节。

第一次恢复尝试

要做的第二件事是将物理磁盘放入另一个机箱中,从而确保机箱良好,并有机会让新机箱正确解释磁盘。如果磁盘重新出现,则可能是先前损坏的机柜。以防万一,备份所有新发现的驱动器内容,验证备份,使用磁盘覆盖实用程序将磁盘归零,使其变得完全愚蠢(设备链中不能有两个具有不同意见的设备),重新格式化它从 Windows 本机并恢复数据。这是一个幸运的镜头,但我看到它发生了;并且这种尝试并不太昂贵,好的外壳售价约为 19.99 美元。

如果原始机箱坏了,您将无法重新格式化磁盘,或者无法访问该磁盘。您可以重试新的外壳,如果它的作品,无论是更换旧的外壳,或继续使用新的(但如果新机箱是,这是值得相当比US $ 19.99厄尔尼诺小气鬼更好)。

专业康复

专业的恢复服务,您可以通过 Google 找到。一个不太诚实的方法是通过物理磁盘发送,如果你得到“是的,没有硬件损坏,我们可以恢复你的所有数据,只需 US$$$$$ $$!” 回答 – 那么你就会知道数据仍然可以挽救。因此,您可以尝试在自己制作的映像备份上免费尝试,只需支付诊断和磁盘 S&H 费用。如果你失败了,咳出请求的面团的选项仍然存在。如果硬件损坏,专业的服务基本上是你唯一的选择。有几种巫毒技巧可以(暂时)恢复“死”磁盘,通常至少可以恢复最重要的数据,没有一个保证每次都能正常工作(加热磁盘,冷却它,“旋转”它——我什至看到有人建议巧妙地将它敲击硬表面)。所有这些都会造成更大的伤害,即,您必须确保使用第一次起作用的技巧,否则您将永远杀死磁盘。我只是说这解释了为什么你会看到关于恢复盘成功案例:有这样的故事。但是,如果您想(主要)确定它会发生在您身上,那么 – 聘请专业人士。

如果你确定硬件没问题——磁盘旋转、没有嘎嘎声、没有奇怪的声音或嗡嗡声、没有咔嗒咔嗒的重新校准——那么发生的“所有”就是chkdsk弄乱了一些数据。

DIY恢复

“家庭”恢复通常会像这样(基本上,一旦硬件损坏打折,专业人士会做的事情相同),在磁盘映像副本上工作:

  • 检查磁盘映像的第一个扇区是否是有效的分区表。如果不是,请扫描磁盘映像以查找有效的分区表或可识别的 NTFS 或 FAT32 引导扇区,具体取决于设备上的 FS(对于 1 TB 设备,NTFS 似乎是唯一的逻辑可能性)。无论哪种方式,您都应该在前几兆字节内找到一些内容。

  • 如果找到分区表,请验证数据分区是否位于分区表所说的位置。如果不是,这是个好消息:可能是分区表出了问题。修复它很容易(几个 Linux 分区编辑器会这样做),并且磁盘可能会 100% 恢复。为了安全起见,尝试在 Linux 中使用循环设备以只读模式挂载数据分区,以查看它是否可读。如果是,则确认分区 borking,并且磁盘可能会在确定和完全恢复的过程中发出声音。如果不是,则分区可能是正确的,并且数据分区的(部分)已被重写。这不好; 请参阅下面的“事情变糟”。

  • 如果找到并且有效,请对照驱动器几何结构检查它,如果它们不匹配,这实际上也是一件好事,因为您可能已经找到了问题的根本原因。您可以强制物理几何到内核(并在 Linux 启动时获取)。看看新的几何图形是否会导致在 Linux 中识别磁盘。如果是,请备份数据,验证备份是否正确,然后将磁盘归零dd(将几兆字节的零分配给适当的sd设备就足够了)。关闭计算机电源(不要只是重新启动;好吧,它是偏执的,但它花费很少并且可以完成一些事情),然后启动 Windows 并让它将现在毫无头绪的磁盘格式化为它认为最好的格式。这可确保与 Windows 不发生冲突。恢复磁盘上的数据。享受。

  • 如果几何技巧不起作用,或者找不到分区,或者一旦发现它似乎是空的,事情就会变糟。您需要一些能够扫描磁盘映像以搜索丢失数据的数据区域(MFT 等)的恢复工具。一旦找到,解释它们以获取数据。这是一项艰巨的工作,不能总是完全自动化。在更低和更绝望的层面上,这涉及扫描单个文件的签名,希望它们位于磁盘中的连续块中。不过,我很乐意将这种操作留给专业人士。我用旧的 FAT 磁盘做了几次,总是成功。我又做了一次,大约 50% 成功,使用更新、更大、碎片更多的 FAT32 磁盘。我尝试过 有几次,在更复杂的 NTFS 和 ext4 文件系统上,结果不佳(但我有完整备份,并没有真正全力以赴)。

从 Linux 手动恢复

好的,所以您尝试在 Linux 中挂载分区并出现错误(注意 /dev/sdc 是不同的东西 - 图像指的是)。/dev/sdcN /dev/sdc

# mount -t ntfs /dev/sdc1 /mnt/recovery
ntfs_mst_post_read_fixup_warn: magic: 0x00000000  size: 1024   usa_ofs: 0  usa_count: 65535: Invalid argument
Record 1 has no FILE magic (0x0)
Failed to open inode $MFTMirr: Input/output error
Run Code Online (Sandbox Code Playgroud)

...这似乎表明该分区,正如系统所认为的那样,是错误的或严重损坏的。让我们先看看第一个选项:

# fdisk /dev/sdc
Run Code Online (Sandbox Code Playgroud)

你会得到这样的东西:

Disk /dev/sdc: 1000.2 GB, 1000204885504 bytes
1 heads, 63 sectors/track, 31008335 cylinders, total 1953525167 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: 0x9d2b7596

Device       Boot      Start    End          Blocks       Id  System
/dev/sdc1              63       1953520127   976760032+   7   HPFS/NTFS/exFAT
Run Code Online (Sandbox Code Playgroud)

下一步将是检查实际分区启动。通过搜索图像文件(或/dev/sdc),我们将搜索 NTFS 签名:

  00000000:EB 52 90 4E 54 46 53 20 -20 20 20 00 02 08 00 00 .R.NTFS ........ 
  00000010:00 00 00 00 00 F8 00 00 -3F 00 FF 00 3F 00 00 00 ........?...?... 
  00000020:00 00 00 00 80 00 80 00 -4A F5 7F 00 00 00 00 00 ........J....... 

# dd if=/dev/sdc bs=512 count=1 skip=63 2>/dev/null | hexdump -C | head -n 1
Run Code Online (Sandbox Code Playgroud)

...根据上面的数据,我们希望 NTFS 启动位于扇区 63,这就是我们设置skip. 此外,我们将尝试使用第一个(比如)兆字节中的每个扇区......

# dd if=/dev/sdc bs=512 count=2000000 2>/dev/null | hexdump -C | grep "00:EB 52 90 4E 54 46 53"
Run Code Online (Sandbox Code Playgroud)

...只是为了确保只有一个引导扇区(我遇到过这种情况。在 FAT32 磁盘上,但仍然如此)并且任何地方都没有读取错误。

你的结果

00007e00  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
Run Code Online (Sandbox Code Playgroud)

正是我们所期望的:扇区 63 给出了 63×512 = 32256 = 7e00 十六进制的偏移量。NTFS 引导扇区在那里,分区表似乎是正确的

所以我们现在可以复制一大块/dev/sdc1,比如说,/tmp/mydisk.img并尝试从 Linux 修复它。这不会损坏物理磁盘,它仍然可以用于其他尝试。既然现在我们知道 PT 是正确的,我们可以将其/dev/sdc1用于副本并抱有我们以前无法做到的希望:

# dd if=/dev/sdc1 of=/tmp/mydisk.img bs=1G count=10
...after copying 10 gigabytes...

# ntfsfix /tmp/mydisk.img
Run Code Online (Sandbox Code Playgroud)

如果 NTFSfix 不起作用,那么我们就有麻烦了。有更准确的实用工具,可以尝试,但。如果您需要恢复 JPEG 图片文件并且文件系统没有碎片化,这可以通过查找 JPEG 标头自动完成。几乎相同,适用于 PDF、TIFF 和 Office 文档,只是不知道如何识别它们(对于 JPEG,我会 :-))。作为最后的选择,我找到了这些人——我不认识他们,与他们无关,也不会接受任何指责。但是,随着这些事情的发展,价格非常合理。