如何检测 Linux 硬盘上的坏扇区或坏块?

硬盘是计算机系统中存储数据的核心组件,其健康状况直接影响系统的稳定性和数据的安全性。随着使用时间的增长,硬盘可能会出现坏扇区或坏块,这些问题可能导致数据丢失、系统崩溃甚至硬件彻底失效。在 Linux 系统中,检测和处理坏扇区是一项关键的维护任务。本文将深入探讨如何在 Linux 下检测硬盘上的坏扇区或坏块,介绍相关工具和命令,并提供详细的操作步骤和注意事项,力求为读者提供全面而实用的指导。

坏扇区与坏块的定义及成因

坏扇区(Bad Sector)是指硬盘上无法正常读写的存储单元,通常分为「物理坏扇区」「逻辑坏扇区」。物理坏扇区是由于硬件老化、机械磨损或外界冲击(如摔落)导致的不可修复的损坏;逻辑坏扇区则是由于文件系统错误、突然断电或软件问题导致的,通常可以通过修复工具恢复。

坏块(Bad Block)是 Linux 文件系统中的术语,通常指包含坏扇区的存储块。坏块可能导致数据读取错误或写入失败,因此尽早检测和隔离坏块是维护硬盘健康的重要步骤。

坏扇区或坏块的常见成因包括:

  • 「硬件老化」:硬盘的磁性介质随时间退化。
  • 「机械故障」:读写头或盘片的物理损伤。
  • 「电源问题」:不稳定的电压或突然断电。
  • 「环境因素」:高温、潮湿或灰尘积累。
  • 「软件错误」:文件系统损坏或病毒感染。

Linux 检测坏扇区的常用工具

Linux 提供了多种工具来检测和处理硬盘上的坏扇区或坏块,以下是常用的工具及其功能概述:

  1. 「smartctl」(smartmontools 包):用于检查硬盘的 SMART(自我监测、分析和报告技术)数据,提供硬盘健康状态、错误日志和坏扇区信息。
  2. 「badblocks」:专门用于扫描硬盘上的坏块,支持非破坏性和破坏性测试。
  3. 「fsck」:文件系统检查和修复工具,可检测并标记坏块。
  4. 「dd」:用于低级别的磁盘读写测试,可间接发现坏扇区。
  5. 「e2fsck」:ext2/ext3/ext4 文件系统的专用检查工具,可标记和隔离坏块。
  6. 「dmesg」:查看内核日志,捕获硬盘相关的错误信息。

这些工具各有侧重,适用于不同场景。接下来,我们将详细介绍如何使用这些工具进行坏扇区检测。

准备工作

在检测硬盘坏扇区之前,需要做好以下准备:

  1. 「确认硬盘设备名称」

使用以下命令列出系统中的磁盘设备:

lsblk

或:

fdisk -l

输出中会显示类似 vdavdb 的设备名称。确保正确识别目标硬盘,以免误操作。

  1. 「备份数据」

坏扇区可能导致数据丢失,检测前务必备份重要数据。例如,使用 rsync 备份:

rsync -av /source/path /backup/destination

  1. 「以 root 权限操作」

大多数磁盘操作需要管理员权限,使用 sudo 或切换到 root 用户:

sudo -i

  1. 「卸载目标分区」

检测时,目标分区不能处于挂载状态。使用以下命令卸载:

umount /dev/sdXn

