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、rsynccat /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 的灵活性使其成为系统管理员的利器,但务必确保理解参数含义后再执行操作!