如何识别和修复磁盘块损坏/无法访问的文件


9

我有一台2011年末的Macbook Pro,运行Mavericks 10.9.2。它唯一的HDD是750GB驱动器,采用Bootcamp格式化。它仍然运行得相当不错,但是在运行碎片整理程序时,我发现其中有一堆文件被碎片整理程序(iDefrag)拒绝移动。

访问文件时,iDefrag报告POSIX错误代码为5。随机选择一个文件并尝试将文件复制到外壳中的另一个位置也会报告错误,这使我认为问题是真实的,并且与磁盘/ FS有关。cp的输出是:

cp: unity_nophysx.nexe: Input/output error

据我所知,错误代码5为“访问被拒绝”,但是碎片整理进程以管理员身份运行,并且在可疑文件上使用sudo运行cp没什么区别。

磁盘实用程序,fsck和Apple硬件测试均声称该磁盘可以使用。没有报告SMART错误,虽然有一些权限错误,但它们与iDefrag抱怨的文件无关,并且Disk Utility声称已对它们进行了修复,没有任何抱怨。

可能有一百个或更多损坏的文件,但仍然只是驱动器的一小部分。据我所知,没有系统文件或关键数据受到影响。虽然检索数据会很不错,但我不介意重新安装或进行备份。在这一点上,我不知道这是否真的是驱动器快要死了,仅仅是由于写入时移动了驱动器而导致的一些坏扇区,还是可以解决的其他一些轻微损坏。我假设最坏的情况是,最有可能的是,我将不得不获得一个稍大的HDD并克隆现有驱动器,以避免必须重建系统。

我的问题确实是我该如何将那些损坏的文件标记为正确的损坏并修复或清除它们,以便磁盘克隆成功并且不会挂在无法访问的文件/块上。Disk Utility没有发现问题,我不知道可以完成此工作的任何命令行或第三方工具。我不想注销整个磁盘并从头开始,因为该驱动器看上去还很健康,所以我正在寻找维修/诊断工具。


我建议您阅读有关SuperUser的非常详细的类似讨论:superuser.com/q/148227
2014年

不幸的是,我在健康的磁盘上测试过:)volitans-software.com/smart_utility.php。它看起来像一个非常简单且严肃的工具。您可以尝试一下,最值得注意的是检查“重新分配的扇区”计数器。
2014年

Answers:


8

如果您面临结构良好的文件系统,并且想要查找磁盘故障块的文件,请按以下步骤操作:

  1. 使用Time MachineCarbon Copy复制器对磁盘进行完整备份

    检查此备份。

  2. 运行以下繁琐而有风险的命令(以防万一您在文件系统结构之外有坏块)(确保引号{}使包含空格的文件名起作用):

    find / -type f -print -exec dd if="{}" of=/dev/null bs=1m \;
    

这个繁重的find命令将为任何普通文件打印其名称(因此不读取它,而仅显示其目录条目),然后继续完整而快速地读取其所有数据块。

在hiting包含坏块的第一个文件,这find将导致内核日志read error/var/log/system.log,它要么放慢或将您的系统,以彻底停止。这将主要取决于硬盘驱动器的容量,以重新定位在专用于此常规修复任务的内部池中找到的坏块。此包含坏块的文件将是的姓氏find

在纸上写下此文件名!假设此文件名为:

/.DocumentRevisions-V100/.cs/ChunkStorage/0/0/0/9

此时,您可以find通过按ctrl+ 快速杀死C。如果很好地杀死它失败了,请使您的Mac崩溃。

重新启动Mac后,直接检查包含错误块的文件:

dd if='/.DocumentRevisions-V100/.cs/ChunkStorage/0/0/0/9' of=/dev/null bs=1m

如果命令正确终止,则错误足够轻,磁盘可以读取该文件并重新分配坏块。

  • 如果命令没有终止,则将无法正常终止它,数据将完全丢失,并且您将不得不再次使Mac崩溃。

在后一种情况下,您必须考虑更换磁盘并从上次备份开始工作。其他一些文件也可能包含坏块,只要您不阅读它们,很长一段时间以来就一直未被发现。

内核不会在从未读取的块上引发读取错误。


啊哈,这绝对是我想要的技巧。首次执行find / dd脚本会触摸磁盘上的所有文件/块,并确保我找到了一堆出现“输入/输出错误”的文件,并且我可以将命令日志简单地输出到文件中,然后grep找出哪些文件是duff。似乎dd命令本身并不足以触发任何类型的自动修复(我什至不知道OS X会执行此操作),但至少它为我提供了一种识别文件的可靠方法。
MrCranky 2014年

从好的方面来说,当操作系统尝试从这些坏块中读取文件时,它不会崩溃或挂死。我May 10 20:42:15 ICE kernel[0]: disk0s2: I/O error.在日志中看到一个弹出窗口,但是不知道是哪个文件触发了它。但是随后命令运行得很愉快。
MrCranky 2014年

