1. 概述

Data Duplicator是Linux中一个​​底层数据操作工具​​,用于读取、转换并输出数据。

dd 可从文件、设备或标准输入中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出,适用于备份、磁盘克隆、启动盘制作等高危操作。其强大性伴随着风险,使用时需格外谨慎。

2. 命令说明

基本语法:

dd if=<输入文件> of=<输出文件> [选项]
  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。

选项说明:

  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
  • conv=<关键字>,关键字可以有以下11种:
    • conversion:用指定的参数转换文件。
    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
  • --help:显示帮助信息
  • --version:显示版本信息

3. 示例

3.1 ​​制作U盘启动盘

dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress

3.2 ​​磁盘克隆与备份

​​全盘备份​​:

dd if=/dev/sda of=/backup.img bs=4M conv=noerror,sync

恢复备份​​:

dd if=/backup.img of=/dev/sda bs=4M

​​3.3 文件格式转换​​

大小写转换​​:

dd if=source.txt of=upper.txt conv=ucase  # 转大写

由标准输入设备读入字符串,并将字符串转换成大写后,再输出到标准输出设备:  

dd conv=ucase  #if默认为标准输入、of默认为标准输出

输入以上命令后按回车键,输入字符串,再按回车键,按组合键Ctrl+D 退出,出现以下结果:

dd conv=ucase
Hello Linux! #输入字符串后按回车键
HELLO LINUX! #按组合键Ctrl+D退出,转换成大写结果
记录了0+1 的读入
记录了0+1 的写出
13字节(13 B)已复制,12.1558 秒,0.0 KB/s

​​3.4 生成测试文件  

生成大文件:

dd if=/dev/zero of=test bs=1G count=10   #快速生成10G的大文件

生成一个 1GB 的随机数据文件:

dd if=/dev/urandom of=randfile bs=1M count=1024 status=progress

随机生成1000个1K的小文件:

seq 1000 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1  #随机生成指定大小

3.5 磁盘性能测试​​

测试磁盘写能力:

time dd if=/dev/zero of=testw.dbf bs=4k count=100000 

of文件只用于写,所以这个命令相当于测试磁盘的写能力。

测试磁盘读能力:

time dd if=/dev/sdb of=/dev/null bs=4k 

因为/dev/sdb是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以这个命令的IO只发生在/dev/sdb上,也相当于测试磁盘的读能力。

同时测试读写能力:

time dd if=/dev/sdb of=/root/testrw.dbf bs=4k

在这个命令下,一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb是读,对testrw.dbf是写),假设它们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。

测试纯写入性能:

dd if=/dev/zero of=test bs=8k count=10000  oflag=direct

测试纯读取性能:

dd if=/data/test of=/dev/null  bs=8k count=10000  iflag=direct

执行读写测试时,加上oflag=direct参数,因为没有这个参数,dd 命令有时会显示从内存中传输数据的结果速度,而不是从硬盘,无法测试出真实速度。 

关键参数​​:

/dev/null和/dev/zero的区别:

/dev/null:它是空设备,也称为位桶(bit bucket)、回收站、无底洞,可以向它输出任何数据。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

/dev/zero:是一个输入设备,可用它来初始化文件。该设备无穷尽地提供0,可以使用任何需要的数目——设备提供的要多的多。它可以用于向设备或文件写入字符串0。

4. 性能优化

4.1 调整块大小(bs选项)

选择合适的块大小可以显著提高dd的性能。块大小太小会导致系统调用频繁,增加开销;块大小太大会浪费内存。一般来说,较大的块大小(如 4MB 或 8MB)通常能提高传输速度。

dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress

4.2 使用直接 I/O(oflag=direct选项)

使用直接 I/O 选项可以绕过操作系统的缓存,提高大文件复制的性能。这对于磁盘备份和恢复尤其有效。

dd if=/dev/sda of=/path/to/backup.img bs=4M oflag=direct status=progress

4.3 异步 I/O(oflag=dsync 或 iflag=dsync 选项)

异步 I/O 可以在写入数据时不等待 I/O 操作完成,这样可以提高数据传输效率。dsync选项可以保证数据完整性。

dd if=/dev/sda of=/path/to/backup.img bs=4M oflag=dsync status=progress

4.4 禁用错误检测(conv=noerror,sync 选项)

在复制过程中,如果遇到错误,默认情况下dd会停止。使用noerror选项可以忽略错误,继续复制。sync选项可以填充错误的块,使输出文件和输入文件大小一致。

