我正在将驱动器复制到文件,但低估了它占用的空间量。因此,我的目标驱动器上的空间不足,并且不想中止该进程(它已经在损坏的驱动器上运行了很长一段时间)。
我当然可以使用 CTRL-Z 暂停 dd,并且我想将目标驱动器替换为更大的驱动器,并将文件复制到更大的驱动器,然后恢复 dd。关于如何实现这一目标有什么想法吗?
dd if=/dev/sdc conv=sync,noerror bs=64M | gzip -c -9 > /media/extD/drive.img.gz
编辑:对于那些提到 ddrescue 是一个更好使用的工具的人,你是对的。然而,无论出于什么原因,ddrescue 不断地呕吐并出错,而 dd 却只是毫无怨言地一路走来。
答案1
这是可能的,但有点痛苦。
首先,知道dd
如果发送了,则打印其在副本中的当前位置(复制的字节)USR1信号。所以找到PID的dd
,使用任一ps
或类似pidof
或的东西pgrep
(不是POSIX并且不适用于所有 unix-y 系统 IIRC)。
一个ps
对我有用的命令(也使用awk
, 在德比安环境):
ps aux|awk '/dd/ {print $2}'|grep -v awk
grep -v awk
是必要的,以防止PIDawk
也来自印刷。
拥有PID的dd
,发送USR1信号:
kill -USR1 [pid of dd]
正在运行的控制台窗口dd
将打印它复制了多少字节。你现在可以dd
真正杀人了(ctrl+c,kill -9
等等)。我不记得dd
如果以这种方式杀死,是否会报告中止的进度POSIX,所以发送USR1先发信号。
dd
自从您停止它以来,现在可能已经复制了更多字节,因此运行:
head -c [number of bytes reported copied from dd] > \
/path/to/drive/you/are/moving/to/filename.bin
将截断的副本放在目标磁盘上。您可能希望选择可被所需块大小整除的值,而不是精确的字节数,以在恢复复制时加快传输速度。只需记下您选择的任何内容,并确保您只是截断而不是放大图像。
将其复制到新驱动器后,运行:
dd if=/dev/sdc bs=64M skip=[truncated size divided by block size, e.g. 64000000] \
of=/path/to/part2
如果较小的原始磁盘上有空间容纳映像的剩余部分,请删除复制到新磁盘的未截断的映像第1部分释放空间,并将dd
其输出到该磁盘。传输完成后,您可以运行
cat /path/to/part2 >> /path/to/part1
加上第2部分到最后第1部分,创建完整的磁盘映像!请注意,您至少需要足够多的磁盘可用空间第1部分位于第二部分的所有内容附加到它的位置。
如果您不介意完成整个传输,我会cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gz
创建一个 gzip 压缩存档。这可以用类似的东西写入硬盘分区zcat /path/to/imagefile.img.gz > /dev/sdX
。
[从我的评论复制到答案中]
另外,我认为(但不记得了)如果未指定 of= , dd 会写入 stdout 。如果这是真的,您可以跳过将第 2 部分写入单独的文件并使用:
dd bs=64M skip=[skip-block-count] if=/dev/sdc >> /path/to/part1
@MatijaNalis 正确地建议使用dd_rescue
或ddrescue
(完成相同任务的两个不同程序)来复制磁盘映像。如果您的分区/驱动器有错误的扇区或其他硬件故障,我会这样做。
答案2
将文件移动到另一个驱动器后,您无法暂停该过程并恢复它。但是您不需要这样做。只需终止该dd
进程,进行文件传输,然后为其余数据启动一个新的复制过程。
要查看第一部分停止的位置,请运行gzip -l /media/extD/drive.img.gz
。 “未压缩”数字是已复制的字节数,也是您需要开始新复制过程的偏移量。
要复制其余数据,请告诉dd
从该偏移量开始NNNN。
dd if=/dev/sdc conv=同步,无错误,iflag=skip_bytes,skip=NNNNbs=64M | gzip -c -9 >> /media/extE/drive.img.gz
我不建议使用dd
复制数据。与常见的传说相反,让它访问磁盘并没有什么魔力dd
:魔力都在/dev/sdc
.此外dd
可能会默默地丢失数据— 我认为使用标志conv=sync,noerror
它只会用零替换一些数据,因此成功复制的所有数据最终都位于正确的位置,但这样做的风险由您自己承担。
要从工作磁盘复制磁盘映像,只需使用cp
或cat
。要复制零件,tail -c +$((start_offset+1)) | head -c $bytes_to_copy
.
要从故障磁盘中挽救数据,请使用解救。 Ddrescue 很聪明,可以跳过不可读的数据并跟踪成功读取的数据。它可以进行多次传递;对于出现故障的硬盘,让驱动器休息一会儿并重试通常可以让您恢复整个硬盘,即使某些扇区在第一次尝试时无法读取。
ddrescue 可以使用您现有的部分副本并完成它,但你必须保持它未压缩。
1实际上,您可以ptrace
使用调试器附加到进程,暂停它,更新其内部数据结构以指向新文件,然后恢复。但即使您熟悉如何做到这一点,它也会比简单的附加解决方案更复杂。