badblocks输出文件是纯文本数字列表,每行一个逻辑块号(lba),按升序排列,对应文件系统默认块大小(如4096字节)的块地址,无头信息、无校验、无注释,需配合扫描参数使用。

badblocks 扫描后生成的输出文件就是最直接、最具体的坏块分布详情记录,没有中间格式或数据库,就是纯文本数字列表——每一行一个逻辑块地址(LBA),按升序排列,这就是你要的“分布详情”。
badblocks 输出文件里到底存了什么
执行类似 sudo badblocks -sv /dev/sdb1 > badsectors.txt 后,badsectors.txt 文件内容形如:
51249 51250 51251 51253 61245
这些数字不是扇区编号,而是以当前文件系统默认块大小(通常是 4096 字节)为单位的**逻辑块号(block number)**。它对应设备上从起始位置开始的第 N 个块。
- 该编号与
fdisk -l显示的扇区(sector)编号不等价,换算需知道块大小和扇区大小(通常 1 块 = 8 扇区) - 若用
-b 512显式指定块大小,则输出数字就等同于扇区号 - 文件本身无头信息、无时间戳、无校验,就是裸数字列表 —— 简单,但也意味着你得自己保管好它并注明扫描参数
如何把坏块号映射到物理位置(例如柱面/磁头/扇区)
Linux 不提供直接转换工具,但你可以手动估算:
- 先查设备扇区大小:
sudo blockdev --getss /dev/sdb1(通常为512) - 查文件系统块大小:
sudo dumpe2fs -h /dev/sdb1 | grep "Block size"(常见4096) - 假设
badsectors.txt中某行为51250,且块大小为4096,则对应扇区号 ≈51250 × 4096 ÷ 512 = 410000 - 再用
sudo fdisk -l /dev/sdb查看起始扇区(如/dev/sdb1start =2048),则实际物理扇区 =410000 + 2048 = 412048
注意:SSD 或带硬件 RAID 的盘不适用此映射,其 LBA 已被控制器抽象,badblocks 返回的只是设备层可见的逻辑地址,无法反推 NAND 物理页。
e2fsck -l 加载坏块列表时,它怎么理解这个文件
e2fsck -l badsectors.txt /dev/sdb1 会逐行读取 badsectors.txt,将每个数字解释为文件系统块号,并在 ext2/3/4 的块组描述符中将其标记为“预留”(not available for allocation)。
- 要求:该文件必须是
badblocks原生输出格式(纯数字、每行一个、无空格/注释) - 失败表现:
e2fsck报错Bad block number in list: xxx,通常是因为块号超出文件系统总块数,或文件含非法字符 - 验证是否生效:运行
sudo dumpe2fs -h /dev/sdb1,检查Free blocks数量是否比正常值少(等于坏块数)
为什么不能直接用 smartctl 查坏块具体位置
smartctl -a /dev/sdb 可能显示 Reallocated_Sector_Ct 或 Current_Pending_Sector 非零,但它**从不暴露具体 LBA 地址**。
- S.M.A.R.T. 是固件级摘要,设计上就屏蔽物理细节,防止用户误操作或厂商 IP 泄露
- 即使
smartctl --log=devstat或--log=grown也只返回计数或模糊范围,不提供可定位的块列表 - 所以:S.M.A.R.T. 告诉你“可能有问题”,
badblocks告诉你“第 XXXX 块确实读不出来”——二者互补,不可替代
坏块记录的本质就是一行一个数字,没封装、没元数据、不带上下文。你得自己记清楚:用的是哪个设备、哪个块大小、是否跳过开头、是否用了 -p 重试。漏掉任一参数,下次想复现或比对就只能重扫。











