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
本文永久更新连结地址:http://www.linuxidc.com/Linux/2017-03/141749.htm