Linux dd命令 数据备份、转换与磁盘操作的终极工具

1. 概述

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

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

2. 命令说明

基本语法:

|---|-----------------------------------|
| 1 | 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盘启动盘

|---|--------------------------------------------------------------|
| 1 | dd if``=ubuntu.iso of=``/dev/sdb bs=4M status=progress |

3.2 ​​磁盘克隆与备份

​​全盘备份​​:

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

恢复备份​​:

|---|---------------------------------------------------|
| 1 | dd if``=``/backup``.img of=``/dev/sda bs=4M |

​​3.3 文件格式转换​​

大小写转换​​:

|---|------------------------------------------------------------|
| 1 | dd if``=``source``.txt of=upper.txt conv=ucase ``# 转大写 |

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

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

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

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

​​3.4 生成测试文件

生成大文件:

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

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

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

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

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

3.5 磁盘性能测试​​

测试磁盘写能力:

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

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

测试磁盘读能力:

|---|--------------------------------------------------------|
| 1 | time dd if``=``/dev/sdb of=``/dev/null bs=4k |

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

同时测试读写能力:

|---|---------------------------------------------------------------|
| 1 | time dd if``=``/dev/sdb of=``/root/testrw``.dbf bs=4k |

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

测试纯写入性能:

|---|----------------------------------------------------------------------|
| 1 | dd if``=``/dev/zero of=``test bs=8k count=10000 oflag=direct |

测试纯读取性能:

|---|----------------------------------------------------------------------------|
| 1 | 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)通常能提高传输速度。

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

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

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

|---|----------------------------------------------------------------------------------------|
| 1 | 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选项可以保证数据完整性。

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

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

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

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

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

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

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

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

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

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

相关推荐
ruleslol4 小时前
MySQL的段、区、页、行 详解
数据库·mysql
正在学习前端的---小方同学4 小时前
Harbor部署教程
linux·运维
while(1){yan}5 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
それども5 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊5 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
富士康质检员张全蛋5 小时前
JDBC 连接池
数据库
yangminlei5 小时前
集成Camunda到Spring Boot项目
数据库·oracle
Sean X6 小时前
Ubuntu24.04安装向日葵
linux·ubuntu
ChineHe6 小时前
Redis数据类型篇002_详解Strings核心命令与存储结构
数据库·redis·缓存
清水白石0087 小时前
《从零到进阶:Pydantic v1 与 v2 的核心差异与零成本校验实现原理》
数据库·python