您的内核不会与BBFH挂起,因为您的磁盘在其池中仍然有足够的可用块来修复坏块。dd不能解决任何问题,此命令的目的是复制数据并尽快将其转换。磁盘仍然能够修复轻微错误。请注意,磁盘的价格不会影响您的工作。
2014年

嗯,是的,我假设:dd只是一个愚蠢的工具,可以将所有数据从一个文件中删除,然后将其放置在其他位置(在我们的情况下为稀疏文件)。真正重要的是读取与文件关联的每个块。在这种情况下,我没有得到OS X的期望。显然,内核无法读取这些坏块,但是您认为磁盘本身可以并且可以修复它们吗?如果无法从原始坏块中获取数据,该如何将其转移到其他地方?
MrCranky 2014年

很好的问题。磁盘将自动在读取块上重试。每当头部在机械上处于不同位置时。如果此尝试之一成功,则将数据复制到可用于修复故障块的块之一上。坏块被标记为坏块,将不再使用。另一方面,如果所有重试均失败,则不会保存数据,并且在很长一段时间后,磁盘将标记该块为坏块,并为可见磁盘分配一个新的空磁盘。内核将报告不可恢复的磁盘错误。
2014年

4

在引导过程中按住Command+可以在单用户模式下重新S引导。当您看到提示(看起来root #或类似的内容)时,键入fsck -f并按Return。这是Mac内置的文件系统一致性检查工具,可让您查找和修复启动文件系统中的错误。运行此命令,直到看不见**The volume [volume name] was modified.**或工具连续三次失败为止。

如果该工具失败,则可能表明存在更大的问题(但如果没有看到该工具的输出,我将无法告诉您什么)。无论如何,在运行任何磁盘工具之前,请确保已备份所有内容。完成后,键入reboot提示,然后按Enter键(您猜对了!)重新启动计算机。

有关更多信息,您可以在此处找到fsck手册页。


有趣的是,但即使使用-f且在单用户模式下,它看起来也非常类似于fsck,它正在执行Disk Utility的操作。像“磁盘工具”一样,它什么也没找到,并认为磁盘就可以了。我以为它正在扫描文件系统记录,但是我认为我的问题是在块级别上-即文件系统结构良好,但是在读取文件时无法访问文件中的实际数据/复制/整理碎片。
MrCranky 2014年

1
→MrCranky:对!fsckDisk Utility正在检查文件系统结构的完整性。他们读取分配给文件系统结构的磁盘块。它们不是用来验证数据块完整性的。因此,它们可以在具有故障块的磁盘上运行,而不会增加任何读取错误。如果要检查磁盘,甚至可能是有故障但实际上未使用的块,也可以dd if=/dev/disk0 of=/dev/null ibs=1k在运行另一个Shell窗口时使用基本工具tail -f /var/log/system.log。这是免费的,极端的,不会隐藏任何错误。
2014年

2

我强烈建议DiskWarrior重建磁盘目录并扫描可能损坏的文件

在目录重建期间,它也可以让您知道由于磁盘故障而导致的延迟。


我并非不愿意购买一个工具来提供帮助,但无需试用,也无法保证该工具甚至旨在发现我遇到的错误,因此,我需要更多的建议来备份您的工具准备在工具上投入100美元。
MrCranky 2014年

-1不仅是答案,还包括评论和答案。
bot47 2014年

2

解决Buscar的答案后,您可以使用一些非常繁琐的命令行foo自动执行此操作。

sudo find / -type f -print0  | xargs -0 -I{} dd if='{}' of=/dev/null bs=1m 2>&1 | grep 'error' >>badfiles.txt  & 
  • sudo:管理员模式
  • find -print0:绝对路径
  • xargs -0 -I {}:在下一条命令中替换{}
  • dd 2>&1:将std错误重定向到stdout
  • 管道标准输出到grep寻找字符串错误
  • 将结果追加到列表文件中。(注意:如果您认为内部驱动器存在问题,则该文件应位于外部介质上)

1

正如您所说,甚至还不清楚那些文件是否已损坏,至少您的Mac并不这么认为。

每个操作系统都会生成其操作所需的不可移动文件(还原点,当前活动文件等)。有些碎片整理会显示出来,有些则不会。

您无法访问或移动它们的事实并不意味着它们已损坏。

通常,Mac可以很好地自我保护。

使用Apple维护的方法是:打开终端并输入:

sudo periodic daily weekly monthly 

然后按回车键,输入管理员密码,OS X会为您处理一切。

如果有兴趣,请在控制台中查找有关这些报告的报告。

在控制台中查找(搜索)任何表明磁盘开始出现问题的I / O错误,以补充磁盘工具和fsck的发现。

有时,我使用一个名为OnyX的免费工具执行其他维护任务。它是由法国人制作的,而且食物也很棒:)

