恢复中断的复制过程


8

如何恢复安全和可靠地处理复制文件$A到备份位置$B与完成pv "$A" > "$B"cat "$A" > "$B"

(假设文件$A很大,例如LVM2快照文件)

这是可以实现的dd吗?

首选:bash或python(最好是python3)解决方案。

示例场景:pv "$A" > "$B"复制90%后中断。如何恢复它,以完成复制过程但又不重复整个工作?


Answers:


12

是的,您可以使用dd跳过块。

A="file1"
B="file2"

BLOCKSIZE=512  # default bs for dd

size_b=$(stat -c "%s" "$B")
skip_blocks=$((size_b / BLOCKSIZE))

dd if="$A" of="$B" skip=$skip_blocks seek=$skip_blocks bs=$BLOCKSIZE

这里的重要参数skip还有seek

  • skip:在输入开始时跳过块ibs大小的
  • seek:在输出开始时跳过块大小超过块的块

10

您要rsync

rsync -a --append "$A" "$B"

1
我不想使用rsync。假设A为1TB,并且我已经复制了900GB的数据,并且还有100G的剩余空间。rsync会读取整个1TB,而我只需要最后100G即可!->首先阅读使用的算法:en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki 2012年

1
@GrzegorzWierzowiecki我认为你错了。除非我对rsync的经验完全错误,否则rsync会读取需要阅读的内容以验证输出是否正确,直到它到达开始出现差异的点,然后从该标记点继续。这看起来几乎是所需的。
killermist 2012年

1
为此,您还需要添加--append
2012年

感谢@Thor强调此选项。正如我仔细检查过的那样,似乎--append从3.0.0版开始,行为已发生变化。您能确保我当前是否--append忽略已复制的部分,而--append-verify读取整个A进行校验和检查吗?(版本3.0.0之前的--append行为类似于--append-verify->这就是造成误解的原因)
Grzegorz Wierzowiecki 2012年

5
@GrzegorzWierzowiecki:我没有注意到这一变化。我刚刚对其进行了测试,并且确实--append盲目地将其追加到文件中。--append-verify执行相同的操作,但如果校验和不匹配,则最后运行校验和,rsync好像是在做新副本。
雷神

3

您是否尝试dd skip过偏移B的实际文件大小(与分区块大小无关)?

那会让你缺少部分。那时,您可以将cat它们直接一起放入一个新文件中cat "$B" "$A2" >> "$C"; #mv "$C" "$B"$C当然,路径上缺少的部分具有足够的空间)。

cat也可以很好地串联二进制文件,在这种情况下,您没有多个文件头可以简化简单的脚本合并。的结尾可能$B会损坏,但是在这种情况下,您可以将其缩短,并$A在初始dd步骤中重新读取更多内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.