通过仅写入非零块来恢复磁盘备份

通过仅写入非零块来恢复磁盘备份

假设您有原始格式的磁盘备份sda.img并且/dev/sda最初填充了零,如何在恢复备份时跳过零?的模拟dd应该检测输入流中的零块并在输出设备上执行适当的查找。

笔记

我尝试了cpoption --sparse=always,但如果目标是块设备,它看起来无效:

[root@vmarch ~]# truncate sda.img -s1G
[root@vmarch ~]# cat sda.img | cp --sparse=always /dev/stdin sdb.img
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
0       sdb.img
[root@vmarch ~]# ls -lh sda.img sdb.img
-rw-r--r-- 1 root root 1.0G Jul 31 09:17 sda.img
-rw------- 1 root root 1.0G Jul 31 09:17 sdb.img
[root@vmarch ~]# losetup -f sdb.img
[root@vmarch ~]# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE     DIO
/dev/loop0         0      0         0  0 /root/sdb.img   0
[root@vmarch ~]# cp --sparse=always sda.img /dev/loop0
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
1.1G    sdb.img

答案1

使用 GNU coreutils(例如在非嵌入式 Linux 上),您可以使用cp --sparse=always使输出文件尽可能稀疏:

cp --sparse=always sda.img /dev/sda

这可能比直道快,也可能不快

cat sda.img >/dev/sda

cp --sparse=always必须花更多时间阅读和分析其输入。该cat版本花费更多时间进行写入,但除非输出设备很慢,否则这不会对复制的持续时间产生太大影响,因为在这种情况下,读取和写入大部分可以并行化。

相关内容