Windows下的DD命令详解
最近在研究img镜像的写入方法.然后找到了physdiskwrite但是在功能上有很多限制.然后竟然找到了Windows下的dd命令行工具.虽然和Linux的dd有一定的区别但是在功能上还是很强大的.甚至可以将苹果系统镜像写进苹果分区里(实际上苹果分区本身就是img镜像外壳)
软件可以到官网进行下载,虽然称之为dd,但是和Linux的dd还是有一定区别的 :http://www.chrysocome.net/dd
闲话不多说.在网上收集了一些食用方法发现有的不好使.后来经过实践找到了一些门路.老规矩先把相关命令参数记录下来!
以下来自官方的说明和网络资料进行综合重新陈述.
dd的所有参数和格式如下:
dd [bs=SIZE[SUFFIX]] [count=BLOCKS[SUFFIX]] if=FILE of=FILE [seek=BLOCKS[SUFFIX]] [skip=BLOCKS[SUFFIX]] [–size] [–list] [–progress]
if=和of=表示镜像源和镜像目标的设备文件路径
参数:bs
bs 是块大小,相当于缓存区。块大小可以以字节为单位或使用以下后缀来指定:
Description | Suffix | Size |
---|---|---|
字节 | c | 1 |
双字节 | w | 2 |
4字节 | d | 4 |
8字节 | q | 8 |
千字节 | k | 1,024 |
兆字节 | M | 1,048,576 |
千兆字节 | G | 1,073,741,824 |
默认块大小512kb.适用于大多数文件和设备,但是如果使用更大的块大小,则烧录速度会快得多,但是实际要以设备的实际性能来设定.虽然增加1M可能是一个不错的大小和上限。但是对于大多数CD / DVD具有2k扇区大小,并且可能无法以不是该大小的倍数的块的大小工作(也就是说烧录速度是不能超过设备缓存上限的)。
skip表示备份时对if后面的部分也就是原文件跳过多少块在开始备份.是开始读取之前跳过输入文件的距离。它以块为单位,因此距离为skip * blocksize
。您也可以在此处使用后缀,因此skip=1k
将跳过1024个块。您可以通过考虑“ ‘skip ping rope”来记住skip与输入文件有关。
seek是开始写入之前在输出文件中查找的距离。在备份时对Of后面的部分也就是目标文件跳过多少块在开始写.距离也是以块为单位seek * blocksize
。您也可以在此处使用后缀,因此seek=1k
将查找1024个块。您只需要记住,如果跳过是为了进,那么寻找是为了出去。
count 镜像的块总数.是要复制的块数。如果未指定,则dd将继续直到到达文件/设备的末尾。在许多USB设备上,这是不可靠的,因此您应使用--size
猜测设备的大小,请参见下文。您也可以在此处使用后缀,以便count=1k
复制1024个块。
使用–size
传统上,使用dd时,如果要复制整个设备,则无需指定块计数,并且dd会读取到设备末尾为止。如果您尝试读取设备末尾的内容,则将返回直到设备末尾的数据,如果您继续读取,则会收到一条错误消息。Windows并不总是这样做,因此--size
会告诉dd找出设备的大小,并确保它不会超出该点。这对于USB记忆棒非常重要,如果您读完这些记忆棒,它们将停止工作。默认情况下未启用此功能,因为并非总是可能获得正确的设备尺寸。某些设备还不断返回伪造的数据,超出了设备的末尾,而没有返回合适的错误代码
使用–list
Windows提供了多种命名设备的方法。在--list
将输出的首选名称。在NT4下,仅该\\?\Device\Harddisk<n>\Partition<n>
方法可用。 Partition0
是整个磁盘。在Windows XP下,某些分区可能没有卷设备。在这种情况下,您仍然可以使用Harddisk<n>\Partition<n>
名称。
Windows 2000和更高版本具有Volume设备,它们是唯一的GUID,用于标识磁盘或分区(MS称为Volume)。列出了这些文件以及它们可能安装的任何安装点。在大多数情况下,这是驱动器号,但可能是另一个文件系统上的路径。如果要读取基础设备,请不要包含结尾\
字符。如果未安装该卷,则没有容易识别的方法,因此请小心。在XP SP2下,即使未使用许多分区也无法直接读取。有一种工作,我称之为通过后门读取分区。
样品输出
dd --listWindows版本0.4beta1的rawwrite dd。由John Newbigin <jn@it.swin.edu.au>撰写此程序由GPL涵盖。有关详细信息,请参见copying.txt。Win32可用卷信息\\。\ Volume {5cd94d2c-3251-11d9-9444-806d6172696f} \链接到\\?\ Device \ HarddiskVolume1固定介质已安装在\\。\ c:\\。\卷{129b1243-3252-11d9-b167-806d6172696f} \链接到\\?\ Device \ CdRom0 CD-ROM安装在\\。\ r:\\。\卷{129b1242-3252-11d9-b167-806d6172696f} \链接到\\?\ Device \ Floppy0可移动介质安装在\\。\ a:\\。\ Volume {e3429891-0eb9-11da-b18f-000d60dc98cd} \链接到\\?\ Device \ Harddisk1 \ DP(1) 0-0 + 3可移动媒体安装在\\。\ d上:NT块设备对象\\?\ Device \ CdRom0 \\?\ Device \ Floppy0 \\?\ Device \ Harddisk0 \ Partition0链接到\\?\ Device \ Harddisk0 \ DR0固定的硬盘介质。块大小= 512 \\?\ Device \ Harddisk0 \ Partition1链接到\\?\ Device \ HarddiskVolume1 \\?\ Device \ Harddisk1 \ Partition0链接到\\?\ Device \ Harddisk1 \ DR2软盘以外的可移动媒体。块大小= 512 \\?\ Device \ Harddisk1 \ Partition1链接到\\?\ Device \ Harddisk1 \ DP(1)0-0 + 3软盘以外的可移动媒体。块大小= 512虚拟设备/ dev / zero / dev / random
使用–progress
--progress
是dd的非标准增强功能,在进行备份和烧录时会显示工作进度。
虚拟设备
虚拟设备是0.4beta1版中的一项新功能。
因为Windows没有像Unix这样的设备,/dev/zero
或者/dev/random
这些设备已在dd中实现。您可以将它们用作输入文件,以提供无限数量的零或伪随机数据。
标准I / O
如果您未指定的值,则标准输入(stdin)现在是默认输入文件if
。您也可以将stdin显式使用if=-
。如果您未为指定标准输出(stdout)的值,则它现在是默认的输出文件of
。您也可以将stdout显式使用of=-
。进度和错误消息将写入标准错误(stderr)。这允许在管道命令中使用dd。
为了防止意外覆盖错误的磁盘,可以强制使用安全筛选器。可用的过滤器有:
您可以通过重命名dd.exe
为来强制执行过滤器dd-<filter>.exe
。例如,dd-removable.exe
只能写入USB和CF等可移动磁盘,并确保您不会意外写入固定硬盘。
fixed | 仅写入固定磁盘 |
removable | 仅写入可移动磁盘 |
disk | 仅写入任何类型的磁盘 |
partition | 只写分区 |
例子
- 制作一张软盘映像:
dd if=\\.\a: of=c:\temp\disk1.img bs=1440k
- 将Img映像写回到软盘上:
dd if=c:\temp\disk1.img of=\\.\a: bs=1440k
- 从CD翻录成iso文件:
dd if=\\?\Device\CdRom0 of=c:\temp\disc1.iso bs=1M
- 从USB存储设备读取分区:
dd if=\\.\Volume{c18588c0-02e9-11d8-853f-00902758442b} of=c:\temp\usb1.img bs=1M
- 读取整个USB存储设备
dd if=\\?\Device\Harddisk1\Partition0 of=c:\temp\usb2.img bs=1M --size --progress
- 注意:您不能使用此程序写入CD。
软盘极其不可靠。如果出现错误,请尝试使用另一张软盘或重新格式化该磁盘
0.6beta1版本中的更改
- –progress输出与bs指定的单位相同
- 新的过滤器类型“文件”,它将仅写入fileystem文件
- 输入磁盘和输出磁盘的新功能id = <驱动器> /od = <驱动器>。如果<drive>是磁盘上的唯一分区,则将选择整个磁盘。例如:如果您插入USB磁盘并将其安装为f :,则 ‘id = f:’ 将选择USB磁盘(而不仅仅是if =\\.\ f:这样的分区)