《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据

2024-03-15 09:36

本文主要是介绍《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文虽然使用“抢救”一词,但是运气比较好,远没有达到访问和修改底层的信息来抢救的地步。如果你是需要通过访问和修改底层信息来抢救数据,建议阅读刘伟的《数据恢复技术深度揭秘(第二版)》或者寻找专业人士的帮助。

《数据恢复技术深度揭秘(第二版)》并没有提及如何修复现在 macOS 使用的 APFS,最新只有 HFS+。APFS 的结构要复杂一些,但是也是个尝试。

问题的前因后果

之前买过一块 3TB 的 SMR 盘用来专门时间机器备份,但是有次将其接到显示器上的 USB 接口,备份的时候显示器黑屏连接断开了,再次打开之后无法连接,等待相当长时间自检修复之后,弹出窗口显示“无法修复磁盘”,需要赶快抢救这些文件。

我当时要崩溃了,因为我的时间机器一直是手动备份的,所以从 2019 年一直到 2022 年四年的备份都在其中,这要是没了挺烦的。

好在这时候是可以正常访问硬盘内容的,只是整个硬盘都是只读的,无法再次使用时间机器来操作这个硬盘。

请添加图片描述

其中,我看到了那个被打断的备份(下图高亮):

请添加图片描述

这部分也没什么有用的内容,所以后面也不需要复制他们(由于现在是整个硬盘都是只读也没法删除)。

跳过系统的修复

上面看到了系统的修复是没啥用的,但是每次插上这个硬盘之后,需要很长时间才能看到卷宗。这是因为系统发现这个卷宗出现问题了,在使用fsck尝试修复。如果此时你在活动监视器中搜索fsck可以看到如下(_hfs后缀表示修复的文件系统是 HFS 格式的):

请添加图片描述

这时候强行退出这个进程就会弹出提示窗口,然后就能看到卷宗内容了。(命令行使用PS -A |grep fsck搜索,然后kill杀死进程即可)

这是为了节约时间。因为此时我们已经确定文件系统出现了问题,我们需要尽快将数据导出。有的时候fsck尝试修复只需要几分钟、十几分钟就会弹出修复失败的信息,但是有些时候会达到十几个小时(我遇到过),甚至数天(我在论坛看有人遇到过)。

诊断问题

首先得确定到底是硬盘坏了,还是文件系统坏了。我知道很多人由于 SMR 结构的问题,会直接认为硬盘损坏,但是正如我上面所说,我基本没有复写操作,都是增量写入。这也是 SMR 的适合使用场景(一次写入,多次读取,尽量别再次复盖写入),所以不能简单地认为就是硬盘的问题。

我们在 Linux 或 Windows 上查看到这个硬盘(虽然无法读取,但是我们只需要检查),本文使用 Windows。

为什么使用不使用 Mac 来查看和检测。这是因为 macOS 不支持对外部硬盘查看 SMART 信息,你可以使用 smartmontools 中的smartctl试一下,这点在 smartmontools 官方问答中也有列出 OSX - External USB / FireWire drive diagnostics support,机翻如下

请添加图片描述

连接上之后使用查看 SMART 信息的工具,以及其他一些检查工具(DiskInfo 等等)看看硬盘有没有问题。

好消息是硬盘没坏。加上能正常访问,用测速软件发现速度也没下降。也就是说只有文件系统出现了问题,这样只要抢救完文件就没有什么损失了。

抢救数据

根据上面的情况,个人猜测是时间机器相关的结构出现了问题,而不是 EFI 分区。因为是可以正常访问的,打开一些文件也没有问题,不然连硬盘卷宗都看不到。

由于整个硬盘是只读的,无法使用时间机器迁移到新硬盘,所以只能复制需要的内容。

接下来就是抢救这些文件了。

一些不能复制的文件和目录

如果你直接拖Backups.backupdb到新的硬盘中,会发现弹出:

请添加图片描述

这并不是因为目标硬盘是 APFS,和时间机器的 HFS+ 不一样,而是有一些隐藏文件作为时间机器的文件系统。所以同时按下“Command + Shift + .”三个键来显示所有的隐藏文件:

请添加图片描述

这里高亮的.RecoverySets目录是用来恢复 Mac 的。当然并不是只有这一个目录或者文件用来组成时间机器的文件系统,所以这时候也不要直接拖拽最下面没被隐藏的文件夹。

需要复制的文件和目录

实际需要复制的是下面这两个目录中的内容:

请添加图片描述

第一个目录下存放的是系统的东西,比如说系统自带的应用程序等等;第二个目录下则存放的是用户的数据和应用程序。

只复制一部分文件

