To be a better coder
分类: LINUX
2018-08-06 09:37:55
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:吐零
bs=bytes
一次读和写 bytes 字节。这将覆盖 ibs 和 obs 设定的值(并且,设定 bs 不等于同时将 ibs 和
obs 设为同一个值,至少在 只使用 sync, noerror 或 notrunc 转换时是这样的。因为bs规定,每个输入块都应作为单独
的数据块拷贝到输出,而不把较短的块组合到一起)。
conv=转换[,转换]...
将文件按 转换 参数指定的方式转换(在lq,rq两边没有空格)
sync
用0填充到每个输入块的末尾,使其大小为 ibs 字节。
noerror
发生读错误时,继续进行。
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