dd命令

dd 命令 #

dd 命令是一个强大的低级复制工具,用于按块复制和转换数据。它可以用于备份和恢复磁盘或分区、创建固定大小的文件、测试磁盘性能等。由于其直接操作块设备的能力,dd 命令在磁盘管理中非常有用,但也需要谨慎使用。

语法 #

dd [选项]

主要选项 #

选项 说明
if=文件 指定输入文件(默认为标准输入)
of=文件 指定输出文件(默认为标准输出)
bs=字节数 指定一次读写的块大小(默认为 512 字节)
count=块数 指定要复制的块数
skip=块数 从输入文件开头跳过指定的块数
seek=块数 从输出文件开头跳过指定的块数
conv=转换列表 指定数据转换选项,多个选项用逗号分隔
status=级别 控制信息显示级别(none, noxfer, progress)
iflag=标志列表 指定读取标志
oflag=标志列表 指定写入标志

常用的转换选项 #

转换选项 说明
noerror 出错时继续
sync 使用同步 I/O
notrunc 不截断输出文件
sparse 尝试寻找并保留输出文件中的空洞
fsync 完成前将输出文件数据物理写入磁盘

常见用法 #

1. 创建磁盘或分区的备份 #

sudo dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress

2. 从备份恢复磁盘或分区 #

sudo dd if=/path/to/backup.img of=/dev/sda bs=4M status=progress

3. 创建固定大小的文件 #

# 创建一个 1GB 的文件
dd if=/dev/zero of=file.img bs=1M count=1024 status=progress

4. 创建随机数据文件 #

dd if=/dev/urandom of=random.dat bs=1M count=100 status=progress

5. 擦除磁盘数据(用零覆盖) #

sudo dd if=/dev/zero of=/dev/sda bs=4M status=progress

6. 安全擦除磁盘数据(用随机数据覆盖) #

sudo dd if=/dev/urandom of=/dev/sda bs=4M status=progress

7. 创建 ISO 镜像文件 #

dd if=/dev/cdrom of=image.iso bs=4M status=progress

8. 将 ISO 镜像写入 USB 驱动器 #

sudo dd if=image.iso of=/dev/sdb bs=4M status=progress oflag=sync

9. 测试磁盘读取速度 #

dd if=/dev/sda of=/dev/null bs=1M count=1000 status=progress

10. 测试磁盘写入速度 #

dd if=/dev/zero of=/tmp/test_file bs=1M count=1000 status=progress oflag=direct

11. 备份 MBR(主引导记录) #

sudo dd if=/dev/sda of=mbr_backup.bin bs=512 count=1

12. 恢复 MBR #

sudo dd if=mbr_backup.bin of=/dev/sda bs=512 count=1

13. 跳过坏块进行复制 #

dd if=/dev/sda of=/path/to/image.img bs=4M conv=noerror,sync status=progress

14. 复制部分磁盘 #

# 从第 1000 个块开始,复制 2000 个块
dd if=/dev/sda of=partial.img bs=1M skip=1000 count=2000 status=progress

15. 显示进度信息 #

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

高级用法 #

1. 使用 gzip 压缩备份 #

dd if=/dev/sda bs=4M status=progress | gzip > backup.img.gz

2. 通过 SSH 远程备份 #

dd if=/dev/sda bs=4M status=progress | ssh user@remote "dd of=/path/to/backup.img"

3. 使用 pv 显示详细进度 #

dd if=/dev/sda bs=4M | pv | dd of=/path/to/backup.img bs=4M

4. 使用 conv=fsync 确保数据写入磁盘 #

dd if=/dev/sda of=/path/to/backup.img bs=4M status=progress conv=fsync

注意事项 #

  • dd 命令非常强大,但也很危险。错误的使用可能导致数据丢失。
  • 在操作磁盘设备前,确保指定了正确的输入和输出设备。
  • 使用 dd 写入磁盘或分区会覆盖目标上的所有数据,不会提示确认。
  • 对于大型磁盘操作,使用较大的块大小(如 4M 或 8M)可以提高性能。
  • 使用 status=progress 选项可以显示操作进度,这在处理大文件时特别有用。
  • 在备份或恢复系统分区时,最好从 Live CD/USB 启动系统,以避免文件系统被修改。
  • 使用 conv=noerror,sync 选项可以在遇到读取错误时继续操作,这对于尝试恢复损坏的磁盘很有用。
  • 对于 SSD,过度使用 dd 进行写入操作可能会减少其寿命。
  • 在网络上传输大量数据时,考虑使用压缩以减少传输时间。