在 Linux 世界中,dd 命令常被誉为“数据医生”或“磁盘手术刀”——它能精准地读取、复制、转换任意字节流,从整块硬盘到单个文件,无所不能。然而,它的强大也伴随着风险:一个参数写错,就可能导致整个系统崩溃或数据永久丢失。

本文不仅介绍 dd 的六大经典用法,更将逐行解析每个参数的含义,帮助你真正理解“为什么这样写”,从而安全、高效地使用这个命令。


什么是 dd?

dd(常被戏称为 “data duplicator”)是一个按块(block)进行数据复制与转换的命令行工具。它不依赖文件系统,直接操作原始字节流,因此适用于磁盘镜像、设备克隆、数据擦除等底层任务。

基本语法:

dd if=输入源 of=输出目标 [选项...]
  • if(input file):指定输入源,默认为标准输入(stdin)
  • of(output file):指定输出目标,默认为标准输出(stdout)
  • 其他关键参数将在具体示例中详解

六大经典用法详解(附参数含义)

1. 备份整个硬盘或分区

dd if=/dev/sda of=/backup/disk.img bs=64K

参数详解:

  • if=/dev/sda:从第一个物理硬盘(sda)读取原始数据。这是设备文件,代表整个磁盘,包括引导区、分区表和所有分区。
  • of=/backup/disk.img:将读取的数据写入名为 disk.img 的镜像文件。
  • bs=64K:设置块大小为 64KB。dd 每次读取和写入 64KB 数据。较大的块可提升 I/O 效率,但并非越大越好(通常 64K–4M 为佳)。
💡 此操作会生成一个与原盘字节级完全一致的镜像,可用于灾难恢复。

2. 从镜像恢复系统

dd if=disk.img of=/dev/sda bs=64K

参数详解:

  • if=disk.img:以之前备份的镜像文件作为输入源。
  • of=/dev/sda:将镜像内容逐字节写回到硬盘 /dev/sda。注意:这会覆盖整个磁盘,包括分区表和所有数据。
  • bs=64K:与备份时保持一致的块大小,确保数据对齐和效率。
⚠️ 极度危险操作! 务必确认 of 指向的是目标磁盘,而非系统盘。

3. 制作 USB 启动盘

dd if=ubuntu-24.04.iso of=/dev/sdb bs=4M status=progress oflag=sync

参数详解:

  • if=ubuntu-24.04.iso:指定 ISO 镜像文件作为输入。
  • of=/dev/sdb:写入到 U 盘设备(通常为 /dev/sdb/dev/sdc 等)。务必通过 lsblkfdisk -l 确认设备名!
  • bs=4M:使用 4MB 块大小,加快写入速度(适合大文件如 ISO)。
  • status=progress实时显示复制进度和速度(GNU dd 特有,Linux 默认支持)。
  • oflag=sync:强制每次写入后同步到物理设备,避免缓存导致“假完成”。
✅ 此方法可制作任何 Linux 发行版的启动盘,比图形工具更可靠。

4. 创建指定大小的空文件(用于测试)

dd if=/dev/zero of=1GB.test bs=1M count=1024

参数详解:

  • if=/dev/zero:从特殊设备 /dev/zero 读取——它会无限输出 全零字节(\0)
  • of=1GB.test:输出到名为 1GB.test 的文件。
  • bs=1M:每块大小为 1MB。
  • count=1024:只复制 1024 个块。因此总大小 = 1MB × 1024 = 1GB

🛠️ 常用于:

  • 测试磁盘写入速度(配合 time
  • 创建虚拟磁盘文件
  • 占位符或填充分区

5. 安全擦除磁盘数据

dd if=/dev/urandom of=/dev/sdX bs=1M

参数详解:

  • if=/dev/urandom:从加密安全的伪随机数生成器读取数据(比 /dev/random 更快,适合大量写入)。
  • of=/dev/sdX:目标磁盘(需替换为实际设备,如 /dev/sdb)。
  • bs=1M:大块写入提升效率。
🔒 此操作会用不可预测的随机数据覆盖整个磁盘,使原始数据极难恢复,符合数据销毁安全标准。
💡 如只需快速清空,可用 if=/dev/zero;如需高安全级别(如退役硬盘),推荐 urandom 或多次覆盖。

6. 文本格式转换(如转大写)

dd if=lowercase.txt of=uppercase.txt conv=ucase

参数详解:

  • if=lowercase.txt:输入文本文件。
  • of=uppercase.txt:输出转换后的文件。
  • conv=ucase:启用转换选项,将所有小写字母转为大写。其他常用值:

    • lcase:转小写
    • swab:交换每对字节(用于字节序转换)
    • sync:用 null 填充块至完整
    • noerror:读取出错时继续(重要!用于坏盘恢复)
    • notrunc:不截断输出文件
📝 虽然现代脚本多用 tr 'a-z' 'A-Z',但 dd 提供了底层转换能力,适用于特定二进制场景。

使用 dd 的黄金法则

  1. 先确认设备名:使用 lsblkfdisk -ldf -h 验证 of= 目标。
  2. 备份前先测试命令:可先用 count=1 只复制一块验证路径。
  3. 善用 status=progress:避免“卡住”假象。
  4. 恢复操作前断开无关磁盘:防止误写。
  5. 关键操作加 conv=noerror,sync:用于损坏磁盘的数据抢救。

结语

dd 不只是一个“复制命令”,它是 Linux 系统与原始数据之间的桥梁。理解每个参数的含义,不仅能让你写出正确的命令,更能让你在系统崩溃、数据误删等紧急情况下冷静应对。

dd 是一把双刃剑——用得好,它是救世主;用不好,它是终结者。”

希望本文能帮助你真正掌握 dd,并在未来的技术道路上更加从容自信。


欢迎在评论区分享你的 dd 使用经验,或提问具体场景!
(例如:如何恢复误删的分区?如何克隆加密硬盘?)