如果你只需要一些数据文件,那么复制第二个目录下的内容即可。Macintosh HDMacintosh HD - 数据都对应的是系统的根目录/,前者存放的是系统相关的,后者是用户和使用相关的(可以想象一下将真正的根目录拆分成两部分)。

这点与实际系统上的结构完全不同,因为实际的系统上的Macintosh HD才是根目录,而Macintosh HD - 数据是挂载在/System/Volumes/Data的,需要注意这点。

比如说“照片”App 的内容一般在"Macintosh HD - 数据/Users/用户名/Pictures/照片图库.photoslibrary"(双引号防止在空格中断)。你只需要将其复制到其他地方,直接打开就能在“照片”中看到了。

“Pictures”在“访达”中可能因为本地化显示为“图片”,其他这些文件同理。很多人会将东西放在桌面,就可以在“桌面”或“Desktop”中看到。

对于开发人员来说,可能还需要复制一些配置文件或者二进制文件,这些都可以在对应位置找到。

复制所有的内容

通过上面我们知道了有些目录和文件是不能复制的,以及对我们有用的文件都在哪。

所以理所当然的,我们想可以在新的硬盘中创建对应目录,然后将Macintosh HDMacintosh HD - 数据依次拖到对应的目录下就行。

但是新的问题总是一个个冒出来:某些文件的直接拖拽复制可能会出现问题,比如说库乐队(GarageBand):

请添加图片描述

我一开始以为是硬盘坏块或者什么(我的魅族MX3上的一些照片就是闪存问题丢失了一些照片),但是尝试了多个备份中的库乐队,发现还是这样,说明不是硬盘的问题。

类似的还有 iMovie 和 Xcode,但是库乐队是一种特殊情况,像 iMovie 和 Xcode 的图标上都有所显示,但是库乐队没有这个符号(如下),却也无法复制成功:

请添加图片描述

这是因为库乐队找不到的是下载到乐器资源这些后期才有的资源,而不是程序本身的依赖项(比如 Xcode 使用的编译器、动态连接库等),所以图标上并没有显示,而它的记录是有这些的,但是这个时候找不到,就导致复制失败(因为在本机上找的)。

这里不展开去说其他程序的,因为不同的程序出现问题的原因不同,但是简而言之就是复制的时候破坏了软链接

解决方案也很明显,就是不破坏软链接来进行复制,这时候就不能使用拖拽的方法了,实践表明这会破坏软链接,所以需要使用rsync -l来保留软链接进行复制(速度有时差不多)。注意不要使用cp -RPcp -a来复制,某些文件会复制失败(按理说是等价的,但是可能因为某些原因导致出现问题,如果后面发现了我会在这贴出来)。

我们先尝试复制一次备份的内容,如果可以的话再使用脚本自动复制所有的备份即可。

命令如下:

sudo rsync -avl \
"/Volumes/时间机器/Backups.backupdb/XXX的Macmini/2019-11-19-142257/Macintosh HD - 数据/" \
"/Volumes/10TB/时间机器手动导出/Macintosh HD - 数据/"

其中:

  • a是存档模式,这会递归读取目录,不破坏符号链接、权限等信息。a等价于rlptgoD,所以我们不需要再使用l选项。rsync默认(无选项)是存档模式的,但是我们使用了其他选项,所以需要再使用一下。
  • v会打印传输完成的文件。使用这个是为了让看到是否在传递文件(可能会降低一点速度)。
  • 第二行是源地址。
  • 第三行是目标地址。时间机器手动导出这个目录需要手动创建一下。

创建文件列表需要一段时间,然后就可以看到在复制文件了,如下:
请添加图片描述

v选项几乎不会影响速度,如下:

请添加图片描述

速度最高速度如上图(5400 RPM 的消费级机械硬盘这速度差不多满速了),速度低的话就几十 KB/s 都有可能。

现在单个复制完成之后,就可以开始写脚本了。下面的脚本仅供参考,因为不同的人可能有所不同,我只是根据我的情况编写的。

#!/bin/bash
#
for dir in $(ls); do# 忽略三个不需要的文件和目录名,防止路径出现问题if [ $dir == *.inProgress ]||[ $dir == Latest ]||[ $dir == "com.apple.TimeMachine.inheritance.plist" ]; thenecho "Skip this directory"else# 在目标位置创建对应目录mkdir "/Volumes/10TB/时间机器手动导出/$dir"# 复制两个目录sudo rsync -av "$dir/Macintosh HD/" "/Volumes/10TB/时间机器手动导出/$dir/Macintosh HD/"sudo rsync -av "/Volumes/时间机器/Backups.backupdb/XXX的Macmini/$dir/Macintosh HD - 数据/" "/Volumes/10TB/时间机器手动导出/$dir/Macintosh HD - 数据/"fi
done;

希望能帮到有需要的人~

这篇关于《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811518

相关文章

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col