必须先确认设备名、卸载分区、禁用swap;用lsblk和fdisk -l核验裸盘,再执行dd if=/dev/zero of=/dev/sdX bs=4M status=progress conv=fdatasync,最后抽样hexdump验证全零。

直接用 dd if=/dev/zero of=/dev/sdX bs=4M status=progress 就行,但必须先确认设备名、卸载分区、禁用 swap,否则轻则数据错写,重则把系统盘清空。
怎么确认目标硬盘是哪个 /dev/sdX
别凭直觉猜,lsblk 和 sudo fdisk -l 是唯二靠谱的手段:
-
lsblk看设备大小和挂载点——没挂载、容量匹配、类型为disk(不是part)的才可能是目标 -
sudo fdisk -l看详细型号和分区表——确认无boot标志、无EFI System分区,避免误擦启动盘 - 如果看到
/dev/sdb1已挂载在/home,那/dev/sdb就不能动;得找那个完全没├─sdc1这类子节点的裸盘 - SSD 用户额外注意:
cat /sys/block/sdX/queue/discard_granularity非零说明支持 TRIM,但写零对 SSD 并不保证物理单元全覆盖,此时应优先走hdparm --user-master u --security-set-pass p /dev/sdX+hdparm --user-master u --security-erase p /dev/sdX
dd 命令里这几个参数不能省、不能乱设
bs=4M 是吞吐与稳定性的平衡点,太小(如 bs=512)会触发海量系统调用拖慢速度;太大(如 bs=64M)可能因内存不足导致 dd 中断或 OOM kill:
-
status=progress必加——没有它,你只能干等,连卡在哪都不知道 -
conv=fdatasync建议加上——强制每次写入都刷盘,避免缓存未落盘就报“完成”,拔电后实际只写了一半 -
oflag=direct可选但推荐——绕过页缓存,减少内存压力,尤其对 4TB+ 盘更稳 - 别信“
concurrent=4”这种伪参数——dd原生命令根本不支持并发,那是某些定制版或文档笔误
执行前必须做的三件事,漏一个就可能翻车
这不是可选项,是防止误操作的硬性隔离步骤:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 运行
sudo umount -A -t ext4,xfs,btrfs,vfat卸载所有常见文件系统挂载(包括自动挂载的 USB 设备) - 运行
sudo swapoff -a关掉所有 swap 分区——否则dd写到一半可能触发内核 panic - 用
sudo blockdev --rereadpt /dev/sdX强制内核重新读取分区表,确保设备状态最新(尤其在刚删过分区后) - 最后再跑一次
lsblk | grep sdX,确认输出里没有任何mountpoint字段值
擦完不是终点:验证是否真写满了零
写完不代表成功,得抽样验证。用 dd + hexdump 快速检查开头、中间、结尾三处:
- 开头:
sudo dd if=/dev/sdX bs=512 count=1 2>/dev/null | hexdump -C—— 应全为00 - 中间(假设 4TB 盘):
sudo dd if=/dev/sdX bs=512 skip=$((2*1024*1024*1024)) count=1 2>/dev/null | hexdump -C—— 同样全00 - 结尾:
sudo dd if=/dev/sdX bs=512 skip=$(((4*1024*1024*1024*1024-1))) count=1 2>/dev/null | hexdump -C—— 注意单位换算,别少算一个1024 - 如果某处出现非零字节,大概率是写入中途被中断、磁盘坏道跳过,或
dd被信号终止而没报错
真正容易被忽略的是:SSD 的磨损均衡机制会让同一逻辑地址背后映射到不同物理块,/dev/zero 写入无法保证所有 NAND cell 都被触达——所以对敏感 SSD,写零只是兜底动作,不是首选方案。










