Linux 中 dd 命令详解(全面版)
dd 是 Linux 中一个非常强大且危险的低级数据复制和转换工具,全称 “data duplicator” 或 “disk destroyer”(因误操作可毁盘而得外号)。它以块为单位直接读写设备或文件,绕过文件系统缓存,适合备份、克隆磁盘、擦除数据、制作启动盘等场景。
基本语法
dd [参数] if=输入源 of=输出目标 [其他选项]
- if(input file):输入文件或设备(默认标准输入)。
- of(output file):输出文件或设备(默认标准输出)。
- bs(block size):每次读写的块大小(单位:字节)。
- count:复制的块数量。
- skip:从输入跳过指定块数。
- seek:在输出跳过指定块数。
- conv:转换选项(如 notrunc、sync)。
注意:dd 默认不显示进度,使用时需谨慎,写错 of 参数可能直接毁坏系统磁盘!
常用参数详解
| 参数 | 说明 | 示例值 |
|---|---|---|
| if=FILE | 输入文件或设备 | if=/dev/sda |
| of=FILE | 输出文件或设备 | of=/dev/sdb |
| bs=BYTES | 块大小(同时设置 ibs 和 obs),推荐使用 4K、1M 等 | bs=4M |
| ibs=BYTES | 输入块大小 | ibs=512 |
| obs=BYTES | 输出块大小 | obs=4M |
| count=N | 复制 N 个块 | count=100 |
| skip=N | 从输入开头跳过 N 个块 | skip=1 |
| seek=N | 在输出开头跳过 N 个块(不覆盖前 N 块) | seek=1024 |
| conv=OPTION | 转换选项,多个用逗号分隔 | conv=notrunc,noerror,sync |
| status=LEVEL | 显示进度(Linux 现代版本支持) | status=progress |
conv 常见选项:
- notrunc:不截断输出文件(默认会截断)。
- noerror:出错时继续执行(忽略读错误)。
- sync:每个块不足时用 NULL 填充(配合 noerror 防止数据错位)。
- fdatasync:写完后同步数据到磁盘。
- sparse:尝试创建稀疏文件(节省空间)。
经典使用场景与示例
- 完整克隆硬盘(磁盘到磁盘)
sudo dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
- 将整个 sda 磁盘克隆到 sdb(包括分区表)。
- 极度危险:确认 of 设备正确!
- 备份整个磁盘到镜像文件
sudo dd if=/dev/sda of=/backup/sda-full.img bs=4M status=progress
- 从镜像文件恢复到磁盘
sudo dd if=/backup/sda-full.img of=/dev/sdb bs=4M status=progress
- 制作 Linux USB 启动盘(推荐方式)
sudo dd if=ubuntu-24.04-desktop-amd64.iso of=/dev/sdc bs=4M status=progress && sync
- 注意:of= 是整个设备(如 /dev/sdc),不是分区(如 /dev/sdc1)。
- 完成后执行 sync 确保数据刷盘。
- 备份 MBR(主引导记录,前 446 字节)
sudo dd if=/dev/sda of=mbr.bin bs=446 count=1
- 备份整个分区表 + MBR(前 512 字节)
sudo dd if=/dev/sda of=partition-table.bin bs=512 count=1
- 擦除磁盘(安全删除数据)
- 快速清零(不彻底,但快):
bash sudo dd if=/dev/zero of=/dev/sda bs=4M status=progress - 彻底擦除(用随机数据,防恢复):
bash sudo dd if=/dev/urandom of=/dev/sda bs=4M status=progress
- 只复制指定大小的数据
sudo dd if=/dev/sda of=first-10GB.img bs=1G count=10
- 跳过开头部分复制(例如跳过 MBR)
sudo dd if=/dev/sda of=data-part.img bs=512 skip=1
- 测试磁盘读写速度
- 写速度:
bash dd if=/dev/zero of=testfile bs=1G count=1 oflag=dsync - 读速度(需先清缓存):
bash sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" dd if=testfile of=/dev/null bs=1G
- 写速度:
实用技巧与注意事项
- 显示进度:现代 dd(GNU coreutils 8.24+)支持
status=progress,强烈推荐加。 - 加速技巧:
- 使用较大 bs(如 4M、64M),但不要过大(内存不足会慢)。
- 添加
oflag=direct绕过缓存(写操作更快)。 - 安全建议:
- 先用
lsblk或fdisk -l确认设备名。 - 使用
pv工具显示更美观的进度条:bash sudo apt install pv sudo dd if=/dev/sda | pv | dd of=/dev/sdb bs=4M - 或直接用
pv:bash sudo pv /dev/sda > /dev/sdb - 中断恢复:dd 被 Ctrl+C 中断后,可用
kill -USR1 $(pidof dd)发送信号显示当前进度。 - 常见错误:
- “No space left on device”:输出磁盘空间不足。
- “Input/output error”:硬件故障,加
conv=noerror可继续。
替代工具推荐
- 磁盘克隆:
ddrescue(更智能,擅长坏道磁盘恢复)。 - 启动盘制作:
cp、Rufus(Windows)、Etcher(图形化)。 - 快速复制:
rsync、cp(文件级更快)。
总结:dd 是 Linux 系统管理员的瑞士军刀,但“用得好是神器,用错毁全盘”。新手请先在虚拟机或非重要设备练习,并三思而后 dd!