您的位置:首页 > 运维架构 > Linux

转载_linux中的dd命令介绍

2013-04-15 10:44 211 查看
今天重新看了一下dd命令的介绍才知道dd的作用.

描述

dd 命令读取 InFile 参数或者标准输入,进行指定的转换,然后将转换后的结果复制到 OutFile 参数或者标准输出中。可以指定输入输出块的大小以利用原始的物理 I/O。

注:

Block 项指的是 dd 命令在一个操作中读取或者写的数据的数量,并且无需和磁盘块的大小相等。

指定了大小的地方需要一定字节数。由 w、b 或者 k 结尾的数字表示分别与 2、512 或者 1024 相乘;由 x 或者 * (星号)隔开的两个数字说明是乘积。count 参数表示待复制的块的数量,而不是字节的数量。

由 conv=ascii 和 conv=ebcdic 标志关联的字符集映射是求补运算。这些标志在 ASCII 字符和大多数工作站和键控穿孔机上找到的 EBCDIC 字符子集间进行映射。

如 果指定了任何 block、unblock、ascii、ebcdic 或 ibm 转换,则使用 cbs 参数值。如果指定了 unblock 或者 ascii 参数,那么 dd 命令将会执行一个固定长度到可变长度的转换。否则它将执行从可变长度到固定长度的转换。cbs 参数决定了该固定长度。

注意: 如果 cbs 参数指定的值小于最小输入块的值,则转换块将会被截短。

转换完成后,dd 命令将报告完整和部分输入输出块的数量。

注:

1. 通常您只需对输出文件的写许可。但是,当输出文件是不能直接访问的设备并且使用了 seek 标志,您还需要对文件的读访问。

2. 只有当以 conv=ascii 或 conv=unblock 标志集转换时,dd 命令才会插入新行字符;只有当以 conv=ebcdic、 conv=ibm 或者 conv=block 标志集转换时,才能填充。

3. 在将文件复制到磁带时,尽可能使用 backup、tar 或者 cpio 命令来取代 dd 命令。这些命令被设计用来和磁带设备一起使用。要获得更多的使用磁带设备的信息,请参阅 rmt 特殊文件。

4. 由 bs、ibs 和 obs 标志指定的块大小值必须始终是使用的介质物理块大小的整数倍。

5. 当指定了 conv=sync 标志后,dd 命令用空值填充所有的部分输入块。这样,如果任何读取没有接收到一个完整的数据块(由标志 ibs 指定),则 dd 命令将在数据流中间插入空值。在从管道中读入时,这是经常发生的事情。

6. 如果 bs 标志由它自身指定而除了 sync、noerror 或者 notrunc 没有指定其它转换,那么从每个输入块得到的数据将会被作为一个单独的输出块写入;如果读入返回的值小于一个完整的块且没有指定 sync 标志,那么结果输出块将会和输入块的大小相同。如果没有指定 bs 标志或者指定了
sync、noerror 或 notrunc 之外的其它转换,那么输入将会被处理并收集到完整的输出块中,直到输入结束。

设备范围

如果输入文件比输出设备的物理大小要大,dd 命令可以跨设备工作。

注:

在指定块大小时注意 bs 必须为设备物理大小的整数倍因为不正确的块大小将会导致数据的不一致或者重叠。

如果 InFile 或 OutFile 参数是 stdin 或 stdout 时,dd 的跨设备范围将不会出现。

在写的过程中如果输出设备已经写满,dd 命令提示输入下一个设备时,将发生跨范围操作。从输入设备读入时,如果数据已从设备中完全读取(即使设备没有到达结尾),dd 也将提示下一个设备。在这种情况下,需要按下‘n’退出。

标志

bs=BlockSize 指定输入输出块的大小,取代 ibs 和 obs 标志。由 bs 标志指定的块大小值必须始终是使用的媒介物理块大小的整数倍。

cbs=BlockSize 指定由可变长度到固定长度和从固定长度到可变长度(如 conv=block)的转换块大小。

count=InputBlocks 仅复制由 InputBlocks 变量指定的输入块的数量。

conv= Conversion,.... 指定一个或者多个转换选项。多个转换之间用逗号隔开。以下清单描述了可能的选项:

ascii

由 EBCDIC 转换为 ASCII。该选项与 ebcdic、ibm、block 和 unblock 选项冲突。

block

将变长记录转换到固定长度。长度由转换块大小(cbs)决定。该选项与 ascii、ebcdic、ibm 和 unblock 选项冲突。

ebcdic

由 ASCII 转换到标准 EBCDIC。该选项与 ascii、ibm、block 和 unblock 选项冲突。

ibm

将 ASCII 转换为 IBM 版本的 EBCDIC。该选项与 ascii、ebcdic、block 和 unblock 选项冲突。

iblock、 oblock

在直接访问设备发生读写错误时使数据损失最小。如果您指定了 iblock 变量而在块读取期间发生了错误(其中块大小为 512 或者由 ibs=InputBlockSize 变量指定大小),dd 命令试图以较小的大小单元重新读取数据块。如果 dd 命令可以确定输入设备的扇区大小,它将每次读取损坏块的一个扇区。否则它将每次读取
512 字节。输入块大小(ibs)必须是重试大小的整数倍。该选项包含与读入单个扇区错误有关的数据丢失。oblock 转换在输出时进行类似工作。

lcase

使得所有的字母字符转换为小写。

noerror

发生错误也不停止进程。

