这篇指南将详细介绍如何使用 dd 命令进行备份,包括其原理、常用方法、高级技巧以及非常重要的注意事项。

dd 命令的核心原理
dd 的基本语法结构是:
dd if=<input_file> of=<output_file> [options]
- if (Input File): 指定输入源,这可以是一个磁盘设备(如
/dev/sda)、一个分区(如/dev/sda1)、一个普通文件,甚至是标准输入。 - of (Output File): 指定输出目标,同样,可以是磁盘设备、文件或标准输出。
- options: 各种选项,用于控制数据如何被读取、转换和写入。
工作流程:dd 会按照指定的块大小,从 if 读取数据,可选地经过转换)写入到 of,直到读取完所有输入数据。
dd 备份的常用方法
方法1:整盘备份(制作镜像)
这是最常见的用法,将整个磁盘(包括引导记录、分区表、所有分区和数据)原封不动地复制成一个镜像文件。
场景:备份整个硬盘,以便将来恢复到相同或另一块硬盘。

命令示例:
假设我们要将 /dev/sda(第一块SATA硬盘)完整备份到当前目录下的 sda_backup.img 文件中。
sudo dd if=/dev/sda of=./sda_backup.img bs=4M status=progress
命令分解:
sudo:dd需要root权限才能直接访问磁盘设备。if=/dev/sda: 输入是/dev/sda整个磁盘。of=./sda_backup.img: 输出到当前目录下的sda_backup.img文件。bs=4M: 块大小,设置为4MB,使用较大的块大小可以显著提高复制速度,尤其是在现代SSD上。M代表 Megabytes (1024*1024 bytes)。status=progress: 显示实时的复制进度、已传输速度和总时间,非常推荐使用这个选项。
恢复命令:
当需要恢复时,只需将 if 和 of 互换即可。⚠️ 这会覆盖目标盘上的所有数据!
sudo dd if=./sda_backup.img of=/dev/sda bs=4M status=progress
方法2:分区备份
如果你只想备份某个特定的分区,而不是整个磁盘,可以指定分区设备名。

