linux的dd命令详解
Linux dd 命令超详细详解
dd=Data Duplicator(数据复制),底层块级拷贝工具,直接读写磁盘 / 分区 / 文件,无文件系统依赖,常用于:整盘备份、写启动盘、测磁盘速度、修复坏盘、内存 dump。
⚠️高危命令:写错
of=/dev/sda极易清空整块硬盘,务必核对盘符!
一、基础语法
bash
运行
dd [if=输入源] [of=输出目标] [bs=块大小] [count=块数量] [其他参数]核心必记参数
表格
| 参数 | 含义 |
|---|---|
if=FILE | input file,输入源:文件 / 分区/dev/sda1/ 光驱/dev/sr0/ 标准输入/dev/stdin |
of=FILE | output file,输出:文件 / 裸磁盘/dev/sdb/ 标准输出/dev/stdout |
bs=SIZE | 单次读写块大小(默认 512 字节),常用1K/4K/1M/1G,越大速度越快 |
count=N | 只拷贝 N 个 bs 大小的数据,不加则全量复制 |
skip=N | 输入源跳过前 N 个块(bs 大小)再读 |
seek=N | 输出文件跳过前 N 个块再写入 |
辅助常用参数
status=progress:实时打印读写进度、速度(centos7+/ubuntu16 + 支持,最实用)conv=xxx转换参数(逗号分隔多参数)conv=sync:不足 bs 的块补 0 补齐conv=noerror:读出错跳过坏块继续(坏盘备份必备)conv=notrunc:不截断原有输出文件(避免覆盖清空旧数据)conv=sparse:空洞文件优化,不写全 0 块节省空间
ibs=SIZE/obs=SIZE:单独设置输入块、输出块(bs 同时设置 ibs+obs)
二、高频实战示例(最常用场景)
1. 文件复制(替代 cp,但块级复制)
bash
运行
# bs=4M提升速度,显示实时进度 dd if=test.iso of=/mnt/test.iso bs=4M status=progress2. 整盘备份(全盘镜像,系统备份神器)
bash
运行
# 把整块sda硬盘打包成镜像(sda=整盘,sda1=单个分区) dd if=/dev/sda of=/root/disk_sda.img bs=4M status=progress # 备份单个分区sda2 dd if=/dev/sda2 of=sda2_back.img bs=4M status=progress3. 镜像还原到硬盘(写 U 盘启动盘)
bash
运行
# 将iso写入U盘(U盘为/dev/sdb,千万别写成sda!) dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=sync查看磁盘:
lsblk/fdisk -l确认 U 盘盘符
4. 从镜像恢复分区 / 硬盘
bash
运行
dd if=disk_sda.img of=/dev/sda bs=4M status=progress5. 生成指定大小空文件(测试用虚拟磁盘)
bash
运行
# 创建1G空文件,bs=1M count=1024 → 1M*1024=1G dd if=/dev/zero of=test.img bs=1M count=1024 status=progress # /dev/zero:无限输出0字节的伪设备/dev/urandom:随机数据,生成加密测试文件
bash
运行
dd if=/dev/urandom of=rand.img bs=1M count=1006. 磁盘读写测速
bash
运行
# 写测速:向磁盘写1G零数据 dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct status=progress # oflag=direct:绕过系统缓存,测真实裸盘速度 # 读测速 dd if=/tmp/test of=/dev/null bs=1M count=1024 iflag=direct status=progress # /dev/null:黑洞设备,写入数据直接丢弃7. 坏盘数据抢救(noerror 跳过坏扇区)
bash
运行
# 读取出错自动跳过坏块,sync补齐块 dd if=/dev/sdb of=backup.img bs=512 conv=noerror,sync status=progress8. 磁盘前 512 字节 MBR 引导扇区备份
MBR 分区表存于硬盘前 512 字节
bash
运行
# 只拷贝count=1个块,bs=512,备份sda主引导 dd if=/dev/sda of=mbr_back.img bs=512 count=1 # 恢复引导 dd if=mbr_back.img of=/dev/sda bs=512 count=1三、特殊伪设备详解(dd 标配源)
/dev/zero:源源不断全 0 数据 → 造空文件、擦盘/dev/null:数据黑洞,写入立刻消失 → 测速丢弃输出/dev/urandom//dev/random:随机二进制数据 → 磁盘填充、加密测试/dev/stdin标准输入、/dev/stdout标准输出
全盘擦除(安全销毁数据,慎用!)
bash
运行
# 全盘填充随机数,彻底抹除数据(sdb整盘清空) dd if=/dev/urandom of=/dev/sdb bs=4M status=progress # 快速填0擦除 dd if=/dev/zero of=/dev/sdb bs=4M status=progress四、dd 进度查看(中途忘记加 status=progress)
dd 运行时另开终端:
bash
运行
# 查找dd进程PID pidof dd # 发送USR1信号,让dd立刻打印一次进度 kill -USR1 PID五、dd 优缺点
优点
- 无视文件系统:损坏分区、RAW 裸盘都能读写,cp 做不到
- 块级精准复制:扇区一一对应,整盘克隆 1:1
- 系统内置命令,所有 Linux 默认自带
缺点
- 默认 bs=512 字节速度极慢,务必手动加大 bs
- 无文件压缩,镜像体积 = 原盘大小(可配合 gzip 压缩)
bash
运行
# 备份+压缩整盘,节省空间 dd if=/dev/sda bs=4M | gzip > sda.img.gz # 解压还原 gzip -dc sda.img.gz | dd of=/dev/sda bs=4M status=progress六、避坑重点
- of = 目标盘符绝对不能写错,sda 是系统盘写错直接删系统;优先
lsblk确认设备 - U 盘挂载时不要直接 dd,最好
umount /dev/sdb*卸载分区再写入 - bs 推荐
1M/4M/16M,过小速度巨慢,过大内存占用高