Linux dd 命令使用与风险
1. dd 是什么
dd 是 Linux 和其他类 Unix 系统中的底层数据复制工具。它的特点是按块读写数据,不关心文件系统语义,因此输入源和输出目标可以是普通文件、硬盘、分区,也可以是 /dev/zero、/dev/random 这类特殊设备文件。
基本格式如下:
1 | dd if=<输入源> of=<输出目标> [选项] |
if:Input File,输入源,从哪里读取数据。of:Output File,输出目标,把数据写到哪里。bs:Block Size,每次读写的数据块大小。count:复制多少个块。status=progress:显示复制进度。
2. 常见场景
2.1 克隆整块硬盘
1 | sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress |
这个命令会把 /dev/sda 从第一个字节到最后一个字节完整复制到 /dev/sdb,包括 MBR、分区表、分区内容和空闲区域。
注意:这会完全覆盖 /dev/sdb 上的所有数据。
2.2 写入 ISO 镜像到 U 盘
1 | sudo dd if=/path/to/ubuntu-24.04.iso of=/dev/sdc bs=4M status=progress |
这里的 of 应该写 U 盘对应的整块设备,例如 /dev/sdc,而不是某个已挂载分区 /dev/sdc1。
执行前建议用下面命令确认设备名:
1 | lsblk |
2.3 用全零覆盖磁盘
1 | sudo dd if=/dev/zero of=/dev/sdx bs=4M status=progress |
这会把零持续写入目标磁盘,常用于清空数据或覆盖旧内容。普通场景下已经足够,但如果是严格的数据销毁要求,还需要结合设备类型、SSD 磨损均衡和合规要求单独处理。
2.4 创建指定大小的文件
1 | dd if=/dev/zero of=large_file.dat bs=1G count=1 |
这个命令会创建一个 1GB 的文件,常用于测试磁盘空间、传输速度或模拟大文件。
3. 为什么不用 cp
cp 和 dd 工作在不同层面。
cp 是文件层面的工具,它理解文件和目录,需要文件系统参与。你可以用它把一个目录里的文件复制到另一个目录。
dd 是块设备层面的工具,它直接复制原始字节,不理解也不关心这些字节里是不是文件系统。
例如克隆整块硬盘:
1 | sudo dd if=/dev/sda of=/dev/sdb |
dd 会复制引导记录、分区表、所有分区和分区里的数据,/dev/sdb 会成为 /dev/sda 的完整克隆。
cp 做不到这件事。它无法直接复制 MBR 或分区表。即使用 cp -a 复制挂载后的文件,也只是文件级复制,引导信息和磁盘结构不会被完整保留。
4. 风险
dd 最大的问题是它不会问你“确定吗”。命令执行后会直接写入目标,没有回收站,也没有撤销。
最危险的是写反 if 和 of:
1 | sudo dd if=/dev/sdb of=/dev/sda |
如果你本来想把系统盘 /dev/sda 备份到移动硬盘 /dev/sdb,却写反了,系统盘就会被移动硬盘的数据覆盖,可能导致系统立刻损坏、数据丢失。
执行前至少确认三件事:
- 用
lsblk确认源盘和目标盘。 - 确认
if是读取来源,of是被覆盖目标。 - 对真实磁盘执行前,先把命令复制出来逐项检查,不要凭记忆手敲设备名。