dd
是 Linux/Unix 系统中的一个强大的命令行工具,用于低级的数据转换和复制。它以“块”为单位读取输入文件(或设备),进行指定的处理后写入输出文件(或设备)。因其直接操作数据的特性,dd
常用于磁盘克隆、数据备份、设备测试等场景,但需谨慎使用以避免数据丢失。
磁盘/分区克隆
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
if=/dev/sda
:输入文件(源磁盘)。of=/dev/sdb
:输出文件(目标磁盘)。bs=4M
:设置块大小为 4MB(提高大文件操作效率)。status=progress
:显示实时进度(仅限较新版本)。创建磁盘镜像
dd if=/dev/sdc of=backup.img bs=1M
/dev/sdc
的内容备份到 backup.img
文件。恢复镜像到磁盘
dd if=backup.img of=/dev/sdc bs=1M
测试磁盘读写速度
dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
oflag=direct
绕过缓存)。销毁数据(安全擦除)
dd if=/dev/urandom of=/dev/sdX bs=1M
修改文件/数据的特定部分
echo "HELLO" | dd of=file.txt bs=1 seek=10 conv=notrunc
file.txt
的第 10 字节处插入 "HELLO"(conv=notrunc
保留文件原有长度)。参数 | 作用 |
---|---|
if=FILE |
输入文件(默认为标准输入)。 |
of=FILE |
输出文件(默认为标准输出)。 |
bs=BYTES |
设置读写块的大小(如 1K , 4M , 1G )。 |
count=N |
仅复制 N 个块。 |
skip=N |
跳过输入文件的前 N 个块。 |
seek=N |
跳过输出文件的前 N 个块。 |
conv=FLAGS |
转换规则(如 notrunc 不截断输出文件,sync 用零填充失败块)。 |
oflag=FLAGS |
输出模式(如 direct 直接 I/O,sync 同步写入)。 |
数据危险性
dd
直接操作原始设备,错误的参数(如混淆 if
和 of
)可能导致数据不可逆丢失。lsblk
或 fdisk -l
确认设备名称。进度监控
dd
无进度显示,可通过以下方法查看:bash
kill -USR1 $(pgrep ^dd) # 发送信号强制显示进度
pv
:bash
dd if=/dev/sda | pv | dd of=/dev/sdb bs=4M
性能优化
bs
(如 bs=4M
)可提升大文件操作效率,但需权衡内存占用。替代工具
cp
、rsync
cat /dev/sda > /dev/sdb
(效果类似,但灵活性低)shred
、wipe
制作可启动 USB
dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress && sync
/dev/sdX
需替换为实际设备)。内存盘测试
dd if=/dev/zero of=/dev/shm/test bs=1G count=1
/dev/shm
为内存挂载点)。dd
的灵活性使其成为系统管理员的利器,但务必确保理解参数含义后再执行操作!