badblocks输出的坏块列表是纯文本格式,每行一个十进制逻辑块号(从0开始),按指定块大小对齐,无标题、无分隔符;该列表需配合e2fsck -l注入ext文件系统才能生效,否则仅作记录无屏蔽作用。

badblocks 输出的文本文件就是坏块分布详情记录表,它不带格式、纯数字行,每行一个逻辑块号(LBA),直接可读可用。
badblocks 生成的坏块列表长什么样
执行 sudo badblocks -sv /dev/sdb1 > badsectors.txt 后,badsectors.txt 内容类似:
51249 51250 51251 51253 51254 61245
每一行是一个十进制整数,代表该设备上「从 0 开始计数」的逻辑块地址(Logical Block Address)。注意:这不是扇区号,而是按 -b 指定的块大小(默认 1024 字节)对齐后的块编号。
- 若用
-b 4096,则每个数字对应 4KB 块;/dev/sdb1的实际物理扇区偏移需换算:sector = block_number * (4096 / 512) = block_number * 8 - 该文件无标题、无分隔符、无校验,是标准 Unix 文本格式,
e2fsck -l和脚本都能直接消费 - 重复扫描(如
-p 3)会减少误报,但不会改变输出格式——仍是单列纯数字
如何确认坏块是否已被文件系统屏蔽
仅生成 badsectors.txt 不等于坏块已失效。必须显式注入 ext 文件系统才能避开它们:
- 先确保分区已卸载:
sudo umount /dev/sdb1;若提示 busy,用lsof +D /mount/point查进程 - 运行:
sudo e2fsck -l badsectors.txt /dev/sdb1—— 这会把列表写入 ext 的坏块 inode(inode 8),后续mkfs或e2fsck -c都会跳过这些块 - 验证是否生效:
sudo dumpe2fs -h /dev/sdb1 | grep -i "bad",看到Bad blocks count> 0 才算成功
⚠️ 注意:fsck -l 对非 ext 系统(如 xfs、btrfs)无效;xfs 用 xfs_repair -l 不支持外部坏块列表,只能靠底层 RAID 或 SMART 层隔离。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
为什么不能直接用 df 或 lsblk 查坏块分布
df 和 lsblk 只反映挂载状态和空间统计,完全不接触底层块健康信息:
-
df -h显示的是文件系统层可用空间,坏块若已被标记,空间已扣除;若未标记,可能引发 I/O 错误但df仍显示“正常” -
lsblk -f只输出 FSTYPE、UUID、MOUNTPOINT,和坏块无关 - 真正能交叉验证的只有
smartctl -a /dev/sdb中的Reallocated_Sector_Ct和Current_Pending_Sector,但这属于固件级统计,不提供具体 LBA 列表
所以,要拿到「具体分布详情」,唯一可靠路径就是 badblocks 输出的纯文本 + e2fsck -l 注入,中间不能跳步。
容易被忽略的细节:块大小与设备范围必须匹配
badblocks 默认按 1024 字节块扫描,但现代磁盘多用 4K 扇区或 4K 对齐分区。错配会导致漏检或误报:
- 查设备真实逻辑块大小:
sudo blockdev --getbsz /dev/sdb1(通常返回 4096) - 扫描时务必指定:
sudo badblocks -b $(blockdev --getbsz /dev/sdb1) -sv /dev/sdb1 - 若省略
-b且设备实际块大小 ≠ 1024,badsectors.txt中的数字无法准确映射到物理位置 - 对 LVM 逻辑卷或加密设备(如
/dev/mapper/vg-lv),badblocks仍可运行,但坏块归属难以追溯到物理盘 —— 此时优先看smartctl和底层 PV 日志
坏块列表本身很轻量,但它的有效性完全依赖于扫描参数与设备特性的严格一致。差一个 -b,整份记录就失去定位价值。










