Linux 命令:dd

Linux dd 命令:从基础到高级(结构化学习指南)

  • dd 是 Linux 核心命令,核心功能是按块复制数据,支持格式转换、设备读写、镜像制作等场景,因参数灵活且功能强大,是运维/开发必备技能。以下按「基础→进阶→实战」结构化拆解,兼顾入门理解与生产应用。
  • 资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://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)设备名错误导致数据丢失
  • 避坑:用 lsblkfdisk -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 → 续传命令:

    bash 复制代码
    dd 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"

四、核心总结(快速回顾)

  1. 核心场景:文件复制、设备镜像、分区备份、性能测试
  2. 必记参数if/of(输入输出)、bs(块大小)、count(块数)、status(日志)
  3. 安全原则:操作设备时先 umount 分区,确认设备名无误,重要数据先备份
  4. 效率优化 :大文件/设备用 bs=4M+,加 direct 绕过缓存,progress 查看实时进度

通过「基础参数→入门示例→进阶场景→实战技巧」的逻辑,可快速掌握 dd 命令的核心用法,结合实际场景练习(如制作U盘、测试磁盘速度),即可熟练应用于工作中。

相关推荐
---学无止境---10 小时前
i386 架构中断管理函数详解
linux·架构
kkkkkkkkl2410 小时前
Prometheus指标入门详解
linux·服务器
釉色清风10 小时前
在openEuler玩转Python
linux·开发语言·python
infiniteWei12 小时前
【VIM 入门到精通】第1节:揭开Vim的神秘面纱:入门与基础操作
linux·编辑器·vim
卌卄12 小时前
Linux下安装Docker
linux·运维·docker
小猿成长13 小时前
Ubuntu搭建物联网平台(ThingsBoard)教程
linux·运维·ubuntu
Archie_IT13 小时前
openEuler 软件生态深度勘探:从六万软件包到多语言融合
linux·容器·性能测试·openeuler·多语言开发
tokepson14 小时前
香橙派AI Pro个人云平台 - 从零搭建全记录
linux·服务器·技术·记录
fengyehongWorld15 小时前
Linux wget命令
linux