notrunc

不截取输出文件。相反,将保留不显式写入输出的块。

ucase

使得所有的字母字符转换为大写。

swab

交换每对字节。

sync

将每个输入块填充到由 ibs 值指定的长度。

unblock

将固定长度的块转化为可变长度。长度由转换块大小(cbs)决定。该选项与 ascii、ebcdic、ibm 和 block 选项冲突。

files=InputFiles 在结束之前复制由 InputFiles 变量值指定的文件数(只对磁带或类似设备输入的有用)。

fskip=SkipEOFs 在开始复制之前跳过由 SkipEOFs 变量指定数量的文件结束符;该 SkipEOFs 变量在多文件磁带中进行定位时很有用。

ibs=InputBlockSize 指定输入块的大小;缺省值为 512 字节或者一个块。由 ibs 标志指定的块大小值必须始终是使用的媒介物理块大小的整数倍。

if=InFile 指定输入文件的名称;标准输入是缺省值。

obs=OutputBlockSize 指定输出块的大小;缺省值为 512 字节或者一个块。由 obs 标志指定的块大小值必须始终是使用的媒介物理块大小的整数倍。

of=OutFile 指定输出文件的名称;标准输出是缺省值。

seek=RecordNumber 在复制之前从输出文件的开始寻找由 RecordNumber 变量指定的记录。

skip=SkipInputBlocks 在开始复制之前跳过指定的 SkipInputBlocks 值的输入块。

span=yes|no 如果指定为 yes 则允许设备范围而如果指定为 no则按缺省工作。请参阅 Spanning Across Devices 以获得更多信息。

退出状态

此命令返回下列退出值:

0 输入文件已经成功复制。

>0 发生错误。

示例

1. 要将 ASCII 文本文件转化为 EBCDIC,请输入:

dd if=text.ascii of=text.ebcdic conv=ebcdic

该命令将 text.ascii 文件转化为 EBCDIC 版本并存在 text.ebcdic 文件中。

注:

如果您指定了 conv=ebcdic 参数,dd 命令将会将 ASCII ^(弯曲号)字符转换为未使用的 EBCDIC 字符(十六进制的 9A),将 ASCII ~(代字号)转换为 EBCDIC ^(NOT 符号)。

2. 要将变长记录的 ASCII 文件 /etc/passwd 转换为一个固定长度为 132 字节的 EBCDIC 纪录,请输入:

dd if=/etc/passwd cbs=132 conv=ebcdic of=/tmp/passwd.ebcdic

3. 要将每个记录为 132 字节的 EBCDIC 文件转换为小写的、可变长度的 ASCII 行,请输入:

dd if=/tmp/passwd.ebcdic cbs=132 conv=ascii of=/tmp/passwd.ascii

4. 要将变长记录的 ASCII 文件/etc/passwd 转换为一个固定长度为 132 字节的 IBM 版本的 EBCDIC 文件,请输入:

dd if=/etc/passwd cbs=132 conv=ibm of=/tmp/passwd.ibm

5. 要从块大小为 1kB 的磁带中将块复制到块大小为 2kB 的磁带,请输入:

dd if=/dev/rmt0 ibs=1024 obs=2048 of=/dev/rmt1

6. 要将 dd 命令作为一个过滤器使用,请输入:

ls -l | dd conv=ucase

该命令将用大写字母显示当前目录的长列表。

注:

dd 和 cpio 命令在 12 型 9348 磁带单元上的性能可以通过修改缺省块大小来得到改善。要修改块大小,请按下面的方法使用 chdev 命令:

chdev -l Device_name -a block_size=32k

7. 要使用 36个 512 字节块来有效的实现向 3.5 英寸 1.4MB 软盘的传输,请输入:

dd if=Filename of=/dev/rfd0 bs=36b conv=sync

该命令将 Filename 参数的值一次一个柱面的写入到软盘设备。当从磁盘读入或者当文档的大小不是软盘块大小的整数倍时需要 conv=sync 参数。如果 dd 命令的输入是一个管道而不是一个文件,请勿尝试使用本方法,它将在大多数输入中填充入空格而不只是最后一个块。

8. 要将块从块大小为 720 字节的输入文件复制到 1.44MB 大小的软盘当中,请输入:

dd if=testfile of=/dev/fd0 bs=720b conv=sync

注:

如果输入文件大于输出设备的物理大小,dd 命令将会提示您使用另外一个设备。

9. 要将块从块大小为 32k 字节的输入文件复制到磁带中,请输入:

dd if=inputfile of=/dev/rmt0 bs=32k conv=sync

10. 要将数据的块从磁带复制到当前目录中的文件中(块大小设置为 32k),按照下面的方法输入:

dd if=/dev/rmt0 of=outfile bs=32k conv=sync

11. 要将块从块大小为 720 字节的输入文件复制到 1.44MB 大小的软盘当中,请输入:

dd if=testfile of=/dev/fd0 bs=720b conv=sync span=yes

注:

如果输入文件大于输出设备的物理大小,那么 dd 命令将会提示您使用另外一个设备。

12. 要将块从块大小为 32k 字节的输入文件复制到磁带中,请输入:

dd if=inputfile of=/dev/rmt0 bs=32k conv=sync span=yes

13. 要将块数据从块大小为 32k 的磁带复制到当前目录中的文件中,请输入:

dd if=dev/rmt0 of=outfile bs=32k conv=sync span=yes
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: