我们可以使用dd
很方便地把任何存储设备或者其下面的某个分区按字节备份到某个文件中,也可以从某个文件写回存储设备。
dd
的用法也很简单。执行dd if=源 of=目的
即可。
下面举几个例子:
dd if=/dev/sda of=/dev/sdb
:将设备/dev/sda
按字节复制到/dev/sdb
中,相当于硬盘对拷。dd if=/dev/sdb of=/opt/SDCard.img
:将设备/dev/sdb
按字节复制到文件/opt/SDCard.img
中,是将存储设备按字节备份到文件。dd if=/opt/SDCard.img of=/dev/sdb
:将上面的if
和of
颠倒过来了,作用也就是从文件将数据复制到存储设备中,相当于恢复。
这里需要注意一个问题:最好是把设备取消挂载之后再进行dd
写入操作,否则写入完成之后取消挂载拔出设备时,系统可能会对设备的分区信息进行写入操作,导致恢复进去的分区信息被覆盖,从而无法读取设备。当然,如果不小心忘了在写入之前取消挂载也没关系,可以等设备不在工作时直接拔出设备,或者重新dd
一下,等一秒之后使用^C
结束操作,这样开头的几个扇区会重写进去,分区信息也就得以恢复了。
不过在dd
的过程中是不知道进度的,但我们也有其他方法可以做到。
我们新开一个终端,执行watch -n 5 pkill -USR1 ^dd$
,执行dd
的界面就会每隔五秒输出一次信息。
此外还有以下几种方法,但我只测试了第一种。
第一种方式:每5秒显示进度
watch -n 5 pkill -USR1 ^dd$
第二种方式:
watch -n 5 killall -USR1 dd
第三种方式:
while killall -USR1 dd; do sleep 5; done
第四种方式:
while (ps auxww |grep " dd " |grep -v grep |awk '{print $2}' |while read pid; do kill -USR1 $pid; done) ; do sleep 5; done
参考文档:
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。