dd 是一个在 Linux 和类 Unix 系统中用于转换和复制文件的强大工具,它的名字据称来自 "dd",即 "Data Description"(数据描述)的缩写,或者是一个双关语,来自 IBM 的 JCL 语句 DD (Data Definition)。

dd 命令的核心功能是低级别的复制,它直接读取输入文件(或设备)的原始字节,并将其原封不动地写入输出文件(或设备),不关心文件系统或数据结构,这使得它在很多特殊场景下非常有用。
dd 命令的基本语法
dd 命令的基本语法非常简单:
dd if=<input_file> of=<output_file> [options]
- if= (Input File): 指定输入源,它可以是一个普通文件(如
~/my.iso),也可以是一个设备文件(如/dev/sdb代表一个U盘,/dev/zero代表一个无限的数据源)。 - of= (Output File): 指定输出目标,同样,可以是文件或设备。
- [options]: 其他选项,用于控制复制过程,如
bs,count,status等。
核心选项详解
理解以下几个关键选项是掌握 dd 的关键。
a. if= 和 of= (输入与输出)
这是 dd 最核心的两个选项。

-
示例: 复制一个文件
# 将文件 a.txt 复制到 b.txt dd if=a.txt of=b.txt
-
示例: 备份整个硬盘
# 警告:这会清空目标硬盘的所有数据! # 假设 /dev/sda 是源硬盘,/dev/sdb 是目标硬盘 dd if=/dev/sda of=/dev/sdb
b. bs= (块大小)
bs 指定每次读取和写入的块大小,单位通常是字节,默认值是 512 字节。
- 格式:
bs=<size> - 示例: 使用 1MB 的块大小进行复制
# 1M 代表 1 * 1024 * 1024 字节 dd if=/dev/sda of=/dev/sdb bs=1M
- 为什么重要?
- 性能: 较大的
bs值可以显著提高复制速度,尤其是在复制大文件或硬盘时,因为它减少了 I/O 操作的次数。 - 单位: 你可以使用
K(千字节),M(兆字节),G(吉字节) 等来简化书写。1M通常比1048576更易读。
- 性能: 较大的
c. count= (块数量)
count 指定要从输入文件中复制的块数量,块大小由 bs 决定。

