【busybox记录】【shell指令】dd

目录

内容来源:

【GUN】【dd】指令介绍

【busybox】【dd】指令介绍

【linux】【dd】指令介绍

使用示例:

常用组合指令:

指令不常用/组合用法还需继续挖掘:


内容来源:

        GUN : Coreutils - GNU core utilities

        busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客

【GUN】【dd】指令介绍

dd:转换和复制文件
dd 使用可变的I/O块大小将输入复制到输出,同时可选地对数据执行转换。
简介:
dd [operand]...
dd option
唯一的选项是 --help和 --version。参见第2章[常见选项],第2页。
默认情况下,dd将标准输入复制到标准输出。为了复制,dd会重复执行以下步骤。
1. 读取一个输入块。
2. 如果通过' sync '进行转换,则根据需要填充以满足输入块的大小。如果通过' block '或' unblock '转换,请用空格填充,否则为NUL字节。
3. 如果给定了' bs= ',并且没有给出步骤(4)或(5)中提到的转换,则将数据输出为单个块,并跳过所有剩余步骤。
4. 如果给出了' swab '转换,交换每一对输入字节。如果输入数据长度为奇数,则保留最后一个输入字节(因为没有东西与之交换)。
5. 如果给出了' swab '、' block '、' unblock '、' lcase '、' ucase '、' ascii '、' ebcdic '和' ibm '中的任何一个转换,请进行这些转换。这些转换操作独立于输入块,并且可能处理跨越块边界的记录。
6. 将结果数据聚合成指定大小的输出块,然后依次输出每个输出块。不要填充最后一个输出块;它可以比平时短。

dd 接受以下操作数,其语法受OS/360 JCL中的dd(数据定义)语句的启发。
‘if=file’      从文件中读取而不是从标准输入中读取。
‘of=file’      写入file而不是标准输出。除非指定了' conv=notrunc ',否则在写入文件之前将其截断。
‘ibs=bytes’    设置输入块大小为字节。这使得dd在每个数据块上读取字节数。默认值是512字节。
‘obs=bytes’    设置输出块大小为字节。这使得每个数据块的dd写入字节数。默认值是512字节。
‘bs=bytes’     将输入和输出块大小都设置为字节。这使得dd在每个数据块上读写字节数,覆盖了所有的' ibs '和' obs '设置。此外,如果没有指定用于数据转换的conv操作数,即使输入数据小于块大小,也会在读取后立即复制到输出中。
‘cbs=bytes’    将转换块大小设置为字节。当将变长记录转换为定长记录(conv=block)或相反(conv=unblock)时,使用字节作为固定记录长度。
‘skip=n’       
‘iseek=n’      在复制之前跳过输入文件中的n个' ibs '字节块。如果n以字母' B '结尾,则将n解释为字节计数而不是块计数。(' B '和' iseek= '拼写是POSIX的GNU扩展。)
‘seek=n’       
‘oseek=n’      在截断或复制前跳过输出文件中的n个' obs '字节块。如果n以字母' B '结尾,则将n解释为字节计数而不是块计数。(' B '和' oseek= '拼写是POSIX的GNU扩展。)
‘count=n’      从输入文件中复制n个' ibs '字节块,而不是直到文件末尾的所有内容。如果n以字母' B '结尾,则将n解释为字节计数而不是块计数;这是POSIX的GNU扩展。如果发生短读,例如从管道读取时可能出现的情况,' iflag=fullblock '确保' count= '统计完整的输入块而不是输入读取操作。作为POSIX的扩展,' count=0 '复制零块,而不是复制所有块。
‘status=level’ 指定打印的信息量。如果多次给出这个操作数,最后一个操作数优先。level值可以是下列值之一。
	‘none’     不打印任何信息或警告消息到标准错误。错误消息会正常输出。
	‘noxfer’   不打印通常构成最后状态行的最终传输速率和音量统计数据。
	‘progress’ 在处理每个输入块时,打印标准错误上的传输速率和体积统计。统计信息最多每秒一行输出一次,但是更新在等待I/O时可能会延迟。
	在接收到' INFO '信号或dd退出时,传输信息通常输出为标准错误,在C语言环境中默认为以下形式:
		7287+1 records in
		116608+0 records out
		59703296 bytes (60 MB, 57 MiB) copied, 0.0427974 s, 1.4 GB/s