dd if=/dev/sda of=/path/to/backup.img bs=4M conv=noerror,sync status=progress

4.5 调整输入输出缓冲区大小(ibs 和 obs选项)

可以分别设置输入和输出的块大小,以优化特定设备的读写性能。例如,输入块大小为 1MB,输出块大小为 4MB:

dd if=/dev/sda of=/path/to/backup.img ibs=1M obs=4M status=progress

4.6 设置进度显示(status=progress 选项)

虽然这不会直接提高性能,但 status=progress 选项可以实时显示进度,使你能够监控dd的执行情况,有助于识别和优化性能瓶颈。

dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress

5. 总结

dd是Linux系统管理的​​双刃剑​​,牢记:

  1. ​​三查原则​​:查输入、查输出、查参数;

  2. ​​进度监控​​:必加 status=progress;

  3. ​​替代方案​​:文件复制用 cp,磁盘擦除用 shred。

Linux dd命令详解:数据备份、转换与磁盘操作的终极工具的更多相关文章

  1. linux dd命令详解

    Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 名称: dd 使用权限: 所有使用者dd 这个指令在 ...

  2. linux dd 命令详解

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 ...

  3. linux dd命令详解及使用案例场景

    一.dd命令 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. if ...

  4. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  5. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  6. [转帖]dd命令详解

    dd命令详解 https://czmmiao.iteye.com/blog/1748748 之前一直对linux的命令很恐惧 现在发现 其实不是那么复杂 要仔细学习就可以了 比如 dd = disk ...

  7. Linux find命令详解

    转自Linux find命令详解 一.find 命令格式 1.find命令的一般形式为: find pathname -options [-print -exec -ok ...] 2.find命令的 ...

  8. 【转】dd命令详解及利用dd测试磁盘性能

    dd命令详解及利用dd测试磁盘性能   linux下dd命令详解 名称: dd 使用权限: 所有使用者 manpage 定义: convert and copy a file 使用方式: dd [op ...

  9. Linux常用命令详解—基于CentOS7

    ## Linux 目录- /:根目录,一般只存放目录,不存放文件- /bin -> /usr/bin:可执行二进制文件的目录,也是常用命令目录,如常用的命令 ls.cat.mv 等- /boot ...

  10. linux zip 命令详解

    功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时 ...

随机推荐

  1. java8接口新特性:default、static

    java8之前接口中的方法默认类型都是public abstract,也就是抽象方法,具体实现都交给实现类.而java8对接口功能做了增强,增加了default方法和static方法,也就是说从jav ...

  2. AT_arc168_e [ARC168E] Subsegments with Large Sums 题解

    题意: \[\begin{aligned} &\text{给定长度为 } n \text{ 的数列 } \{a_i\} \text{ 和两个参数 } k, s \text{,将 } \{a_i ...

  3. 探索Rust:深入了解结构体和枚举的用途与高级功能

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  4. python简单的time ticker

    在某些时候,我们需要精确的启动一个func,如果用time.sleep简单的轮询,会因为执行的任务阻塞,或者其他原因导致无法精确的定时执行. 例如在采集某些数据的时候,需要精确的每60秒采集一次,如果 ...

  5. 应用内存管理:Linux的应用与内存管理

    应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节. 硬件架构 现代计算机体系结构被称为Non-Uniform Memory ...

  6. Java从小白到老白⑥

    一. 1.抽象类vs接口 相同 两者都不能实例化,不能new操作 不同 抽象类abstract 接口interface 抽象类可以用部分方法实现 接口所有方法不能有实现 一个类只能继承(extends ...

  7. dfs优化剪枝

    题目链接:D - Peaceful Teams (atcoder.jp) 先看数据范围,肯定是搜索相关 首先想到从第1个人, 第0个队开始的搜索顺序 ,因为这属于内部顺序,所以每次搜索要回溯状态,注意 ...

  8. Jenkins自动化部署-----持续交付

    前言: 感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多 ...

  9. PyQt实现跨平台毛玻璃背景(全网首发)

    找了很久,大部分都需要调用 win32 API 无法跨平台,终于找到啦 项目地址 安装: python -m pip install BlurWindow 简单例子 import sys from P ...

  10. 洛谷 P3268 [JLOI2016]圆的异或并

    洛谷 P3268 [JLOI2016]圆的异或并 题目描述 在平面上有两两不相交的\(n\)个圆,即其关系只有相离和包含.求这些圆的异或面积并. 异或面积并为:当一片区域被奇数个圆包含则计算其面积,否 ...