![通过仅写入非零块来恢复磁盘备份](https://linux22.com/image/91471/%E9%80%9A%E8%BF%87%E4%BB%85%E5%86%99%E5%85%A5%E9%9D%9E%E9%9B%B6%E5%9D%97%E6%9D%A5%E6%81%A2%E5%A4%8D%E7%A3%81%E7%9B%98%E5%A4%87%E4%BB%BD.png)
假设您有原始格式的磁盘备份sda.img
并且/dev/sda
最初填充了零,如何在恢复备份时跳过零?的模拟dd
应该检测输入流中的零块并在输出设备上执行适当的查找。
笔记
我尝试了cp
option --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
版本花费更多时间进行写入,但除非输出设备很慢,否则这不会对复制的持续时间产生太大影响,因为在这种情况下,读取和写入大部分可以并行化。