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
进行写入操作可能会减少其寿命。
- 在网络上传输大量数据时,考虑使用压缩以减少传输时间。