假设您有原始格式的磁盘备份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
版本花费更多时间进行写入,但除非输出设备很慢,否则这不会对复制的持续时间产生太大影响,因为在这种情况下,读取和写入大部分可以并行化。