(将 sdXn 替换为具体分区,如 /dev/sda1

  1. 「安装必要工具」

确保安装了 smartmontoolse2fsprogs 等工具。

在基于 Debian 的系统上:

apt update

apt install smartmontools e2fsprogs

在基于 Red Hat 的系统上:

yum install smartmontools e2fsprogs

检测坏扇区的详细步骤

1. 使用 smartctl 检查硬盘健康状态

SMART 是硬盘内置的监控技术,可以提供有关硬盘健康状态的详细信息。smartctlsmartmontools 包中的核心工具,用于查询 SMART 数据。

检查 SMART 支持

首先,确认硬盘是否支持 SMART:

smartctl -i vda

输出中会显示类似 SMART support is: Enabled 的信息。如果未启用,可尝试开启:

smartctl -s on vda

查看硬盘健康状态

运行以下命令检查总体健康状态:

smartctl -H vda

如果输出显示 PASSED,说明硬盘健康状态良好;如果显示 FAILING,则可能存在严重问题。

获取详细 SMART 数据

使用以下命令查看详细的 SMART 属性,包括坏扇区计数:

smartctl -a vda

重点关注以下属性:

  • 「Reallocated_Sector_Ct」:重新分配的扇区数量,表示物理坏扇区的修复尝试。
  • 「Current_Pending_Sector」:等待重新分配的扇区,可能为坏扇区。
  • 「Uncorrectable_Error_Count」:无法纠正的错误计数,可能与坏扇区相关。

运行 SMART 自检

smartctl 支持短期(short)、长期(long)和传送(conveyance)测试。短期测试耗时较短,适合快速检查:

smartctl -t short vda

测试完成后,查看结果:

smartctl -l selftest vda

如果发现错误,说明可能存在坏扇区。

2. 使用 badblocks 扫描坏块

badblocks 是一个专门用于检测坏块的工具,支持非破坏性(只读)和破坏性(读写)测试。「警告」:破坏性测试会擦除数据,仅在数据不重要或已备份时使用。

非破坏性测试

非破坏性测试只读取数据,适合挂载的分区或不想破坏数据的场景:

badblocks -v vda

-v 参数显示详细输出,包括检测到的坏块编号。

破坏性测试

破坏性测试会写入测试模式并验证,适用于新硬盘或不关心数据的场景:

badblocks -w vda

-w 参数启用破坏性写入测试。测试完成后,坏块列表会显示在终端。

保存坏块列表

将检测到的坏块保存到文件中,以便后续处理:

badblocks -o badblocks.txt vda

指定块大小

某些文件系统(如 ext4)的块大小可能与硬盘扇区大小不同,可通过 -b 参数指定块大小(通常为 4096 字节):

badblocks -b 4096 -v vda

3. 使用 e2fsck 修复文件系统并标记坏块

对于 ext2/ext3/ext4 文件系统,e2fsck 可用于检查文件系统并标记坏块。结合 badblocks 的输出,e2fsck 可以隔离坏块。

基本检查

运行以下命令检查并修复文件系统:

e2fsck -v vda

-v 参数显示详细输出。如果发现坏块,e2fsck 会尝试将其标记为不可用。

结合 badblocks

badblocks 集成到 e2fsck 中,自动扫描并标记坏块:

e2fsck -c vda

-c 参数调用 badblocks 进行只读测试,并将坏块添加到文件系统的坏块列表中。

强制检查

如果文件系统标记为“干净”,但仍怀疑有问题,可强制检查:

e2fsck -f vda

4. 使用 dd 测试磁盘读写

dd 是一个低级别工具,可用于测试磁盘的读写性能,间接发现坏扇区。例如,尝试读取整个磁盘:

dd if=vda of=/dev/null bs=4M status=progress

如果遇到坏扇区,dd 会报告 I/O 错误。注意:此操作不会修复坏块,仅用于诊断。

5. 查看 dmesg 日志

内核日志可能记录与坏扇区相关的错误。使用以下命令查看:

dmesg | grep -i disk

或:

dmesg | grep -i error

如果日志中出现类似 I/O errorsector 的信息,可能表示存在坏扇区。

处理坏扇区的后续步骤

检测到坏扇区后,可采取以下措施:

  1. 「隔离坏块」

使用 e2fsckfsck 将坏块标记为不可用,避免文件系统继续使用这些块。

  1. 「重新分配扇区」

硬盘的固件会自动尝试将坏扇区重新分配到备用扇区,但如果 Reallocated_Sector_Ct 持续增加,说明硬盘健康状况恶化。

  1. 「替换硬盘」

如果坏扇区数量快速增加,或 SMART 数据显示硬盘即将失效,应立即替换硬盘。

  1. 「监控硬盘健康」

定期运行 smartctl 检查硬盘状态,预防潜在问题。

例如,设置 cron 任务每天检查:

0 2 * * * smartctl -a /dev/sda > /var/log/smartctl.log

原文链接:,转发请注明来源!