场景:只备份系统所在的 /dev/sda1 分区,或者数据所在的 /dev/sdb2 分区。
命令示例:
备份 /dev/sda1 分区到 sda1_backup.img。
sudo dd if=/dev/sda1 of=./sda1_backup.img bs=4M status=progress conv=noerror,sync
命令分解:
if=/dev/sda1: 输入源是sda1这个分区。conv=noerror,sync: 这是一个非常重要的选项组合。noerror: 当遇到读取错误时(如坏道),dd不会立即退出,而是会继续执行。sync: 如果遇到读取错误,dd会在输出中用空字节(NUL,值为0x00)填充整个块,以保持输出文件的大小和布局与输入一致,这对于制作一个可恢复的、即使包含坏道的镜像至关重要。
方法3:通过网络备份
dd 可以结合 netcat (或 nc) 将数据直接通过网络传输到另一台服务器,实现远程备份。
场景:将本地磁盘备份到远程服务器,而无需在本地生成巨大的镜像文件。
在备份源服务器上执行:
假设我们要将 /dev/sda 备份到远程IP为 168.1.100 的服务器的 sda_net_backup.img 文件中。
# 使用 netcat (nc) sudo dd if=/dev/sda bs=4M | nc -l -p 12345 | gzip > ./sda_net_backup.img.gz # 或者使用 pv (Pipe Viewer) 可以看到进度 sudo pv -tpreb /dev/sda | nc -l -p 12345 | gzip > ./sda_net_backup.img.gz
在备份目标服务器上执行:
你需要先在目标服务器上启动一个 netcat 客户端来接收数据。
# 接收数据并保存 nc 192.168.1.100 12345 > sda_net_backup.img # 或者接收数据并同时进行压缩 nc 192.168.1.100 12345 | gzip > sda_net_backup.img.gz
注意:这种方法的网络传输是未加密的,不适用于公网,在公网上应使用更安全的工具如 ssh。
方法4:使用 SSH 进行安全的网络备份
这是更推荐的网络备份方式,通过 SSH 加密传输数据,既安全又方便。
在备份源服务器上执行:
将本地 /dev/sda 备份到远程服务器 user@remote_host 的 ~/backups/ 目录下。
sudo dd if=/dev/sda bs=4M | gzip -c | ssh user@remote_host "dd of=~/backups/sda_ssh_backup.img.gz"
命令分解:
dd if=/dev/sda bs=4M: 从本地磁盘读取数据。- 管道,将前一个命令的输出作为后一个命令的输入。
gzip -c: 压缩数据,-c表示将结果输出到标准输出,而不是文件。| ssh user@remote_host "...": 通过 SSH 连接到远程服务器,并在远程服务器上执行引号内的命令。"dd of=~/backups/sda_ssh_backup.img.gz": 在远程服务器上,dd接收来自SSH管道的数据,并将其解压(因为dd会原样写入,gzip的压缩数据被当作二进制流直接存入文件),保存为压缩后的镜像文件。
高级技巧与重要选项
| 选项 | 全称 | 描述 | 示例 |
|---|---|---|---|
bs |
Block Size | 设置输入和输出的块大小。bs=4M 比 bs=512 快得多。 |
bs=4M |
ibs |
Input Block Size | 只设置输入块大小。 | ibs=1M |
obs |
Output Block Size | 只设置输出块大小。 | obs=1M |
count |
只复制指定数量的块,常用于备份磁盘的前几个扇区(如MBR)。 | count=1 (复制1个块) |
|
status |
显示或隐藏复制状态。progress 显示进度条。 |
status=progress |
|
conv |
Convert | 转换文件,常用值:noerror,sync, notrunc (不截断输出文件)。 |
conv=noerror,sync |
iflag |
Input Flag | 设置输入文件的标志。fullblock 确保读取完整的块。 |
iflag=fullblock |
oflag |
Output Flag | 设置输出文件的标志。append (追加), direct (直接IO,绕过缓存)。 |
oflag=append |
极其重要的注意事项(dd 的风险)
dd 被戏称为 "Disk Destroyer"(磁盘毁灭者) 或 "Disk Duplicate"(磁盘复制者),因为它的威力巨大且操作不可逆。
-
if和of千万不能搞反!dd if=A of=B的意思是 把 A 复制到 B。- 如果你误写成
dd if=B of=A,就会把 B 复制到 A,导致 A 的原始数据被彻底覆盖,无法恢复。 - 黄金法则:在按下回车键之前,反复检查 你的
if和of参数是否正确。
-
数据备份前务必验证!
-
使用
dd备份后,最好能验证一下镜像文件是否和源盘数据一致。 -
可以使用
md5sum或sha256sum计算校验和,但请注意,对于大文件,计算校验和本身也需要很长时间。 -
示例:
# 计算源分区的校验和 (可能需要卸载分区或从Live CD/USB启动) sudo md5sum /dev/sda1 > source.md5 # 计算镜像文件的校验和 md5sum sda1_backup.img > backup.md5 # 比较两个文件 diff source.md5 backup.md5
-
-
了解你的设备
- 在操作前,使用
lsblk或fdisk -l命令清楚地了解你的磁盘和分区结构,确保你操作的设备名(如/dev/sda,/dev/nvme0n1p2)是正确的。
- 在操作前,使用
-
谨慎使用网络备份
- 确保网络连接稳定,如果网络中断,
dd命令会失败,但已经写入远程服务器的数据不会被自动删除,可能会产生不完整的文件。
- 确保网络连接稳定,如果网络中断,
更现代的替代方案
虽然 dd 功能强大,但对于日常备份,它显得有些“粗暴”,现代备份工具通常更灵活、更安全、功能更丰富:
rsync: 文件级别的同步工具,非常高效,支持增量备份(只同步变化的部分),是目录和文件备份的首选。partclone/partimage: 专门为分区设计的备份工具,通常比dd更快,并且支持压缩和增量备份。Clonezilla: 基于partclone的强大磁盘克隆/备份工具,提供了图形界面,非常适合制作系统克隆或完整磁盘备份。tar: 经典的归档工具,配合gzip/bzip2/xz等压缩工具,可以非常灵活地备份目录和文件。
dd适用于:需要精确复制底层结构(如MBR、GPT分区表)、制作启动U盘、或者需要简单粗暴地制作完整磁盘镜像的场景。rsync/Clonezilla等工具适用于:日常的文件系统备份、系统迁移、需要增量备份和压缩的场景。
希望这份详细的指南能帮助你安全、有效地使用 dd 命令进行备份!
