分类: 信息化
2016-12-19 10:09:50
dd是一个和上的命令,主要功能为转换和复制文件。
在Unix上,硬件的设备驱动(如)和特殊(如/dev/zero和/dev/random)就像普通文件一样,出现在文件系统中;dd也可以读取(有时也能写入)这些文件。这样,dd也可以用在备份硬件的、取得一定数量的随机数据等任务中。dd程序也可以在复制时处理数据,例如转换、或在与编码间互换。
dd命令可用于各种用途。
dd可以在文件、设备、分区和卷之间复制数据。数据可以从其中任何地方输入或输出;但输出到分区时有重要差异。此外在传输过程中,数据可以用conv选项修改以适应介质。
如果最后一个块有意外长度,试图使用复制整个磁盘可能会忽略掉它;然而dd却可能成功。源和目标磁盘应该具有相同的大小。
dd if=/dev/sr0 of=myCD.iso bs=2048 conv=noerror,sync | 从CD-ROM中创建。 |
dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=noerror | 一个到另一个。 |
dd if=/dev/ad0 of=/dev/ad1 bs=1M conv=noerror | 克隆硬盘“ad0”到“ad1”。 |
noerror选项意味着如果发生错误,程序也将继续运行。sync选项表示填充每个块到指定字节。
可以修复主引导记录。主引导记录可以转移到文件,或从中转移出来。
要复制软盘的前两个扇区:
dd if=/dev/fd0 of=MBRboot.img bs=512 count=2
要创建整个的镜像(包括):
dd if=/dev/sda of=MBR.img bs=512 count=1
要创建仅含引导代码的镜像(不包括):
dd if=/dev/sda of=MBR_boot.img bs=446 count=1
dd可以原地修改数据。
用空字节覆盖文件的前512个字节:
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc
转换选项notrunc意味着不缩减输出文件,也就是说,如果输出文件已经存在,只改变指定的字节,然后退出,并保留输出文件的剩余部分。没有这个选项,dd将创建一个512字节长的文件。
在不同的分区中复制磁盘分区到磁盘映像文件中:
dd if=/dev/sdb2 of=partition.image bs=4096 conv=noerror
出于安全方面的考虑,有时需要擦除丢弃的磁盘。
检查驱动器上是否有数据,并将其输出到标准输出:
dd if=/dev/sda
用零擦除磁盘:
dd if=/dev/zero of=/dev/sda bs=4k conv=notrunc
bs=4k选项使dd一次读取或写入4。在较现代的系统中,这可以使整个进程大大加快。注意用随机数据填充磁盘总是比用零慢的多,因为随机数据必须先由CPU生成。在大多数较现代的磁盘中,用零擦除会使其中的数据永久丢失。
用零擦除磁盘会使它的数据无法被软件恢复。需要注意的是,由于,数据仍然可能通过特殊的实验室技术恢复。
程序可作为执行相同任务的高级工具。
1984年,GNU dd开启了(OSS)数据、文件、驱动器和分区的历史。dd进程一次处理一个块,它的算法只是在用户界面显示运行状态。1999年10月,一个C语言的程序dd_rescue发布了。它的算法一次能处理两个块。但改进dd_rescue的数据恢复算法、2003年的shell脚本作者现在推荐GNU ddrescue。它是一个发布于2004年的C++程序,与大多数的Linux发行版一起发行。在开源软件中,GNU ddrescue有最先进的块大小变换算法。(ddrescue和dd_rescue尽管名字相近,但却是不同的程序。然而,Linux发行版却将dd_rescue包装为“ddrescue”,将GNU ddrescue包装为“gddrescue”)。
GNU ddrescue既稳定又安全。下面是一个未经测试的用法,使用了ddrescue31个选项中的3个:
ddrescue -n /dev/old_disk /dev/new_disk # 快速扫描无错误区域,然后停止 ddrescue -d -r1 /dev/old_disk /dev/new_disk # 工作时直接访问磁盘的错误区域
另一个开源程序savehd7使用更复杂的算法,但它需要安装自己的语言解释器。
对驱动器进行基准测试,使用1024字节块分析连续读取和写入的性能:
dd if=/dev/zero bs=1024 count=1000000 of=file_1GB dd if=file_1GB of=/dev/null bs=64k
用100个随机字节生成文件:
dd if=/dev/random of=myrandom bs=100 count=1
将文件转换为大写:
dd if=filename of=filename1 conv=ucase
创建1GiB的,或增加现有文件的大小:
dd if=/dev/zero of=mytestfile.out bs=1 count=0 seek=1G