![我怎样才能合并两个不同的救援?](https://linux22.com/image/1527813/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E6%95%91%E6%8F%B4%EF%BC%9F.png)
我正在尝试使用 ddrescue 将故障的 500GB 硬盘中的一个分区恢复/dev/sdb
到第二个 1TB 驱动器。我第一次使用的 ddrescue 命令是:
ddrescue -n /dev/sdb2 core.img core.log
接下来是第二遍:
ddrescue -d -r 3 /dev/sdb2 core.img core.log
问题是,我无意中输错了第二条命令的图像名称。core.img
我本该输入core.ing
,却输入了 ,直到第二天早上我才意识到这一点,此时第二遍已经完成,core.log 被覆盖并报告 100% 成功。
现在我被 2 个大文件困住了。重新运行整个任务是不可行的,因为我仍在进行救援sdb3
。我已经检查过,hexedit
并且 2 个文件相互补充(即,如果偏移量 0x5000 到 0x7000core.img
填充为零,则相同的偏移量将core.ing
填充真实数据,反之亦然。)
我正在考虑dd
将 -ing 复制core.img
到/dev/sdc2
(我准备的替换驱动器sdb
)然后以某种方式复制仅有的非零字节,core.ing
但/dev/sdc2
我不确定如何才能复制非零字节,以及使用什么,因为我能想到的解决方案非常麻烦,而且需要很长时间才能完成。
作为参考,我正在运行基于 Gentoo 的 SystemRescueCD 4.9.6,sdb2
是 NTFS。
答案1
我怎样才能合并两个不同的救援?
(假设 GNU ddrescue
)
总结:
为第一个副本生成一个 mapfile/logfile:
ddrescue --generate-mode infile outfile mapfile
创建从第二个 → 第一个的合并副本
ddrescue
如邮件列表中的帖子所述:ddrescue -m logfile2 image2 image1 logfile1
1. 为第一张图片生成日志文件
这有点复杂,因为实际上你没有第一遍的日志文件。但是,你可以生成一个:
当使用该选项调用 ddrescue 时,
--generate-mode
它将以“生成模式”运行,这与默认的“救援模式”不同。也就是说,如果您使用“--generate-mode”选项,ddrescue 不会救援任何内容。它只会尝试生成一个 mapfile 以供以后使用。...
不要绝望(现在还不要)。在某些情况下,Ddrescue 可以从 infile 和 outfile 中的(部分)副本生成近似的 mapfile,这几乎与精确的 mapfile 一样好。它通过简单地假设全为零的扇区未被拯救。
...您可以使用以下命令生成近似的映射文件:
ddrescue --generate-mode infile outfile mapfile
(重点是我的)
来自GNUddrescue
手册;第 12 节,'生成模式“”。
因此,您可以对第一张图像执行此操作(我建议重命名以避免混淆,例如core-1.img
):
ddrescue -G /dev/sdb2 core-1.img core-1.log
“我仍在读取/dev/sdb
,生成日志会干扰它吗?”
请注意,主要从(在本例中为)ddrescue
重建,很少从中读取。我用 测试了这一点:outfile
core-1.img
infile
inotifywatch
$ inotifywatch 840-linux.img # infile
$ inotifywatch 840-linux2.img # outfile
$ inotifywatch 840-linux2.log
$ ddrescue -G 840-linux.img 840-linux2.img 840-linux2.log
total close_nowrite open filename
6 3 3 840-linux.img
17467 17465 1 1 840-linux2.img
total access modify close_write close_nowrite open filename
196 1 189 2 1 3 840-linux2.log
因此,在另一个进程正在运行时运行这个是安全的sdb
(在OP的情况下,在另一个分区上进行另一次救援尝试) 因为读数可以忽略不计。
2. 合并两个部分副本
这种情况之前出现过:
所以现在我有两个大部分不重叠的驱动器的部分图像......以及两个匹配的日志文件,它们定义了跳过的好区域和慢速区域。
幸运的是,它们可以合并使用--domain-mapfile
:
--domain-mapfile=file Restrict the rescue domain to the blocks marked as finished in the mapfile file. This is useful for merging partially recovered images of backups, or if the destination drive fails during the rescue. Use '-' as file to read from standard in`
您可以通过输入以下内容来合并图像:
cd dir1 ddrescue -m dir2/logfile dir2/image image logfile
这将创建包含当前已恢复的所有数据的文件 dir1/logfile dir1/image。然后您可以继续进行恢复,例如:
在您的情况下,假设您已经生成了一个日志文件core.img
并将它们标记为1
,并将core.ing
和保留core.log
为2
(以免造成更多混淆!):
ddrescue -m core-2.log core-2.img core-1.img core-1.log