OnyX是OS X的多功能实用程序,它使您可以验证启动盘及其系统文件的结构,运行其他系统维护任务,配置Finder,Dock,QuickTime,Safari,Mail,iTunes的某些隐藏参数,登录窗口,Spotlight和许多Apple的应用程序,以删除缓存,删除一定数量的文件和文件夹,这些文件和文件夹可能会变得很麻烦。

综上所述,我不质疑您决定使用碎片整理程序(iDefrag),因为我不知道它,而是提供其他解决方案。


使用碎片整理程序不是问题,我完全知道OS X在这方面做了什么和不做了什么。这些文件肯定没有使用,这些是用于未激活应用程序的数据文件,实际上该应用程序现在无法移动。
MrCranky 2014年

在Onyx上,它做的工作比Disk Utility还要多-检查磁盘的SMART状态,然后运行fsck样式诊断程序(我们已经确定这没什么问题)
MrCranky 2014年

明确地说,对于任何其他阅读此答案的人来说,文件肯定损坏的,而Mac知道这一点,因为不允许我读取它们(复制它们,无论如何)。那不是因为它们是系统文件,或者当时是在使用中,即使对于用户数据文件也是如此。定期维护并不能帮助解决该问题,这再次是因为fsck它似乎只关心文件系统问题,而不是阻止可访问性问题。仅当我手动尝试从这些损坏的文件之一中复制/读取数据时,控制台才会显示错误,这对查找它们没有帮助。
MrCranky 2014年

0

听起来不合理,在执行任何操作之前,应将所有数据复制到已知的良好驱动器。如果从安装程序启动并复制数据失败,则存在一个名为“ dd”的命令行实用程序,该实用程序可以进行低级别的复制,并且以一种更为妥协的方式进行。

 man dd

有关dd的更多信息,包括使用和正确的语法。


对Matt的帖子再次投票,启动单用户模式并运行

 fsck -fy 

直到fsck停止报告错误为止。


DiskWarrior是Adam职位的投票结果,它是一个易于使用但非常强大的应用程序,它将报告HDD故障,检查单个文件中的错误并在可能的情况下对其进行修复,以及重建和优化目录结构。


听起来不合理,但通常是在最后一次尝试中恢复数据的另一种可行方案,其中有大量成功的证据,那就是拉动驱动器,使用几层冷冻袋保护其免受潮气,然后将其放入您的冷冻室中。 30-45分钟。然后,在驱动器处于冷状态时,将该驱动器安装在外部USB扩展坞中,并使用另一个临时系统再次尝试将损坏的数据复制到另一个驱动器。通常,如果出现硬件问题并且驱动器发生故障,则使用此方法。如果您可以完整地复制整个驱动器,那么这是理想的选择,因为重新分区和重新格式化通常会给驱动器带来新的生命力。


如我所说,fsck不报告任何错误。磁盘尚未出现故障,也没有报告随机错误,损坏的文件列表似乎没有增加,因此我不认为我在“冻结最后一次紧急拉动”阶段的任何位置。正如我在问题中所说,我也已经很好地备份了文件/文件夹级别,并且不担心丢失数据。很高兴听到DiskWarrior的另一票。
MrCranky 2014年

@MrCranky:我相信您是在更新问题之前引用了一些内容;对于任何发现此页面寻求类似症状的解决方案的人,我都加强了fsck的想法。关于我发布的有关HDD故障的任何内容,对其他人(不一定是您本人)再全面地介绍也无济于事。我已经看到了相当一部分硬盘故障。即使没有SMART技术,通常也没有故障的迹象,直到您无法以任何方式访问数据为止。如果您关心数据,强烈建议您购买一个新驱动器,然后备份数据。
chillin 2014年

我当然不同意关于备份的建议,但是Q&A格式的精神是回答所提出的问题,而不是一般的“如何修复损坏的磁盘”问题(其中有很多)。在我编辑它以将其添加fsck到“认为磁盘很好的事物”列表中之前,我已经回答了答案提要,以降低fsck其实用性。fsck磁盘实用程序和“磁盘工具”执行的功能大致相同,即在文件系统结构上运行,而不是在块级别上运行。我确实尝试明确指出这是一个块问题,而不是文件系统问题。
MrCranky 2014年

0

对于由于磁盘读取错误而无法完全读取的单个文件,可以使用该dd实用程序将文件复制到外部卷,用NUL字节代替无法读取的块。强烈建议复制到另一个卷(例如,下面的示例中为“ USB Disk”)。

例:

dd if=/path/to/damaged/file of=/Volumes/USB\ Disk/file bs=512 conv=noerror,sync

通过使用512字节的块,将恢复最大数量的可读块。

恢复可能会花费很长时间,因为内核将在每次读取失败时阻塞一段时间。

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.