一次“测试”引发的惨案:dd 命令写错目标,系统彻底崩盘!
最近,为一批备份服务器进行漏洞修复工作,并按常规进行了重启。遗憾的是,这次重启却意外地导致了几台备份服务主机无法正常启动,操作系统出现了故障,备份服务也因此中断。
经过紧急排查后,我们发现了一个之前未曾注意到的问题:原来很久以前有人执行了一条dd命令,但当时并没有立即重启服务器。直到这次为了修复安全漏洞而进行的重启操作,才触发了这个问题。这条命令就像一颗隐藏的定时炸弹,最终引发了这次严重的故障。
在系统重启前,一切运行正常,没有任何报警信号。而重新启动之后,系统提示:
先检查了磁盘、BIOS设置和启动配置这些常见的地方,但没发现什么问题。然后在其他还没重启的机器上查看了之前执行过的命令,结果找到了一条危险的命令,如下图所示:
这条命令将 10GB 的全零数据以同步方式直接写入系统磁盘 /dev/sda 的起始位置,彻底覆盖启动扇区和所有原始数据,极具破坏性!
而这位同事的本意,其实是想测试磁盘的读取性能。他原本想执行的命令应该是:
只是将 if=和 of=位置写反了,就把整个启动盘最关键的引导区域给毁了!
dd是什么?dd 是Linux/Unix系统中一个用于按块block进行读写数据的命令,能够在设备之间或文件之间进行底层复制、转换、备份与恢复。它被广泛用于:
制作启动盘系统备份还原磁盘性能测试清空磁盘数据(数据粉碎)然而,dd 因其“直接对块设备操作”的特性,也被称为:
“Data Destroyer(数据毁灭者)”
一不小心,轻则误删文件,重则系统瘫痪!
基本语法:
常配合其他参数使用,如块大小、计数方式、同步策略等。
常用参数说明:
参数名
含义
示例
if=
输入源
if=/dev/sda
of=
输出目标
of=/backup.img
bs=
设置块大小(block size)
bs=1M
代表每次读写1MB
count=
复制的块数
count=1024
表示复制1024个块
skip=
跳过输入文件的前N个块
skip=1
从第2个块开始复制
seek=
跳过输出文件的前N个块
seek=1
写入时从第2个块开始
iflag=
输入标志
dsync
强制同步读取
oflag=
输出标志
direct
, sync, append 等
status=
控制输出信息
status=progress
显示实时进度
总结我这次完全跳进被人挖好的坑,在重启服务器的时候,一定要仔细检查每一步。建议你注意下面几点,这样可以避免重启后系统进不去:
(1) 请检查/etc/fstab文件,确认以下内容是否正确:
磁盘路径磁盘/分区UUID挂载目录的存在性及准确性关键字(如defaults, xfs, ext4)的正确性(2) 请检查您的磁盘或分区状态是否显示为“rw”,这表示一切正常。
(3) 看看日志里有没有提到文件系统损坏的问题,这样可以防止因为文件系统坏了而进不去操作系统。
(4) 审查历史命令,查看是否执行了一些高危的操作