符号' w+p '代表w个完整块和p个部分块。当读写操作成功,但传输的数据小于块大小时,发生部分块。如果' conv=block '处理截断了一个或多个输入记录,则在' records out '行之后会输出额外的行,如' 1 truncated record '或' 10 truncated records '。
'status='操作数是POSIX的GNU扩展。
‘conv=conversion[,conversion]...’
	转换由conversion参数指定的文件。(逗号之间不能有空格。)
	转换:
	‘ascii’      使用POSIX指定的转换表将EBCDIC转换为ascii。这为所有256字节提供了1:1的转换。这意味着' conv=unblock ';在删除尾随空格之前,将输入转换为ASCII。
	‘ebcdic’     将ASCII转换为ebcdic。这是' ascii '转换的逆过程。这意味着' conv=block ';在转换为EBCDIC之前添加尾随空格。
	‘ibm’        它的行为类似于' conv=ebcdic ',只不过它使用了由POSIX指定的备用转换表。这不是1:1的翻译,而是反映了' ~ '、'['和']'的常见历史实践。' ascii '、' ebcdic '和' ibm '的转换是互斥的。如果你使用这些转换,你还应该使用' cbs= '操作数。
	‘block’      对于输入中的每一行,输出' cbs '字节,用空格替换输入换行符,并根据需要用空格截断或填充输入行。
	‘unblock’    删除每个' cbs '大小的输入块中末尾的空格,并添加一个换行符。' block '和' unblock '转换是互斥的。如果你使用这两种转换,你还应该使用' cbs= '操作数。
	‘lcase’      将大写字母改为小写。
	‘ucase’      将小写字母改为大写。' lcase '和' ucase '的转换是互斥的。
	‘sparse’     试图查找而不是写入NUL输出块。在支持稀疏文件的文件系统上,扩展输出文件时将创建稀疏输出。在与' conv=notrunc '或' oflag=append '一起使用此转换时要小心。使用' conv=notrunc ',输出文件中对应于输入的NUL块的现有数据将保持不变。使用' oflag=append '时,执行的查找将无效。类似地,如果输出是设备而不是文件,则不会复制NUL输入块,因此这种转换在虚拟设备或预置零设备上非常有用。' sparse '转换是POSIX的GNU扩展。
	‘swab’       交换每一对输入字节。
	‘sync’       将每个输入块以0字节结尾填充到' ibs '大小。当与' block '或' unblock '一起使用时,用空格填充而不是0字节。
	以下“转换”实际上是文件标志,不会影响内部处理:
	‘excl’       如果输出文件已经存在,则' excl '失败;dd 必须自己创建输出文件。
	‘nocreat’    不创建输出文件;输出文件必须已经存在。' excl '和' nocreat '转换是互斥的,它们是POSIX的GNU扩展。
	‘notrunc’    不要截断输出文件。
	‘noerror’    在读取错误后继续。
	‘fdatasync’	 在完成之前同步输出数据,即使有写错误。这强制输出数据的物理写入,因此即使电源丢失,输出数据仍将保留。如果既没有指定this也没有指定' fsync ',则输出与文件系统一样被处理,即输出数据和元数据可能会在操作系统物理写入之前被缓存在主内存中一段时间,因此如果电源丢失,输出数据和元数据可能会丢失。参见14.4节[同步调用],第159页。这个转换是对POSIX的GNU扩展。
	‘fsync’      在完成之前同步输出数据和元数据,即使有写入错误。它的作用类似于' fdatasync ',除了它还保存输出的元数据,例如输出文件的最后修改时间;由于这个原因,它可能比' fdatasync '慢一点,尽管对于dd来说性能差异通常是微不足道的。这个转换是对POSIX的GNU扩展。
‘iflag=flag[,flag]...’
	使用由flag参数指定的标志访问输入文件。(逗号之间不能有空格。)
