当前位置:首页>Linux>Linux 命令篇:badblocks 检测与修复磁盘坏块的"神器"

Linux 命令篇:badblocks 检测与修复磁盘坏块的"神器"

  • 2026-09-11 02:22:42
Linux 命令篇:badblocks 检测与修复磁盘坏块的"神器"
大家好!我是大虫子🐛!
这篇文章给大家介绍一个可以检测磁盘坏道的命令:badblocks。它能精准识别无法稳定读写的磁盘扇区,避免数据损坏或系统异常。有兴趣的小伙伴可以往下看看~
🎯什么是 badblocks?
badblocks 是 Linux 系统自带的工具,用于检测 磁盘或分区中的坏块(Bad Block)。
  1. 坏块指磁盘上的物理损坏区域或不可读写的扇区。
  2. 坏块如果不处理,可能导致文件损坏或系统崩溃。
  3. badblocks 可以:
  • 只读检测:不会破坏数据
  • 读写检测:写入测试数据,可能会破坏原数据
🎯基础认知:什么是坏块?为什么要用 badblocks?
1. 坏块(Bad Blocks)定义
磁盘的物理扇区因磁性衰减、物理损伤、出厂缺陷等原因,无法稳定读写数据,即为坏块。分为两类:
  • 物理坏块:磁盘硬件永久损坏,无法修复,只能屏蔽;
  • 逻辑坏块:数据写入异常、文件系统错误导致,可通过重写 / 格式化修复。
2. badblocks 的核心价值
  • 独立检测:不依赖文件系统,直接扫描磁盘裸设备,适配所有文件系统(ext4/xfs/ntfs 等);
  • 多模式检测:兼顾数据安全与检测精度,适配不同场景;
  • 可对接文件系统:输出坏块列表,供 e2fsck/mkfs 标记,避免系统再次使用坏块;
  • 精准定位:输出坏块的逻辑块地址(LBA),明确故障位置。
3. 重要前提
  • 必须卸载设备:检测前务必卸载磁盘分区(umount /dev/sdX),禁止对挂载中的分区执行写测试,否则会破坏数据、导致系统崩溃;
  • 权限要求:需 root 权限(sudo)执行;
  • 耗时提示:大容量磁盘(如 4T+)检测可能耗时数小时,建议空闲时执行。
🎯基本语法与核心参数
1. 标准语法
badblocks [选项] 设备路径 [结束块号] [起始块号]
  • 设备路径:目标磁盘 / 分区(如 /dev/sda、/dev/sdb1);
  • 结束块号 / 起始块号:可选,指定检测范围(默认全磁盘)。
2. 常用参数详解
  • -v,verbose:显示详细检测过程(块号、错误类型)
  • -s,progress:显示扫描进度条(百分比)
  • -b,block-size:指定磁盘块大小(字节),默认 1024
  • -c,blocks-at-once:一次检测的块数量,默认 64
  • -o,output:将坏块列表写入指定文件
  • -i,input:读取已知坏块列表,跳过检测
  • -p,passes:重复扫描次数,默认 0(1 次)
  • -t,test-pattern:自定义测试数据模式(如 0xaa、0x55)
  • -f,force:强制检测挂载设备
3. 三大核心检测模式(关键区分)
(1) 只读模式(默认,非破坏性)
命令:
sudo badblocks -v /dev/sdb1
  • 原理:仅读取每个块,不写入、不修改数据,检测是否可读;
  • 适用场景:已存重要数据、快速初筛坏块;
  • 缺点:检测精度低,无法发现“能读但不能写” 的隐性坏块。
(2) 非破坏性读写模式(-n,推荐安全模式)
命令:
sudo badblocks -nsv /dev/sdb1
  • 原理:
a.读取块原始数据并暂存内存;b.写入测试模式(0xaa/0x55 等)并验证;c.恢复原始数据,全程不破坏原有数据;
  • 适用场景:需深度检测、但必须保留数据的生产环境;
  • 优点:安全 + 高精度,日常检测首选。
(3) 破坏性读写模式(-w,高危模式)
命令:
sudo badblocks -wsv /dev/sdb1
  • 原理:直接写入测试模式、覆盖所有数据,验证读写一致性;
  • 适用场景:空白新磁盘、报废前检测、数据可丢弃的设备;
  • 警告:永久清除所有数据,执行前务必备份!
🎯常见案例
1、安全检测(非破坏性)+ 导出坏块列表
目标:检测/dev/sdb1 分区,保留数据,导出坏块到badblocks.log
# 1. 卸载分区(关键!)sudo umount /dev/sdb1# 2. 非破坏性检测,显示进度+详细信息+导出结果sudo badblocks -nsv -b 4096 -o badblocks.log /dev/sdb1
  • -b 4096:匹配 ext4 默认块大小(避免块号错位);
  • 执行后,badblocks.log 会记录所有坏块的块号。
2、新磁盘破坏性深度检测
目标:全新/dev/sdc 磁盘,全范围高精度检测
sudo badblocks -wsv -b 4096 -c 4096 -p 2 /dev/sdc
  • -c 4096:一次检测 4096 块,大幅提速;
  • -p 2:重复扫描 2 次,避免漏检。
3、局部范围检测(跳过磁盘前 100G)
目标:只检测/dev/sdb 从 1000000 号块到末尾(块大小 4K)
sudo badblocks -v -b 4096 /dev/sdb 0 1000000
  • 语法:badblocks [选项] 设备 结束块 起始块(注意顺序)。
4、结合 e2fsck 标记坏块
badblocks 仅检测坏块,需用e2fsck 将坏块加入文件系统黑名单,永久屏蔽:
# 方法1:直接用 e2fsck 调用 badblocks(推荐,自动匹配块大小)sudo e2fsck -c -v /dev/sdb1  # -c:只读检测;-cc:非破坏性检测# 方法2:用 badblocks 导出的列表标记sudo e2fsck -l badblocks.log -v /dev/sdb1
•执行后,ext4 文件系统会拒绝分配坏块,彻底规避数据风险。
5、查看已标记的坏块(ext4)
sudo dumpe2fs -b /dev/sdb1
  • 输出文件系统中已记录的所有坏块号。
🎯常见问题与避坑指南
1. 报错:“Device or resource busy”
原因:设备已挂载或被进程占用;
解决:
  1. 执行sudo umount /dev/sdX 卸载;
  2. 若卸载失败,用lsof /dev/sdX 或fuser -m /dev/sdX 查找占用进程,关闭后重试。
2. 块大小不匹配(导致坏块号错误)
问题:badblocks -b 1024 检测,e2fsck 用 4096 块,标记位置错位;
解决:检测前先查文件系统块大小:
tune2fs -l /dev/sdb1 | grep "Block size"  # ext4xfs_info /dev/sdb1 | grep "blocksize"     # xfs
检测时必须用-b 指定一致的块大小。
3. 检测速度极慢
优化方案:
  1. 调大-c 参数(如-c 4096),减少 I/O 次数;
  2. 用-t 减少测试模式(如-t 0xaa -t 0x55,仅 2 种模式);
  3. 机械盘避开高峰 I/O 时段,SSD 可适当提速。
4. 物理坏块 vs 逻辑坏块
  • 物理坏块:badblocks 重复检测均报错,无法修复,尽快备份数据、更换磁盘;
  • 逻辑坏块:badblocks -w 覆盖后消失,可通过格式化修复。
最后,badblocks 是 Linux 磁盘维护的好帮手,掌握它的用法,能提前规避大部分磁盘坏块导致的系统崩溃、数据损坏问题。

最新文章

随机文章