参考:How to use dd in Linux without destroying your disk
Linux dd command explained for beginners (8 examples)
前言
无论你是试图从濒临死亡的存储驱动器(storage drive)中抢救数据,将文件备份到远程存储(remote storage),还是在其他地方制作活动分区(active partition)的完美副本,你都需要知道如何安全可靠地复制驱动器和文件系统。 幸运的是,dd是一个简单而强大的镜像复制(image-copying)工具,它已存在多年,而且在所有这些时间里,没有任何工具可以做的比dd更好。
对驱动器和分区做完美的拷贝
如果你对dd做了足够的研究,你可以使用dd做各种事情。但是最屌的功能还是他对分区(partitions)的操作。当然,使用tar或者scp也可以复制整个文件系统。方法是从一台计算机复制文件,然后在另一台新安装的Linux主机上将它们原样粘贴。但是,由于这些文件系统归档文件(filesystem archives)不是完整的映像,它们将需要两端主机操作系统的支持。
另一方面,使用dd可以完美的制作逐字节镜像(image)。 但是在你开始从一端向另一端分配分区之前,请务必仔细检查你的命令。关于dd有个笑话,"dd stands for disk destroyer."。dd命令中即使你输入一个错误的字符,你都会立即永久地擦除整个驱动器(drive )上有价值的数据。
dd基本操作
如果你想要为/dev/sda整个磁盘创建一个镜像,假设你已经插入一块磁盘并且和/dev/sda大小相同。语法很简单,if=源驱动器(source drive ),of=你想要保存的文件或者位置。


# dd if=/dev/sda of=/dev/sdb
现在假设你先创建/dev/sda驱动器的.img归档文件(.img archive)


# dd if=/dev/sda of=/home/username/sdadisk.img
上面两个例子为整个驱动器创建镜像,你也可以为驱动器的某个分区创建镜像。bs设置一次单次拷贝字节大小,本例中是4096。调整bs值,对dd整个操作执行速度有很大影响。通常这个值依据你硬件配置和其他信息综合考量得出。
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。


# dd if=/dev/sda2 of=/home/username/partition2.img bs=4096
同理,恢复也很简单,反转if和of的值


# dd if=sdadisk.img of=/dev/sdb
/dev/
urandom
还可以在一条命令中执行创建和拷贝2个动作。举例,将远程驱动器/dev/sda压缩传到本地主机


# ssh username@54.98.132.10 "dd if=/dev/sda | gzip -1 -" | dd of=backup.gz
建议:你应该永远确保归档文件是有效的,如果是启动盘( boot drive ),你应该把他插到另一台主机上看能否成功启动OS;如果是磁盘分区,你应该在另一台主机上挂载(mount)他,确保那上边的数据可以正确访问。
使用dd擦除磁盘
据说美国海外大使馆,每个外交大臣手表下都藏有一个政府发放的锤子,估计那个锤子够小够硬。 为什么? 一旦移动设备被不正常的访问使用,那么这把锤子就可以摧毁他们所有的硬盘。
这是什么鬼? 为什么不删除数据呢? 你在开玩笑,对吧? 每个人都知道从存储设备中删除包含敏感数据的文件实际上并不会删除数据。 如果有足够的时间和动力,几乎任何东西都可以从几乎任何数字媒体中检索出来,除了你把他砸的稀烂。
但是,你可以使用dd让坏人更难以获取旧数据。 下面这个命令将花费一些时间在/ dev / sda1分区的每个角落上创建数百万个零:


# dd if=/dev/zero of=/dev/sda1
除了这个还有更好的方式,用/dev/
urandom
作为源,你可以在磁盘上写下随机字符


# dd if=/dev/urandom of=/dev/sda1
监视dd操作过程
由于对磁盘或分区进行归档可能需要很长时间,你可能想要在命令中添加进度监视器。 安装Pipe Viewer(在CentOS上安装yum -y install pv)并与dd组合使用。 使用pv,最后一个命令看起来像这样:


# dd if=/dev/urandom | pv | dd of=/dev/sda1 4,14MB 0:00:05 [ 98kB/s] [ <=> ]
除了使用pv命令,还可以借助参数status=progress
dd其他小技巧
使用dd改变输入文本大小写
使用conv选项,conv=ucase 转换成大写,conv=lcase 转换成小写
按Ctrl+D告诉OS你要结束输入,然后会显示
还可以通过if 或 of参数指定文件
跳过文件中指定行
使用skip参数,跳过N * ibs个字节
未完待续。。。。