‘oflag=flag[,flag]...’
	使用由flag参数指定的标志访问输出文件。(逗号之间不能有空格。)
	这些是标志。
	‘append’       以追加模式写入,因此,即使其他进程正在写入该文件,每次dd写入都将追加到文件的当前内容。该标志仅对输出有意义。如果你将此标志与' of=file '操作数结合使用,你还应该指定' conv=notrunc ',除非你希望输出文件在附加之前被截断。
	‘cio’          对数据使用并发I/O模式。此模式执行直接I/O操作,并放弃将所有I/O序列化到同一文件的POSIX要求。文件不能同时以CIO模式和标准打开。
	‘direct’       对数据使用直接I/O,避免使用buffer cache。内核可能会对读写缓冲区的大小施加限制。例如,对于ext4目标文件系统和基于linux的内核,使用
	‘oflag=direct’ 如果输出缓冲区大小不是512的倍数,' oflag=direct '将导致EINVAL写入失败。
	‘directory’    除非文件是目录,否则失败。大多数操作系统不允许对目录进行I/O操作,因此这个标志的实用价值有限。
	‘dsync’        对数据使用同步I/O。对于输出文件,这强制在每次写入时对输出数据进行物理写入。对于输入文件,在读取已经被其他进程同步写入的远程文件时,该标志可能会有影响。元数据(例如,最后访问时间和最后修改时间)不一定要同步。
	‘sync’         对数据和元数据都使用同步I/O。
	‘nocache’      请求丢弃一个文件的系统数据缓存。当count=0时,指定文件的所有缓存数据,否则删除文件处理部分的缓存。另外,当count=0时,将诊断出缓存丢弃失败,并反映在退出状态中。
		因为没有持久化到存储的数据不会从缓存中丢弃,所以下面示例中的' sync '转换最大化了' nocache '标志的有效性。
		下面是一些用法示例:
		#建议删除整个文件的缓存
		dd if=ifile iflag=nocache count=0
		#确保删除整个文件的缓存
		dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
		#建议删除部分文件的缓存
		#内核只考虑完成和
		#已经持久化的页面。
		dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
		#仅使用预读缓存流数据
		#另见' direct '标志。
		dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
	‘nonblock’   使用非阻塞I/O。
	‘noatime’    不更新文件的访问时间。请参阅第28章[文件时间戳]的244页。一些旧的文件系统会忽略这个标志,所以在使用它之前,最好先在你的文件上测试一下。' noctty '不会将文件指定为dd的控制终端。当文件不是终端时,这没有作用。在许多主机上(例如,GNU/Linux主机),该标志根本不起作用。
	‘nofollow’   不跟随符号链接。
	‘nolinks’    如果文件中有多个硬链接,' nolinks '会失败。
	‘binary’     使用二进制I/O。该标志仅在区分二进制I/O和文本I/O的非标准平台上有效。
	‘text’       使用文本I/O。与' binary '一样,此标志在标准平台上没有影响。
	‘fullblock’  从输入中累积完整的块。如果没有一个完整的块可用,read系统调用可能会提前返回。在这种情况下,继续调用read来填充内存块的剩余部分。该标志只能与iflag一起使用。该标志对管道很有用,例如,它们可能返回短读。在这种情况下,需要此标志以确保' count= '参数被解释为块计数,而不是读取操作的计数。
