我正在使用 LiveCD GNU/Linux 系统将笔记本电脑内置驱动器的压缩映像创建到外部 USB 磁盘中。我还使用 pv 来监控进度。命令如下所示:
dd if=/dev/sda bs=8M conv=noerror,sync | pv -pterab -s 298G /
| gzip -c --fast > /mnt/backup/image.dd.bz
USB 驱动器是 ADATA HD710。我知道这些驱动器的 USB 插头往往很松 - 如果我移动它,很容易断开驱动器的连接。这个过程似乎比我预期的要长,我担心我必须移动笔记本电脑和驱动器。我担心这会断开驱动器的连接,破坏复制过程并迫使我重新做一遍。
我已经检查过是否可以在暂停进程后卸载驱动器(使用 Ctrl+Z 热键)。它只能在“懒惰”模式下完成,这意味着驱动器实际上并没有被卸载,它只是与挂载目录断开连接。我等到驱动器完成工作(LED 停止闪烁)并拔下它。我再次插入它,挂载到之前挂载的同一目录,然后使用命令恢复该过程
fg 1
Gzip 因 I/O 错误退出。
为什么?即使 dd 已停止,我也无法卸载驱动器,因为内核知道它已打开该磁盘上的文件。在我移除驱动器后,打开的文件肯定已关闭,但在我重新安装驱动器后,Gzip 进程无法重新打开该文件。因此,当 Gzip 尝试继续写入时,它收到 I/O 错误,因为内核拒绝它访问该文件(这是意外的)。
我还尝试停止该过程,添加 skip=X(其中 X 是 dd 报告退出后写入的记录数)并将磁盘映像的其余部分附加到 dd.gz 文件中。但是 gunzip 退出并显示错误:
gzip: data.dd.gz: invalid compressed data--format violated
我想如果图像未被压缩的话它就可以工作。
是否可以停止该过程(使用 Ctrl+C 热键),并继续将其附加到先前创建的文件?如何匹配文件位置?两个连接的 Gzip 档案是否可以正确提取以从其压缩映像中恢复磁盘?
答案1
正如指出的那样,您可能想要使用 ddrescue。
但是你可以简单地附加到 gzip 文件。例如dd --count 8 | gzip > foo.gz其次是dd --skip 8 | gzip >> foo.gz简单易行。连接的文件将简单地提取到输入文件中。
对于您描述的第一种情况:通常,Linux 会尽量不干扰当前进程,只要磁盘在使用中,它就会一直处于挂载状态。但是,如果您强行拔出磁盘,正确的方法是向应用程序发出 I/O 错误信号。传统的 Unix 将打开的文件与其磁盘上的对应文件关联起来的方法不是通过其路径,而是通过其 inode 号。在后续使用中,此 inode 可能已被完全不同的文件重用,或者该 inode 可能根本不是文件。在分离备份单元后持久保存打开的文件的想法本身值得怀疑:文件可能已更改,因此持久保存的状态可能毫无意义。另一方面,有一个很好的例子可以“快速失败”并通知应用程序磁盘故障,以便它采取行动,在这种情况下,这只相当于停止压缩过程。
第二种情况涉及何时停止 gzip 的问题。上面的工作示例允许 gzip 向文件写入任意多的数据。另一方面,当您暂停或中断该过程时,生成的文件永远不会是有效的 gzip 文件。这是因为 gzip 写入文件的最后一项是未压缩数据的校验和。虽然这有助于检测文件中的错误,但这无助于使 gzip 可中断。
TL;DR:不,这是不可能的。