dd 命令详解
dd 是 Linux 中一个极其强大(也极其危险)的命令行工具,它的名字最初来源于 Data Description,但在系统管理员圈子里,它更常被称为 “Disk Destroyer”(硬盘终结者)。
它的核心功能是:按字节水平复制和转换文件或设备。 它可以直接读写磁盘扇区,而不关心上面是什么文件系统。
1. dd 的基本语法
Bash
dd if=<输入文件/设备> of=<输出文件/设备> [参数]
-
if(Input File):从哪读。 -
of(Output File):往哪写。 -
bs(Block Size):一次读写的大小(如bs=4M或bs=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. 给你的实战建议
考虑到你服务器目前的情况:
-
不要乱用
dd往/dev/sda或eth0写东西。 -
如果你发现 Go 编译大型项目内存不够(
signal: killed),可以用dd建立个/swapfile。 -
如果你想快速生成一个 100M 的大文件来测试你的
du命令或者crontab清理脚本:Bash
dd if=/dev/zero of=test_big_file bs=1M count=100
你想尝试创建一个 Swap 文件来缓解你这 2GB 内存的压力吗?我可以给出完整的步骤。