dd命令:convert and copy a file

用法:

   dd if=/PATH/FROM/SRC of=/PATH/TO/DEST 

   bs=#:block size, 复制单元大小;

   count=#:复制多少个bs;


磁盘拷贝:

    dd if=/dev/sda of=/dev/sdb


备份MBR

    dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1


破坏MBR中的bootloader:

    dd if=/dev/zero of=/dev/sda bs=256 count=1


两个特殊设备:

    /dev/null: 数据黑洞;

    /dev/zero:吐零

 

1.做硬盘对拷:

 

dd if=/dev/sda of=/dev/sdb bs=1024k &

 

注意:

 

(1).先改fstab文件,把LABLE换成对应的  /dev/sda(不改的话,拷完后重启系统不知道从哪块盘启动了)

 

/dev/sda2               /                       ext3    defaults        1 1
/dev/sda5               /data                   ext3    defaults        1 2
/dev/sda1               /boot                   ext3    defaults        1 2

 

(2).一定要写bs=1024k,一定要加k, 默认是bytes,不加K或M,是以bytes写入,
    有可能系统要挂了,至于 也有人写bs=4M,没啥区别,最后速度差不多。

(3).加 & 后台进行,因为要用当前的终端来查看dd进度,如果忘了加 &,可以用Ctrl+z

    把dd进程移到后台,再运行 bg 记其后台运行(为了在当前终端查看进度)。 

 

 

2.查看dd完成进度,要不然鬼知道啥时候能dd完成啊

 

  ps -ef|grep dd   //查看 dd 进程id号,其实上边命令加&后,己经显示了。

  kill -USR1  id   //查看 dd 完成进度

 

100118036480 bytes (100 GB) copied, 1346.94 seconds, 74.3 MB/s

  如果想时时查看进度,可以用下面语句:

 

 watch -n 1 kill -USR1 3730   // 每2秒查看一次进度

 while kill -USR1 3730;do sleep 2;done;   //每2秒查看一次进度

 

这种是通过发送USR1信号的方法,去产生一个标准的IO错误,来达到显示当前COPY进度与COPY速度的目的。

 

3.如果sdb原来是一个裸盘没有格式化过,dd可能并不能拷贝superblock信息,所以盘不能mount起来。
所以只需要进入fdisk界面:

 

# fdisk /dev/sdb

# w

 

“write table to disk and exit”,sdb就可以mount起来了,如果是格过的,可能需要fsck一下就可以了


注意:建议不要轻易dd,有可能把系统搞坏,在有把握情况下或数据备份过情况下使用dd