Linux dd 命令:从基础到高级(结构化学习指南)
- dd 是 Linux 核心命令,核心功能是按块复制数据,支持格式转换、设备读写、镜像制作等场景,因参数灵活且功能强大,是运维/开发必备技能。以下按「基础→进阶→实战」结构化拆解,兼顾入门理解与生产应用。
- 资料合集:
https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、核心基础(必掌握)
1. 命令本质
- 作用:从
if(输入文件)读取数据,按指定规则处理后写入of(输出文件) - 核心逻辑:
dd if=输入 of=输出 [参数] - 注意:无备份时慎用!of 指定的文件/设备会被直接覆盖
2. 基础参数(高频必记)
| 参数 | 作用 | 示例值 |
|---|---|---|
if=FILE |
输入源(文件/设备,如 /dev/sda、test.txt) | if=/dev/zero |
of=FILE |
输出目标(文件/设备,如 /dev/sdb、output.img) | of=test.img |
bs=N |
单次读写块大小(默认 512 字节),推荐用 K/M/G 单位 | bs=4M(4兆字节) |
count=N |
读取的块数(总大小 = bs × count) | count=1000 |
skip=N |
跳过输入源的前 N 个块 | skip=10(跳过前10块) |
seek=N |
输出时跳过前 N 个块(仅对文件有效) | seek=5(写入前跳过5块) |
status=LEVEL |
输出日志级别(none=不输出,noxfer=不显示传输统计) | status=none |
3. 入门示例(快速上手)
(1)复制文件(替代 cp,支持大文件/设备)
bash
# 复制 test.txt 到 test_copy.txt,块大小 4M(复制速度更快)
dd if=test.txt of=test_copy.txt bs=4M status=none
(2)创建空文件(替代 touch,支持指定大小)
bash
# 创建 1G 空文件(/dev/zero 提供无限空字符)
dd if=/dev/zero of=1G_file.img bs=1G count=1 status=none
(3)测试磁盘读写速度(常用性能测试)
bash
# 测试写入速度(生成临时文件后删除)
dd if=/dev/zero of=temp.img bs=100M count=10 oflag=direct && rm -f temp.img
# 测试读取速度(从空设备 /dev/null 读取,仅测磁盘读取)
dd if=/dev/sda1 of=/dev/null bs=100M count=10 iflag=direct status=none
二、进阶用法(工作场景高频)
1. 设备操作(U盘/硬盘/镜像)
(1)制作系统镜像(如 Ubuntu 安装U盘)
bash
# 将 ubuntu.iso 写入 /dev/sdb(U盘设备,需先 umount 分区)
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress && sync
# sync:确保数据写入设备(避免拔U盘时数据丢失)
(2)备份/恢复分区(灾难恢复必备)
bash
# 备份 /dev/sda1 分区到镜像文件
sudo dd if=/dev/sda1 of=sda1_backup.img bs=4M status=progress
# 从镜像恢复分区(注意:会覆盖目标分区所有数据!)
sudo dd if=sda1_backup.img of=/dev/sda1 bs=4M status=progress
2. 数据转换(格式/编码处理)
(1)转换文件编码(如 ASCII→UTF-8,需结合 iconv)
bash
# 将 GBK 编码文件转为 UTF-8(conv=ucs2 指定编码格式)
dd if=gbk_file.txt of=utf8_file.txt conv=ucs2 && iconv -f UCS-2 -t UTF-8 utf8_file.txt -o utf8_file.txt
(2)去除文件空白字符(清理无效数据)
bash
# 去除文件中的空行和制表符(conv=stripall)
dd if=raw.txt of=clean.txt conv=stripall status=none
3. 高级参数(优化性能/特殊场景)
(1)oflag/iflag 优化(提升读写效率)
bash
# 直接读写设备(绕过系统缓存,适合磁盘测试/镜像写入)
dd if=input.img of=/dev/sdb bs=4M oflag=direct iflag=direct
- 常用 flag:
direct(直接IO)、sync(同步IO)、nonblock(非阻塞IO)
(2)稀疏文件(节省磁盘空间)
bash
# 创建 100G 稀疏文件(实际占用空间为0,写入数据后才占用)
dd if=/dev/null of=sparse_file.img bs=1G seek=100 status=none
# 查看实际占用空间(du -sh 显示真实大小,ls -lh 显示逻辑大小)
du -sh sparse_file.img # 输出:0B
三、实战技巧(避坑+效率提升)
1. 常见坑与解决方案
(1)设备名错误导致数据丢失
- 避坑:用
lsblk或fdisk -l确认设备名(如 /dev/sdb 是U盘,/dev/sda 是硬盘) - 示例:
lsblk输出中,U盘通常标注为sdX(如 sdb),分区为sdX1
(2)复制速度慢
- 优化:增大
bs(如 4M/8M,默认 512 字节太慢),加status=progress查看进度 - 示例:
dd if=large.img of=/dev/sdc bs=8M status=progress
(3)中途中断后续传
-
方法:用
skip(跳过已复制的块)+ 已复制大小计算 -
示例:已复制 2G,bs=4M → 已复制块数=2G/4M=512 → 续传命令:
bashdd if=large.img of=/dev/sdc bs=4M skip=512 status=progress
2. 实用组合命令
(1)压缩备份分区(节省空间)
bash
# 备份分区并通过 gzip 压缩(比单独备份小 50%+)
sudo dd if=/dev/sda1 bs=4M | gzip -c > sda1_backup.img.gz
# 解压恢复
gunzip -c sda1_backup.img.gz | sudo dd of=/dev/sda1 bs=4M status=progress
(2)远程复制设备/文件(跨服务器)
bash
# 从服务器 A 复制 /dev/sda1 到服务器 B 的 /dev/sdb1(通过 ssh 传输)
sudo dd if=/dev/sda1 bs=4M | ssh user@serverB "sudo dd of=/dev/sdb1 bs=4M status=progress"
四、核心总结(快速回顾)
- 核心场景:文件复制、设备镜像、分区备份、性能测试
- 必记参数 :
if/of(输入输出)、bs(块大小)、count(块数)、status(日志) - 安全原则:操作设备时先 umount 分区,确认设备名无误,重要数据先备份
- 效率优化 :大文件/设备用
bs=4M+,加direct绕过缓存,progress查看实时进度
通过「基础参数→入门示例→进阶场景→实战技巧」的逻辑,可快速掌握 dd 命令的核心用法,结合实际场景练习(如制作U盘、测试磁盘速度),即可熟练应用于工作中。