我即将使用 ddrescue 开始恢复,想知道这些步骤是否走在正确的道路上。我打算:
- 通过 Ubuntu live USB 启动并使用 ddrescue
- 在 Ubuntu 中禁用自动挂载
- 通过我的计算机上的 SATA 连接新的目标驱动器
- 通过 USB 外壳连接旧的故障驱动器
- 通过第一遍运行 ddrescue 以快速恢复容易的扇区,然后运行第二遍
ddrescue -f -n /dev/sdb /dev/sdc rescue.log
ddrescue -d -f -r3 /dev/sdb /dev/sdc rescue.log
我在想
- 如果 Ubuntu live USB 没有持久存储并且其他磁盘都已卸载,我应该在哪里写入日志文件(映射文件)?我也可以将其写入新的目标磁盘吗?日志文件通常有多大?
- 我读到将硬盘连接到 USB 外壳不是一个好主意?如果我只有一个 SATA 连接,我还有什么选择呢?
- 如果我必须选择,是把新驱动器放在 SATA 端口中,将故障驱动器放在机箱中更好,还是反之亦然?
- 我是否必须确保在运行 ddrescue 之前未安装驱动器?
- 我是否必须检查磁盘扇区大小是否相同,如果不同,则将任何参数传递给 ddrescue 吗?
答案1
我在哪里写入日志文件(映射文件)[...] 我也可以将其写入新的目标磁盘吗?
在目标磁盘上创建一个文件系统,挂载它并告诉ddrescue
写入文件系统中的常规文件,而不是写入设备(/dev/sdc
在您的命令中)。令地图文件为其他同一文件系统中的常规文件(明智的想法:在同一目录中)。
如果目标磁盘比源磁盘大,这将很有效,因此即使文件系统为其结构占用了一些空间,也将有足够的空间容纳图像(源磁盘大小)和映射文件。但即使目标磁盘不大,具有压缩和/或-S
/--sparse
选项的文件系统ddrescue
也可能足以将映像压缩到文件系统中。然而,没有简单的方法可以提前判断数据是否可以被充分压缩/稀疏。如果源驱动器运行状况良好,您可以执行以下操作:仅从硬盘克隆正在使用的空间。但如果您的驱动器出现故障,则不建议使用此方法。
幸运的是,您(在评论中)说“目标驱动器的大小是故障驱动器的两倍”。在目标驱动器中创建一个文件系统,即使没有压缩,图像和映射文件也将适合。文件系统可能位于分区 ( /dev/sdc1
) 中或整个设备 ( /dev/sdc
) 中。请参见单分区磁盘配置的用途。但在做出决定之前,请先阅读当前的整个答案。
即使我不需要压缩,我也会使用 Btrfs,因为 Btrfs 支持写时复制。完成后ddrescue
,我从图像中删除写入权限,创建其副本 ( cp --reflink=always …
),该副本最初几乎不占用额外空间。所有修改图像的操作(例如fsck
)都在副本上执行。如果出现任何问题,我仍然保留着原始文件,我可以随时重新开始。我相信 ZFS 也同样有用,但我没有使用它的经验。
将整个磁盘的映像作为常规文件,您可以使用或某些等效命令检查其分区表(如果有)(假设ddrescue
设法读取它) 。gdisk -l /path/to/image
您可以从中挂载文件系统(假设ddrescue
设法读取足够的数据以使文件系统可挂载)。有用的命令:losetup
,kpartx
或只是mount -o offset=…
。因此可以读取文件。您可以将它们复制到保存图像的同一文件系统中。
直接复制到的情况至少有两种情况/dev/sdc
是合理的:
- 您需要从副本启动,就像从故障磁盘启动一样。
- 您想要使用无法使用常规文件的工具(例如恢复工具);坚持使用实际磁盘的工具。请注意,此类限制不是 Unix-y 设计。该工具可能是某些 Windows 工具或 Windows 本身。
日志文件通常有多大?
地图文件由标头等(约 350 字节)和数据块列表组成:保持相同状态的每个连续扇区块一行(约 30 字节)。一个更糟糕的情况是驱动器的每个物理扇区的状态与其相邻扇区不同。那么每个物理扇区就一行,即每 512 或 4096 字节的源磁盘大约有 30 字节的映射文件;因此mapfile的大小不应超过源磁盘大小的6%或1%。
所以理论上可以达到千兆字节;但达到这个大小(即测试驱动器的所有其他扇区都损坏的扇区)将需要很长时间。在实践中,预计错误扇区的布局会更幸运。预计映射文件需要几千字节,也许几兆字节。
如果您需要(或只是选择)将源磁盘直接复制到目标磁盘(而不是如上所述的文件系统)并且目标磁盘要大得多,那么您将能够将映射文件保存在目标驱动器上。一种可能的方法是这样的:
在目标驱动器上创建一个启动足够远的分区,因此即使在
ddrescue
从目标磁盘的最开头开始覆盖大片段(源磁盘大小),该分区的内容也将保持不变。使分区足够大以容纳能够容纳预期大小的映射文件的文件系统。但在磁盘的最后留出空间(1 MiB 就足够了),以防需要使用GPT。在分区中创建文件系统。确保您可以使用
mount -o offset=… /dev/sdc …
(而不是mount /dev/sdc1 …
左右)挂载文件系统。将其保持安装状态。注意一张纸上的偏移量。运行
ddrescue
并让它写入/dev/sdc
,但将映射文件放入已安装的文件系统中。这将覆盖sdc
;的分区表但您仍然可以挂载包含映射文件的文件系统,因为您知道偏移量。完成其工作后
ddrescue
(可能在多个会话中),检查 上的分区表/dev/sdc
。 MBR 或主 GPT 中的 DOS 分区表将源自源磁盘(除非ddrescue
无法读取这部分)。(注意:逻辑扇区大小可能有问题,我稍后会解决。目前我假设没有问题,但请在采取行动之前阅读整个答案。)
如果复制的分区表是MBR中的DOS分区表那么应该没问题。
如果是 GPT,那么您将需要修复辅助 GPT。源磁盘中的辅助 GPT 副本现在位于目标磁盘中间的某个位置;通常应该在最后。可能在 处有一个老的辅助 GPT
/dev/sdc
与副本无关。gdisk /dev/sdc
应该检测到差异并为您提供一个选项来根据主 GPT 修复辅助 GPT(手动方式:r
对于恢复选项,然后d
重建备份;请参阅“手动恢复过程”这里)。您仍然可以挂载包含映射文件的文件系统(使用
offset=…
),但请注意,根据分区表,这部分磁盘现在未使用。您可以在分区表中创建一个条目以更轻松地访问文件系统(比较我的这个答案)或扩展文件系统,就好像它从未存在过一样。
我读到将硬盘连接到 USB 外壳不是一个好主意?如果我只有一个 SATA 连接,我还有什么选择呢?
网络中的另一台计算机将
- 挂载目标磁盘并让您通过 NFS 或类似协议在其上创建文件;或者
- 暴露目标磁盘供您使用作为块设备。
但 USB 外壳可能没问题。如果您知道如何处理它可能出现的怪癖(我们会解决它),那可能就没问题了。
如果我必须选择,是把新驱动器放在 SATA 端口中,将故障驱动器放在机箱中更好,还是反之亦然?
外壳是一个附加层,如果内部磁盘出现故障,该层可能会出现故障或引发意外现象。因此我更愿意将它与健康的目标磁盘一起使用。但还有其他方面(主要是怪癖,我们会解决它)。
我是否必须确保在运行之前未安装驱动器
ddrescue
?
不得更改源驱动器。您无法一次读取所有数据,而是分块读取。如果两次阅读之间的内容发生变化,则您可能会得到不连贯的图像。比较“全景失败”在摄影中:图像的不同部分是在不同的时刻拍摄的,而世界(源)并不是完全静止的。
源驱动器可以只读方式安装。但由于驱动器出现故障,任何读数都可能使其状态恶化;所以不必要的时候最好不要阅读。保持源未安装。
如果ddrescue
要写入目标驱动器上文件系统中的常规文件,则必须安装该文件系统。如果ddrescue
要写入目标驱动器,则不得安装要更改的片段;但如果您有充分的理由(例如在上述过程中存储地图文件),则可能会进一步部分。
我是否必须检查磁盘扇区大小是否相同,
ddrescue
如果不同则传递任何参数?
是的,你必须检查一下。但不,ddrescue
它本身应该起作用;虽然有一个参数可以调整为源磁盘的物理扇区大小(但不是因为扇区不同)。稍后不同的扇区大小可能会成为问题。
此外,一些 USB 外壳会引入一种可能会造成干扰的怪癖。
首先,熟悉“物理扇区大小”与“逻辑扇区大小”的概念。有用的链接:
简而言之:您使用驱动器的逻辑扇区与驱动器通信,但在内部它使用其物理扇区读取/写入数据。操作系统可以请求少至一个逻辑扇区,但如果它恰好小于物理扇区大小,则无论如何都会读取整个物理扇区,但只会返回其部分(所请求的逻辑扇区)。
调用时ddrescue
,您可以指定扇区大小(以字节为单位-b
,默认值512
)和簇大小(-c
一次复制的扇区,默认值128
)。首先(复制阶段)该工具读取整个簇,每次读取许多扇区;但稍后(修剪、报废阶段)它会尝试单个扇区,一次一个。好吧,不是“部门”,而是“它认为是部门”。
如果您指定的大小-b
小于设备的实际物理扇区大小,那么在发生读取错误的情况下,ddrescue
最终将尝试并重试读取物理扇区的部分内容。在内部,驱动器每次都会尝试读取整个物理扇区;如果碰巧它成功了,那么一些数据无论如何都会被丢弃,尽管事实上它可以填充图像中相邻的ddrescue认为的扇区。每个相邻的片段都需要进行自己的尝试。如果磁盘出现故障,您确实希望以尽可能少的读取次数获取尽可能多的数据,因为任何额外的操作都可能进一步损坏驱动器;所以-b
太小可能会很糟糕。
如果您指定的-b
大小大于设备的实际物理扇区大小,那么在发生读取错误的情况下,ddrescue
最终将尝试并重试一次读取多个物理扇区。如果它永远不会成功,那么图像中将保留比物理扇区更大的间隙。如果该工具使用更足够的扇区大小,则可能可以毫无问题地读取其中的某些片段。
我不知道当您指定完全疯狂的扇区大小(例如511
,513
或4444
)时会发生什么。我什至没有测试过。
-b
的默认值为512
。对于使用 4096 字节物理扇区大小的驱动器来说,这不是最佳选择。这是您应该调整的参数(无论两个磁盘之间的扇区大小是否不同)。
我认为健康目标的扇区大小并不重要,ddrescue
只需写入可查找文件(常规文件或块设备)。
那么你的外壳可能会干扰。假设您决定将其与有故障的磁盘一起使用。一些外壳更改逻辑扇区大小如果您知道物理扇区大小,这并不重要。但我拥有一个适配器,它对我撒了谎身体的扇区大小!它报告了512
真正使用的磁盘4096
。这是一个有故障的磁盘,我使用了ddrescue -b 512 …
,然后所有坏扇区都以 8 个为一组出现。这让我开始思考。4096
我通过 SATA 连接后报告了的真实值。磁盘在此过程中损坏,我怀疑如果我-b 4096
从一开始就使用它,我可以恢复更多数据。
早些时候我写过“我更愿意使用带有健康目标磁盘的机箱”。确实如此,但如果您的存储设备可以更改逻辑扇区大小,那么如果您将其与目标磁盘一起使用,则这些都是可能的:
- 您决定在分区中创建文件系统,然后将映像写入常规文件。所有作品。然后报废有故障的磁盘并将目标磁盘从机箱移至 SATA 连接。逻辑扇区大小发生变化,您会遇到这样的情况:由于文件系统类型错误,驱动器无法安装。
- 您决定写入设备,但副本中的分区表与目标磁盘使用的逻辑扇区大小不对应。
请注意,即使没有外壳,后一种情况也可能发生;或者外壳可以解决问题(只要它在使用中)。这完全取决于两个磁盘的逻辑扇区大小以及机箱的干扰方式(如果有)。
好消息:mount -o offset=…
即使分区表没有意义,您也应该能够挂载文件系统。请点击最后一个链接,我的回答解释了详细信息。
但是,如果您复制到目标设备以便从它启动,并且由于逻辑扇区大小现在不同而导致分区表无效,那么您将需要修复分区表。修复可能可行,也可能不可能。