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:尝试创建稀疏文件(节省空间)。
经典使用场景与示例
完整克隆硬盘(磁盘到磁盘)
sudoddif=/dev/sdaof=/dev/sdbbs=64Kconv=noerror,syncstatus=progress- 将整个 sda 磁盘克隆到 sdb(包括分区表)。
- 极度危险:确认 of 设备正确!
备份整个磁盘到镜像文件
sudoddif=/dev/sdaof=/backup/sda-full.imgbs=4Mstatus=progress从镜像文件恢复到磁盘
sudoddif=/backup/sda-full.imgof=/dev/sdbbs=4Mstatus=progress制作 Linux USB 启动盘(推荐方式)
sudoddif=ubuntu-24.04-desktop-amd64.isoof=/dev/sdcbs=4Mstatus=progress&&sync- 注意:of= 是整个设备(如 /dev/sdc),不是分区(如 /dev/sdc1)。
- 完成后执行 sync 确保数据刷盘。
备份 MBR(主引导记录,前 446 字节)
sudoddif=/dev/sdaof=mbr.binbs=446count=1备份整个分区表 + MBR(前 512 字节)
sudoddif=/dev/sdaof=partition-table.binbs=512count=1擦除磁盘(安全删除数据)
- 快速清零(不彻底,但快):
sudoddif=/dev/zeroof=/dev/sdabs=4Mstatus=progress - 彻底擦除(用随机数据,防恢复):
sudoddif=/dev/urandomof=/dev/sdabs=4Mstatus=progress
- 快速清零(不彻底,但快):
只复制指定大小的数据
sudoddif=/dev/sdaof=first-10GB.imgbs=1Gcount=10跳过开头部分复制(例如跳过 MBR)
sudoddif=/dev/sdaof=data-part.imgbs=512skip=1测试磁盘读写速度
- 写速度:
ddif=/dev/zeroof=testfilebs=1Gcount=1oflag=dsync - 读速度(需先清缓存):
sudosh-c"echo 3 > /proc/sys/vm/drop_caches"ddif=testfileof=/dev/nullbs=1G
- 写速度:
实用技巧与注意事项
- 显示进度:现代 dd(GNU coreutils 8.24+)支持
status=progress,强烈推荐加。 - 加速技巧:
- 使用较大 bs(如 4M、64M),但不要过大(内存不足会慢)。
- 添加
oflag=direct绕过缓存(写操作更快)。
- 安全建议:
- 先用
lsblk或fdisk -l确认设备名。 - 使用
pv工具显示更美观的进度条:sudoaptinstallpvsudoddif=/dev/sda|pv|ddof=/dev/sdbbs=4M - 或直接用
pv:sudopv/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!