- 格式:
count=<number_of_blocks> - 示例: 只复制硬盘的前 1GB 数据
# bs=1M 表示每块 1MB,count=1024 表示复制 1024 块 # 总共复制 1024 * 1MB = 1GB dd if=/dev/sda of=sda_backup.img bs=1M count=1024
- 用途: 通常用于创建镜像备份,而不是完整复制整个设备。
d. status= (状态输出)
dd 默认不显示进度,这会让用户感到不安。status 选项可以解决这个问题。
progress(推荐): 显示实时的传输统计信息,包括已复制的字节数、速度和预计剩余时间。dd if=/dev/sda of=/dev/sdb bs=1M status=progress
none: 不显示任何状态信息。noxfer: 只在完成时显示最终摘要。
实用场景与示例
dd 的真正威力体现在以下场景中。
创建可启动的 USB 驱动器
这是最常见的用途之一,你需要把一个 ISO 镜像文件 "烧录" 到一个 U 盘中,使其成为可启动的安装盘。
步骤:
-
找到你的 U 盘设备名
- 插入 U 盘。
- 打开终端,运行
lsblk或sudo fdisk -l。 - 你会看到类似
/dev/sda,/dev/sdb,/dev/nvme0n1等设备,新插入的 U 盘是/dev/sdb或类似设备。请务必确认设备名,因为下一步会彻底清除该设备的数据!
-
使用
dd命令进行烧录- 假设你的 ISO 文件是
~/Downloads/ubuntu-22.04.3-desktop-amd64.iso,你的 U 盘是/dev/sdb。
# 强烈建议使用 status=progress 来查看进度 sudo dd if=~/Downloads/ubuntu-22.04.3-desktop-amd64.iso of=/dev/sdb bs=4M status=progress
- 注意:
of=/dev/sdb是直接写入设备,整个 U 盘的所有数据都会被覆盖!bs=4M是一个常用的块大小,能提供不错的速度。- 这个命令执行时不会有太多输出,直到完成。
status=progress会让你安心。
- 假设你的 ISO 文件是
备份和恢复硬盘/分区
a. 完整备份硬盘
将整个硬盘 /dev/sda 备份为一个镜像文件。
# 创建 sda 的完整镜像 sudo dd if=/dev/sda of=~/sda_backup.img bs=4M status=progress
b. 从镜像恢复硬盘
将刚才创建的镜像文件恢复到硬盘 /dev/sdb。
# 从镜像恢复到硬盘 sudo dd if=~/sda_backup.img of=/dev/sdb bs=4M status=progress
c. 备份单个分区
假设你想备份 /dev/sda1 分区。
# 备份 sda1 分区 sudo dd if=/dev/sda1 of=~/sda1_backup.img bs=4M status=progress
安全擦除硬盘数据
标准的删除操作只是标记空间为可写,数据并未真正消失。dd 可以用全零覆盖整个硬盘,从而彻底擦除数据。
# 用全零填充 /dev/sdb,擦除所有数据 # 这可能需要很长时间,取决于硬盘大小 sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
-
/dev/zero: 这是一个特殊的设备文件,它会不断地提供零(NULL字节)。 -
更安全的方法: 使用随机数据填充两次(DoD 5220.22-M 标准)。
# 第一遍:用随机数据填充 sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress # 第二遍:再用全零填充 sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
测试硬盘读写速度
这是一个快速了解硬盘性能的技巧。
-
写速度测试:
# 创建一个 1GB 的测试文件,并记录时间 dd if=/dev/zero of=~/testfile.img bs=1G count=1 oflag=direct
oflag=direct: 绕过系统缓存,直接写入磁盘,能更真实地反映硬件速度。
-
读速度测试:
# 读取刚才创建的 1GB 文件,并记录时间 dd if=~/testfile.img of=/dev/null bs=1G iflag=direct
iflag=direct: 同样,绕过系统缓存进行读取。of=/dev/null: 将所有读取的数据丢弃到一个“黑洞”设备中,这只是为了测量读取速度,不关心数据内容。
⚠️ 重要警告:dd 是一个危险的命令!
dd 被戏称为 "Disk Destroyer"(磁盘毁灭者)或 "Delete Data"(删除数据),因为它功能强大且直接,几乎没有安全检查。
- 不要弄错
if和of! 如果你把if和of写反了,dd if=/dev/sdb of=/dev/sda,你会把 U 盘的内容写入你的主硬盘,导致系统崩溃和数据丢失。 - 确认设备名! 在运行
dd之前,务必使用lsblk或sudo fdisk -l仔细检查你要操作的设备名,操作硬盘是不可逆的。 - 它不会覆盖已有文件!
of指定的文件已存在,dd会直接覆盖它,从头开始写入。
dd 的现代替代品
虽然 dd 很经典,但也有一些更现代、更安全的工具,特别是用于创建启动盘:
gnome-disks(或disks): Ubuntu 自带的图形化磁盘工具,有“还原磁盘映像”功能,可以安全地将 ISO 写入 USB,它会自动处理分区和引导,非常安全。balenaEtcher: 一个跨平台的、非常受欢迎的 USB 启动盘制作工具,界面友好,操作简单。Ventoy: 一个功能更强大的工具,你只需将 ISO 文件复制到 U 盘即可制作成多启动盘,无需每次都格式化和写入。
- 学习
dd:对于系统管理员和高级用户来说,dd是一个必须掌握的基础工具,尤其是在没有图形界面的服务器环境中。 - 日常使用:对于普通用户,在制作启动盘时,强烈推荐使用
gnome-disks或balenaEtcher,它们更安全、更方便,只有在进行底层磁盘操作(如备份、擦除)时,才需要动用dd。
