《硬件历险》之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 -av \
"/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/"# 排除.DocumentRevisions-V100文件会快很多sudo rsync -av --exclude '.DocumentRevisions-V100' "/Volumes/时间机器/Backups.backupdb/XXX的Macmini/$dir/Macintosh HD - 数据/" "/Volumes/10TB/时间机器手动导出/$dir/Macintosh HD - 数据/"fi
done;

希望能帮到有需要的人~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频基础知识(一) 视频编码 | H.26X 系列 | MPEG 系列 | H.265

文章目录 一、视频编码二、 H.26X 系列1、H.2612、H.2633、H.2643.1 I帧3.2 P帧3.3 B帧 4、H.265 三、 MPEG 系列1、MPEG-12、MPEG-23、MPEG-44、MPEG-7 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者&…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数(如下),其他的参数可以不管 client_id : 就是创建应用后的API Keyclient_secret: 就是创建…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志,定位相关问题。 架构 Native In…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI,让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时,它基于高性能的Thin…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状,可自由动态更改画线的粗细、拐角圆滑度、颜色,自由增减节点,不额外增加gameobject,并且在原生的UGUI上以ScreenSpace-Overlay的状态下,显示效果如下所示 …

数学建模-邢台学院

文章目录 1、随机抽取的号码在总体的排序2、两端间隔对称模型 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,……

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…

【机器学习300问】37、什么是迁移学习?

一、什么是迁移学习? (1)它的出现是为了解决什么问题? 迁移学习是为了解决深度学习中由于数据不足导致的学习效果受限以及跨领域知识的有效利用等问题而发展起来的一种重要技术手段。 ① 缺少训练数据 在许多实际应用中&#xf…

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

C++程序函数的重载和函数模板

在C中,函数也可以重载。C允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能,这就是函数的重载。 函数的重载的函数体是完全相同的,只是形参和类型不同…

嵌入式学习之Linux系统编程篇笔记——系统编程初探

配套视频学习链接:https://www.bilibili.com/video/BV1zV411e7Cy?p2&vd_sourced488bc722b90657aaa06a1e8647eddfc 目录 Linux系统编程的基本认识 什么是Linux系统编程? 什么是系统编程 系统编程的作用 怎么学习Linux系统编程? Linux系统编程基本程序框…

读者交流群

自开设公众号以来,收到众多读者的关注,所以我很高兴在这里向大家推荐加入我的技术交流群。如果你对Java和Go语言有兴趣,想要与其他同好分享经验和知识,那么这个读者群将是一个理想的选择。 在这个读者群中,我们有机会与…

知识积累(五):Transformer 家族的学习笔记

文章目录 1. RNN1.1 缺点 2. Transformer2.1 组成2.2 Encoder2.2.1 Input Embedding(嵌入层)2.2.2 位置编码2.2.3 多头注意力2.2.4 Add & Norm 2.3 Decoder2.3.1 概览2.3.2 Masked multi-head attention 2.4 Transformer 模型的训练和推理2.4.1 训练…

Redis实战——优惠券秒杀:超卖问题一人一单问题

目录 优惠券秒杀Redis实现全局唯一ID业务场景代码实现: 添加优惠券业务场景新增普通券新增秒杀券测试添加秒杀券 实现秒杀下单业务分析流程代码编写 超卖问题超买场景分析解决方案使用乐观锁 一人一单业务场景解决步骤 集群环境下的并发问题 优惠券秒杀 Redis实现全…

06.Web APIs中正则表达式的使用

一、正则表达式 正则表达式(Regular Expression)是一种字符串匹配的模式(规则) 使用场景: 例如验证表单:手机号表单要求用户只能输入11位的数字 (匹配)过滤掉页面内容中的一些敏感词(替换),或…

15届蓝桥杯第三期模拟赛所有题目解析

文章目录 🧡🧡t1_奇数次数🧡🧡思路代码 🧡🧡t2_台阶方案🧡🧡思路代码 🧡🧡t3_约数个数🧡🧡思路代码 🧡🧡t4_最…

AI基础知识(2)--决策树,神经网络

1.什么是决策树? 决策树是一类常见的机器学习方法,决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”,决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点,若干个内部节点和若…

无设备树platform设备驱动实验:platform驱动注册代码框架测试

一. 简介 前面两篇文章中,一篇实现 platform设备注册代码实现,文章如下: 无设备树platform设备驱动实验:platform设备注册代码实现-CSDN博客 一篇文章实现了 platform驱动注册代码框架,文章如下: 无设…