这些标志都是对POSIX的GNU扩展。并不是所有系统都支持它们,当它们不被支持时,' dd '会拒绝使用它们。当从标准输入读取或写入到标准输出时,不应该指定' nofollow '和' noctty '标志,而且其他标志(例如' nonblock ')可能会影响其他进程对受影响的文件描述符的行为,即使在dd退出后也是如此。
如果不止一次指定了除' conv= '、' iflag= '、' oflag= '和' status= '之外的操作数,那么dd的行为就是未指定的。
上面的数值字符串(n和字节数)是无符号十进制整数,后面可以跟着一个乘法器:' b ' =512, ' c ' =1, ' w ' =2, ' xm ' =m,或者任何标准的块大小后缀,如' k ' =1024(参见2.2节[块大小])。这些乘法器是对POSIX的GNU扩展,只是POSIX允许字节数后面跟着' k '、' b '和' xm '。一个' xm '可以在一个数字中多次使用。块长度(即,由字节字符串指定)必须非零。
通过' bs= '、' ibs= '、' obs= '、' cbs= '指定的任何块大小都不应该太大——大于几mb的值通常是浪费的,或者(比如在g. exabyte的情况下)完全会适得其反或导致错误。
要处理偏移量或大小不是I/O块大小倍数的数据,可以使用以字母' B '结尾的数字字符串n。例如,以下shell命令在u盘和磁带之间复制1mib块的数据,但不保存或恢复u盘起始位置的512字节区域:
	flash=/dev/sda
	tape=/dev/st0
	#将除初始512字节外的所有内容从flash复制到tape。
	dd if=$flash iseek=512B bs=1MiB of=$tape
	#从磁带复制回flash,保留最初的512字节。
	dd if=$tape bs=1MiB of=$flash oseek=512B
	对于失败的存储设备,其他工具附带了大量的额外功能,以便在设备最终死亡之前尽可能多地保存数据,例如GNU ddrescue (https://www.gnu.org/software/ddrescue/)。然而,在某些情况下,这样的工具是不可用的,或者管理员觉得处理dd更舒服。作为一个简单的拯救方法,如下面的例子所示:操作数' conv=noerror,sync '用于在读取错误后继续,并用null填充坏的读取,而' iflag=fullblock '则用于短读取(传统上在flash或类似设备上从不发生):
	#从故障设备的(未挂载!)分区中拯救数据
	dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
	向正在运行的dd进程发送一个' INFO '信号(或者在不可用的情况下发送' USR1 '信号),使其将I/O统计信息打印到标准错误中,然后恢复复制。在下面的例子中,dd在后台运行以复制5GB数据。kill命令使其输出中间I/O统计信息,当dd正常完成或被SIGINT信号终止时,输出最终的统计信息。
	#忽略该信号,以免意外终止dd子进程。
	#(在SIGINFO可用时,不需要这样做。)
	trap '' USR1
	#使用全块iflag运行dd以避免短读取
	#可以通过接收信号触发。
	dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!
	#每秒输出统计数据。
	while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
	上面的脚本将输出如下格式:
	3441325+0 records in
	3441325+0 records out
	3441325000 bytes (3.4 GB, 3.2 GiB) copied, 1.00036 s, 3.4 GB/s
	5000000+0 records in
	5000000+0 records out
	5000000000 bytes (5.0 GB, 4.7 GiB) copied, 1.44433 s, 3.5 GB/s
' status=progress '操作数定期更新上面的传输统计信息的最后一行。
在缺少' INFO '信号的系统上,除非设置了POSIXLY_CORRECT环境变量,否则dd会响应' USR1 '信号。
退出状态为零表示成功,非零值表示失败。

【busybox】【dd】指令介绍

【linux】【dd】指令介绍

[root@localhost bin]# dd --help
用法:dd [操作数] ...
 或:dd 选项
Copy a file, converting and formatting according to the operands.

  bs=BYTES        read and write up to BYTES bytes at a time (default: 512);
                  overrides ibs and obs
  cbs=BYTES       convert BYTES bytes at a time
  conv=CONVS      convert the file as per the comma separated symbol list
  count=N         copy only N input blocks
  ibs=BYTES       read up to BYTES bytes at a time (default: 512)
  if=FILE         read from FILE instead of stdin
  iflag=FLAGS     read as per the comma separated symbol list
  obs=BYTES       write BYTES bytes at a time (default: 512)
  of=FILE         write to FILE instead of stdout
  oflag=FLAGS     write as per the comma separated symbol list
  seek=N          skip N obs-sized blocks at start of output
  skip=N          skip N ibs-sized blocks at start of input
  status=LEVEL    The LEVEL of information to print to stderr;
                  'none' suppresses everything but error messages,
                  'noxfer' suppresses the final transfer statistics,
                  'progress' shows periodic transfer statistics

N and BYTES may be followed by the following multiplicative suffixes:
c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M,
GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

Each CONV symbol may be:

  ascii     from EBCDIC to ASCII
  ebcdic    from ASCII to EBCDIC
  ibm       from ASCII to alternate EBCDIC
  block     pad newline-terminated records with spaces to cbs-size
  unblock   replace trailing spaces in cbs-size records with newline
  lcase     change upper case to lower case
  ucase     change lower case to upper case
  sparse    try to seek rather than write the output for NUL input blocks
  swab      swap every pair of input bytes
  sync      pad every input block with NULs to ibs-size; when used
            with block or unblock, pad with spaces rather than NULs
  excl		fail if the output file already exists
  nocreat	do not create the output file
  notrunc	不截断输出文件
  noerror	读取数据发生错误后仍然继续
  fdatasync	结束前将输出文件数据写入磁盘
  fsync	类似上面,但是元数据也一同写入

FLAG 符号可以是:

  append	追加模式(仅对输出有意义;隐含了conv=notrunc)
  direct	使用直接I/O 存取模式
  directory	除非是目录,否则 directory 失败
  dsync		使用同步I/O 存取模式
  sync		与上者类似,但同时也对元数据生效
  fullblock	为输入积累完整块(仅iflag)
  nonblock	使用无阻塞I/O 存取模式
  noatime	不更新存取时间
  nocache   Request to drop cache.  See also oflag=sync
  noctty	不根据文件指派控制终端
  nofollow	不跟随链接文件
  count_bytes  treat 'count=N' as a byte count (iflag only)
  skip_bytes  treat 'skip=N' as a byte count (iflag only)
  seek_bytes  treat 'seek=N' as a byte count (oflag only)

Sending a USR1 signal to a running 'dd' process makes it
print I/O statistics to standard error and then resume copying.

Options are:

      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告 dd 的翻译错误
完整文档请见:<https://www.gnu.org/software/coreutils/dd>
或者在本地使用:info '(coreutils) dd invocation'

使用示例:

使用时查询,无示例。

常用组合指令:

NA

指令不常用/组合用法还需继续挖掘:

NA

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值