dd
底层数据拷贝工具
补充说明
dd命令 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。
建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。
语法
dd(选项)
选项
bs=<字节数>:将ibs(输入)与obs(输出)设成指定的字节数;
cbs=<字节数>:转换时,每次只转换指定的字节数;
conv=<关键字>:指定文件转换的方式;
count=<区块数>:仅读取指定的区块数;
ibs=<字节数>:每次读取的字节数;
obs=<字节数>:每次输出的字节数;
if=<文件>:输入文件;
of=<文件>:输出到文件;
seek=<区块数>:一开始输出时,跳过指定的区块数;
skip=<区块数>:一开始读取时,跳过指定的区块数;
--help:帮助;
--version:显示版本信息。
dd 通用参数说明表
所有命令统一使用最优安全参数:bs=4M + status=progress + conv=fsync
| 参数 | 全称 | 作用说明 |
|---|---|---|
if= |
Input File 输入源 | 数据读取来源:文件/硬盘设备 |
of= |
Output File 输出目标 | 数据写入目的地:硬盘/镜像文件 |
bs=4M |
Block Size 块大小 | 单次读写4MB,大幅提升读写速度,兼顾稳定性 |
status=progress |
进度显示 | 实时打印速度、已写入大小、百分比进度 |
conv=fsync |
强制刷盘 | 任务结束前强制清空内存缓存,数据完全写入物理硬盘才退出,防止文件损坏 |
四大常用操作
场景1:制作 Ubuntu 系统安装启动盘
执行命令
sudo dd if=ubuntu-24.04.iso of=/dev/sdb bs=4M status=progress conv=fsync
关键说明
if=ubuntu-24.04.iso:输入为官方系统ISO镜像of=/dev/sdb:写入整块U盘(不能写分区/dev/sdb1,否则无法引导)
前置要求
- 执行
lsblk确认盘符,避免误写本地系统盘 - 写入完成等待命令结束再拔U盘
场景2:全盘系统硬盘备份(硬盘 → img镜像)
执行命令
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress conv=fsync
硬性规则
- 必须在 Live 离线系统下执行,不能备份正在运行的系统盘
- 备份存储空间 ≥ 原硬盘总容量
- 输出为裸磁盘
.img镜像,仅用于系统还原,不是安装ISO
场景3:系统镜像还原(img镜像 → 整块硬盘)
执行命令
sudo dd if=/backup/sda.img of=/dev/sda bs=4M status=progress conv=fsync
重要提醒
- 离线Live环境执行,目标硬盘所有数据会被全覆盖清除
- 硬盘容量不能小于备份时原硬盘容量
- 结束后建议手动执行
sync兜底刷盘
场景4:dd 安全擦除/清零整块硬盘
方式1:快速清零(日常数据销毁)
# 整块硬盘 /dev/sda 全部写入0,彻底清空所有分区与数据
sudo dd if=/dev/zero of=/dev/sda bs=4M status=progress conv=fsync
方式2:高安全随机覆写(隐私/涉密硬盘)
# 用随机数覆写整块硬盘,防专业数据恢复
sudo dd if=/dev/urandom of=/dev/sda bs=4M status=progress conv=fsync
⚠️ 高危警告
- 盘符绝对不能选错,误擦系统盘会直接清空整机所有数据
- 擦除操作不可逆,大容量机械盘全盘覆写耗时很长
四大场景总览对照表
| 操作场景 | 输入源 if |
输出目标 of |
核心用途 | 数据影响 |
|---|---|---|---|---|
| 制作安装U盘 | ubuntu.iso | /dev/sdb(U盘) | 系统重装、装机 | 清空U盘全部数据 |
| 系统全盘备份 | /dev/sda系统盘 | /xxx/sda.img | 整机系统备份迁移 | 不改动原硬盘数据 |
| 镜像还原系统 | sda备份.img | /dev/sda目标盘 | 灾难恢复、整机迁移 | 全覆盖清空目标硬盘 |
| 硬盘安全擦除 | /dev/zero /随机数 | /dev/sda闲置硬盘 | 报废硬盘、隐私销毁 | 整块硬盘数据彻底清除 |
补充:坏道硬盘容错通用模板
备份 / 还原 / 擦除 遇到坏扇区中断时,添加容错参数:
sudo dd if=xxx of=xxx bs=4M status=progress conv=noerror,sync,fsync
noerror:读取坏块不终止任务sync:坏块位置补0,保持磁盘分区偏移结构不变
常用实例
基础示例
[root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s
[root@localhost text]# du -sh sun.txt
1.1M sun.txt
该命令创建了一个1M大小的文件sun.txt,其中参数解释:
- if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。
- of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
- bs 代表字节为单位的块大小。
- count 代表被复制的块数。
- /dev/zero 是一个字符设备,会不断返回0值字节(\0)。
块大小计量单位表
| 单元大小 | 代码 |
|---|---|
| 字节(1B) | c |
| 字节(2B) | w |
| 块(512B) | b |
| 千字节(1024B) | k |
| 兆字节(1024KB) | M |
| 吉字节(1024MB) | G |
生成随机字符串
使用 /dev/urandom 设备配合 dd 命令获取随机字符串:
[root@localhost ~]# dd if=/dev/urandom bs=1 count=15|base64 -w 0
15+0 records in
15+0 records out
15 bytes (15 B) copied, 0.000111993 s, 134 kB/s
wFRAnlkXeBXmWs1MyGEs
测试磁盘写入速度
[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 7.10845 s, 151 MB/s
测试磁盘读取速度
[root@localhost ~]# dd if=/tmp/testfile of=/dev/null bs=1G count=1 iflag=direct
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 6.53009 s, 164 MB/s