dd 命令详解

dd 是 Linux 中一个极其强大(也极其危险)的命令行工具,它的名字最初来源于 Data Description,但在系统管理员圈子里,它更常被称为 “Disk Destroyer”(硬盘终结者)

它的核心功能是:按字节水平复制和转换文件或设备。 它可以直接读写磁盘扇区,而不关心上面是什么文件系统。


1. dd 的基本语法

Bash

dd if=<输入文件/设备> of=<输出文件/设备> [参数]
  • if (Input File):从哪读。

  • of (Output File):往哪写。

  • bs (Block Size):一次读写的大小(如 bs=4Mbs=1M)。

  • count:复制多少个块。

  • status=progress:显示进度条(非常建议加上,否则像死机一样)。


2. 常见使用场景

A. 制作 Swap 交换文件(这对你最实用!)

既然你只有 2GB 内存且空间紧张,你可以用 dd 创建一个交换文件来防止 Go 编译时内存溢出:

Bash

# 创建一个 2GB 的空文件
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
  • if=/dev/zero:一个源源不断产生“零”的特殊设备。

  • 这会生成一个全为 0 的 2GB 文件。

B. 备份和恢复整个硬盘(镜像制作)

Bash

# 把整个 sda 硬盘备份成一个文件
dd if=/dev/sda of=/root/sda_disk.img status=progress

# 把备份的镜像还原回硬盘
dd if=/root/sda_disk.img of=/dev/sda status=progress

C. 测试硬盘的读写速度

这是程序员最常用的跑分方法:

Bash

# 测试写速度
dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
  • oflag=direct:绕开系统缓存,直接测硬盘真实物理速度。

D. 彻底粉碎数据(不可恢复)

如果你要把服务器退款或卖掉,想彻底删掉数据:

Bash

# 用随机数据覆盖整个硬盘
dd if=/dev/urandom of=/dev/sda status=progress

3. ⚠️ 致命警告:为什么叫它“硬盘终结者”?

dd不带确认提示的。

如果你不小心执行了:

dd if=/dev/zero of=/dev/sda

它会瞬间抹除你的整个硬盘分区表和数据,且无法撤销。执行前请务必确认 of 后面那个设备路径是正确的!


4. dd vs cp

  • cp:在文件系统层工作。它知道什么是文件夹、什么是权限。

  • dd:在块设备层工作。它不认识文件夹,它只认识“第 1 个字节到第 1000 个字节”。它可以用来克隆正在运行的分区,甚至是损坏的文件系统。


5. 给你的实战建议

考虑到你服务器目前的情况:

  1. 不要乱用 dd/dev/sdaeth0 写东西

  2. 如果你发现 Go 编译大型项目内存不够(signal: killed),可以用 dd 建立个 /swapfile

  3. 如果你想快速生成一个 100M 的大文件来测试你的 du 命令或者 crontab 清理脚本:

    Bash

    dd if=/dev/zero of=test_big_file bs=1M count=100
    

你想尝试创建一个 Swap 文件来缓解你这 2GB 内存的压力吗?我可以给出完整的步骤。