Linux 如何使用dd命令来复制和转换数据?

简介

Linux 中的 dd 命令是一个功能强大的数据复制和转换实用程序。它以较低级别运行,通常用于创建可启动的 USB 驱动器、克隆磁盘和生成随机数据等任务。

dd 全称可以为:data duplicatordisk destroyerData Definition

功能和能力

  • 磁盘映像:创建整个磁盘或分区的精确、逐位副本

  • 数据擦除:使用零或随机数据安全地覆盖驱动器

  • 文件转换:ASCII 和 EBCDIC 之间的转换、字节顺序交换和文件填充

  • 数据恢复:通过忽略读取错误从故障驱动器读取数据

  • 可启动媒体创建:将磁盘映像写入 USB 驱动器或 SD 卡

  • 存储性能测试:对驱动器写入速度进行粗略的基准测试

语法

shell 复制代码
dd if=<input_file> of=<output_file> [options]
  • if:输入文件(源文件或设备,例如 /dev/sda/dev/zero

  • of:输出文件(目标文件或设备,例如,/dev/sdbmyfile.img

  • Options:自定义的行为选项

常用选项

  • bs=[BYTES]:将输入和输出块大小都设置为 BYTES

块大小表示 dd 命令每次输入或输出一次性读取或写入的数据大小

  • count=[N]:仅复制 N 个输入块

  • skip=[N]:开始复制之前跳过输入文件中的 N 个块

  • seek=[N]:开始写入之前跳过输出文件中的 N 个块

  • conv=[TYPE]:指定转换类型(例如,sync、noerror、notrunc

  • status=[LEVEL]:控制输出详细程度(例如,none、 noxfer、 progress

  • iflag=[FLAGS]:输入特定标志(direct、sync

  • oflag=[FLAGS]:输出特定标志(append、sync

  • ibs:设置输入块大小

  • obs:设置输出块大小

  • noerror:读取错误后继续

  • notrunc:不要截断输出文件

  • sync:使用 NULL 填充每个输入块至 ibs 大小

示例用法

基础用法
shell 复制代码
dd if=source.txt of=destination.txt

# 如果目标文件不存在,则自动创建,否则会覆盖目标文件
创建可启动的 USB 驱动器

ISO 文件写入 USB 驱动器

shell 复制代码
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress
  • if=ubuntu.iso:输入的 ISO 文件

  • of=/dev/sdb:输出的 USB 设备

  • bs=4M:使用 4 MB 的块大小来加快复制速度

  • status=progress:操作过程中显示进度

备份磁盘

创建磁盘镜像

shell 复制代码
sudo dd if=/dev/sda of=backup.img bs=64K conv=sync,noerror
  • if=/dev/sda:输入的原磁盘设备

  • of=backup.img:输出的磁盘镜像

  • bs=64K:块大小为 64 KB

  • conv=sync,noerror:当发生错误时继续读取,并用控制填充

从镜像中恢复磁盘
shell 复制代码
sudo dd if=backup.img of=/dev/sda bs=64K
创建包含随机数据的文件
shell 复制代码
dd if=/dev/urandom of=random_data.bin bs=1M count=10
  • if=/dev/urandom:随机输入源

  • of=random_data.bin:输出的文件

  • bs=1M:区块大小为 1 MB

  • count=10:创建一个 10 MB 的文件

安全擦除磁盘

使用随机数据覆盖磁盘

shell 复制代码
sudo dd if=/dev/urandom of=/dev/sda bs=1M status=progress
测试磁盘写入速度

将零写入磁盘以测试写入速度

shell 复制代码
sudo dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
将文件拆分成块

将文件分割成更小的块

shell 复制代码
dd if=largefile of=smallfile bs=1M count=100
防止覆盖目标文件
shell 复制代码
dd if=source.txt of=destination.txt conv=notrunc
将数据追加到文件
shell 复制代码
dd if=users.txt of=newusers.txt conv=append
压缩 dd 读取的数据
shell 复制代码
sudo dd if=/dev/sda bs=1M | gzip -c -9 > sda.dd.gz
操作过程中显示进度条
shell 复制代码
dd if=source_file of=destination_file status=progress
将文件的数据格式从 EBCDIC 转换为 ASCII
shell 复制代码
sudo dd if=textfile.ebcdic of=textfile.ascii conv=ascii
将文件的数据格式从 ASCII 转换为 EBCDIC
shell 复制代码
sudo dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic

关键转换标志

  • sync:用空字节填充每个块以达到指定的大小

  • noerror:尽管读取有错误,仍继续操作

  • notrunc:不要截断输出文件

  • ucase:将文本转换为大写

  • lcase:将文本转换为小写

相关推荐
Web3探索者11 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo13 小时前
Linux系统中网线与USB网络共享冲突
linux
荣--16 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森16 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
Sokach10152 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
AlfredZhao2 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3104 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