菜鸟科技网

dd命令备份如何高效安全操作?

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

dd命令备份如何高效安全操作?-图1
(图片来源网络,侵删)

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:整盘备份(制作镜像)

这是最常见的用法,将整个磁盘(包括引导记录、分区表、所有分区和数据)原封不动地复制成一个镜像文件。

场景:备份整个硬盘,以便将来恢复到相同或另一块硬盘。

dd命令备份如何高效安全操作?-图2
(图片来源网络,侵删)

命令示例: 假设我们要将 /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: 显示实时的复制进度、已传输速度和总时间,非常推荐使用这个选项。

恢复命令: 当需要恢复时,只需将 ifof 互换即可。⚠️ 这会覆盖目标盘上的所有数据!

sudo dd if=./sda_backup.img of=/dev/sda bs=4M status=progress

方法2:分区备份

如果你只想备份某个特定的分区,而不是整个磁盘,可以指定分区设备名。

dd命令备份如何高效安全操作?-图3
(图片来源网络,侵删)

场景:只备份系统所在的 /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=4Mbs=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"(磁盘复制者),因为它的威力巨大且操作不可逆。

  1. ifof 千万不能搞反!

    • dd if=A of=B 的意思是 把 A 复制到 B
    • 如果你误写成 dd if=B of=A,就会把 B 复制到 A,导致 A 的原始数据被彻底覆盖,无法恢复。
    • 黄金法则:在按下回车键之前,反复检查 你的 ifof 参数是否正确。
  2. 数据备份前务必验证!

    • 使用 dd 备份后,最好能验证一下镜像文件是否和源盘数据一致。

    • 可以使用 md5sumsha256sum 计算校验和,但请注意,对于大文件,计算校验和本身也需要很长时间。

    • 示例

      # 计算源分区的校验和 (可能需要卸载分区或从Live CD/USB启动)
      sudo md5sum /dev/sda1 > source.md5
      # 计算镜像文件的校验和
      md5sum sda1_backup.img > backup.md5
      # 比较两个文件
      diff source.md5 backup.md5
  3. 了解你的设备

    • 在操作前,使用 lsblkfdisk -l 命令清楚地了解你的磁盘和分区结构,确保你操作的设备名(如 /dev/sda, /dev/nvme0n1p2)是正确的。
  4. 谨慎使用网络备份

    • 确保网络连接稳定,如果网络中断,dd 命令会失败,但已经写入远程服务器的数据不会被自动删除,可能会产生不完整的文件。

更现代的替代方案

虽然 dd 功能强大,但对于日常备份,它显得有些“粗暴”,现代备份工具通常更灵活、更安全、功能更丰富:

  • rsync: 文件级别的同步工具,非常高效,支持增量备份(只同步变化的部分),是目录和文件备份的首选。
  • partclone / partimage: 专门为分区设计的备份工具,通常比 dd 更快,并且支持压缩和增量备份。
  • Clonezilla: 基于 partclone 的强大磁盘克隆/备份工具,提供了图形界面,非常适合制作系统克隆或完整磁盘备份。
  • tar: 经典的归档工具,配合 gzip/bzip2/xz 等压缩工具,可以非常灵活地备份目录和文件。
  • dd 适用于:需要精确复制底层结构(如MBR、GPT分区表)、制作启动U盘、或者需要简单粗暴地制作完整磁盘镜像的场景。
  • rsync / Clonezilla 等工具适用于:日常的文件系统备份、系统迁移、需要增量备份和压缩的场景。

希望这份详细的指南能帮助你安全、有效地使用 dd 命令进行备份!

分享:
扫描分享到社交APP
上一篇
下一篇