服务器运维

硬盘修复方法:chkdsk、badblocks、smartctl 命令与工具

硬盘修复先分清修的是什么:分区打不开、提示文件损坏,多数是文件系统错误,Windows 用 chkdsk /f、Linux 用 fsck 能修好;出现坏道时,任何软件的“修复”都只是让硬盘把坏扇区换到备用区,扇区里的数据和盘面本身都回不来。服务器上的盘只要坏道还在增长,修复的意义就是把数据迁出来、撑到换盘。

作者 顶联产品团队发布于 9 分钟阅读

硬盘修复要先分清修的是哪一层。分区打不开、提示“文件或目录损坏且无法读取”、开机自检报文件系统错误,问题出在文件系统,Windows 用 chkdsk /f、Linux 用 fsck(ext4 是 e2fsck,XFS 是 xfs_repair)多数能修好,盘本身没坏。复制文件报“数据错误(循环冗余检查)”、SMART 里待映射扇区不为 0,问题出在盘面,这时任何工具的“坏道修复”做的都是同一件事:让硬盘重新写入读不出的扇区,写不进去就换到出厂预留的备用区。坏扇区里原来的数据已经丢失,盘面也不会因此变好,所以服务器上的盘只要坏道还在增长,修复只是为迁移数据和换盘争取时间。

先判断:修文件系统还是修坏道

现象 问题在哪一层 能不能修好 先做什么
开机出现“正在扫描和修复驱动器”,或 fsutil dirty query 显示卷为脏 文件系统,多为非正常关机 能 让检查跑完,或执行 chkdsk /f
打开目录提示“文件或目录损坏且无法读取”;Linux 报 Structure needs cleaning 文件系统元数据损坏 多数能 chkdsk /f;e2fsck、xfs_repair
分区变成 RAW,提示需要格式化 文件系统或分区表损坏 视情况 有重要数据先做整盘镜像,不要格式化
复制某个文件卡住,报“数据错误(循环冗余检查)”或“设备未就绪” 坏扇区 扇区上的数据通常读不回来,盘可以重映射后再用一段时间 先拷出能读的数据
dmesg 出现 Medium Error,SMART 的 197、198 不为 0 盘面介质 同上 阵列成员交给阵列卡处理,单盘按后文 Linux 一节处理
不识别、容量异常、通电有咔哒声 磁头、电机、固件或主控 软件修不了 断电,按数据恢复流程处理
固态硬盘突然只读或掉盘 寿命耗尽或主控故障 修不了 趁还能读先拷数据,然后换盘

判断属于哪一类,先看两条命令的结果:

# Linux:坏道相关的三个计数,5 是已重映射,197 是待映射,198 是离线无法纠正
smartctl -A /dev/sdb | grep -E '^ *(5|197|198) '
# Windows(PowerShell):系统识别的介质类型与健康状态
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus

三个计数都是 0、系统日志里没有磁盘错误,就按文件系统问题处理;有任何一项不为 0,先把重要数据拷走,再谈修复。

坏道“修复”到底做了什么

机械硬盘出厂时,在盘片上预留了一批备用扇区。某个扇区读取失败时,硬盘不会马上替换它,因为也可能只是那一次写入的信号质量不好,于是先记为“待映射”(SMART 197)。之后这个扇区被重新写入时,硬盘写入并校验:写得进、读得回,就从待映射列表里移除,这就是常说的“逻辑坏道”;写不进去,硬盘就把这个地址指向一个备用扇区,已重映射计数(SMART 5)加一,这是“物理坏道”。

由此得出三个结论:

  1. 只读扫描修不了坏道。 扫描只会发现更多待映射扇区,必须有一次写入,重映射才会发生。hdparm 覆盖单个扇区、badblocks -w、全盘写零、Victoria 的 Remap 模式、DiskGenius 的坏道修复,本质上都是在对坏扇区制造写入。chkdsk /r 的思路不同:它把读不出的簇记进 NTFS 的坏簇表,让文件系统以后不再使用这些簇,这是文件系统层面的绕开,不等于硬盘完成了重映射。
  2. 坏扇区里原来的数据回不来。 重映射后,这个地址读出来的是新写入的内容,通常是全 0。落在这个扇区上的文件已经损坏,只能从备份恢复。
  3. 备用区有限,重映射是盘面退化的证据。 一块盘几周内从 0 涨到几十个重映射扇区,下个月往往会更多。修复让盘暂时能用,不代表它恢复了可靠性。

Windows 硬盘修复命令:chkdsk 与 diskpart

chkdsk 参数怎么选

以管理员身份打开命令提示符(cmd),格式是 chkdsk 盘符: 参数:

命令 做什么 耗时与影响
chkdsk D: 只检查、不修复,报告是否有错误 几分钟,可在线运行
chkdsk D: /scan NTFS 在线扫描,能在线修的就地修,其余排队等待离线修复 不需要卸载卷
chkdsk D: /spotfix 只修复 /scan 排队的问题 卷离线的时间很短
chkdsk D: /f 修复文件系统错误,需要独占锁定卷 系统盘要在重启时执行
chkdsk D: /r 包含 /f,并逐簇读取全盘,可读的数据迁走,读不出的簇记入坏簇表 大容量机械盘可能要数小时到十几小时
chkdsk D: /x 必要时先强制卸载卷,再按 /f 修复 卷上已打开的文件句柄全部失效
chkdsk D: /b 包含 /r,清空 NTFS 的坏簇表后重新扫描所有簇 用在把卷克隆到新盘之后

推荐的顺序是 chkdsk D: → chkdsk D: /scan → 必要时 /f,确认是坏道问题、数据已经拷走之后才用 /r。原因是 /r 要读每一个簇,读到坏扇区时硬盘会反复重试,正在退化的盘多读一遍就多一分风险。

几种常见情况:

  • 对系统盘 C: 执行 /f 或 /r,会提示卷正在使用、是否在下次重启时检查,输入 Y 后重启执行。开机检查的结果不会停留在屏幕上,要到事件查看器的“Windows 日志 → 应用程序”里,找来源为 Wininit、事件 ID 为 1001 的记录。
  • 服务器上的数据卷,先停掉往这个卷写数据的服务(数据库、文件共享),再用 /x 卸载修复,否则锁不住卷。
  • 写进脚本时可以用 PowerShell 的等价命令:Repair-Volume -DriveLetter D -Scan,以及 -SpotFix、-OfflineScanAndFix。
fsutil dirty query D:
chkdsk D: /scan
echo %errorlevel%

fsutil dirty query 显示卷是否被标记为“脏”,被标记的卷下次开机会自动检查。chkdsk 的退出码:0 表示没有发现错误,1 表示发现错误并已修复,2 表示做了磁盘清理或因为没加 /f 而未做清理,3 表示无法检查、无法修复,或因为没加 /f 而未修复。

diskpart 能修什么

diskpart 不修坏道,也不修文件系统,它处理的是磁盘和分区层面的状态:

diskpart
list disk
select disk 1
detail disk
online disk
attributes disk clear readonly
  • 磁盘显示“脱机”:常见于新挂载的数据盘,或 SAN 策略设为脱机的服务器,online disk 让它联机。
  • 磁盘或卷被标为只读:attributes disk clear readonly 清除磁盘只读属性;卷级只读先 select volume N,再 attributes volume clear readonly。如果是固态硬盘寿命耗尽后被主控锁成只读,清属性不起作用。
  • 彻底清空一块有坏道的盘:clean all 会把每个扇区写一遍 0,这次全盘写入会让所有待映射扇区完成重映射,作用相当于 Linux 上的全盘写零。它清除盘上全部数据,选错盘无法挽回,执行前用 detail disk 再核对一遍型号和容量。不带 all 的 clean 只删除分区信息,不会触发重映射。

Linux 硬盘修复命令:定位、覆盖、整盘处理

第一步:找到坏扇区在哪里

让硬盘跑一次长自检,结果里会给出第一个读失败的扇区地址(LBA):

smartctl -t long /dev/sdb          # 后台执行,预计时间见 smartctl -c 的输出
smartctl -l selftest /dev/sdb      # 看 Status 列和最后一列 LBA_of_first_error

结果为 Completed: read failure 时,最后一列就是坏扇区的 LBA,例如 1953519231。接着查这个扇区属于哪个文件,决定能不能直接覆盖它。以 ext4 为例(块大小 4096 字节、扇区 512 字节):

cat /sys/block/sdb/sdb1/start                     # 分区起始扇区,例如 2048
echo $(( (1953519231 - 2048) * 512 / 4096 ))      # 换算成文件系统块号,得到 244189647
debugfs -R "icheck 244189647" /dev/sdb1           # 块号 → inode 号;显示 <block not found> 说明是空闲块
debugfs -R "ncheck 12345678" /dev/sdb1            # inode 号(这里是示例)→ 文件路径

其他文件系统的反查方法不同,查不出来时,就按“这个扇区上的数据已经损坏”处理。

第二步:覆盖单个坏扇区,触发重映射

确认这个扇区是空闲块,或者对应的文件已经有备份,可以只覆盖这一个扇区:

hdparm --read-sector 1953519231 /dev/sdb          # 先确认确实读不出,应报 I/O error
hdparm --yes-i-know-what-i-am-doing --write-sector 1953519231 /dev/sdb   # 写入全 0
hdparm --read-sector 1953519231 /dev/sdb          # 能读出全 0,说明写入成功
smartctl -A /dev/sdb | grep -E '^ *(5|197) '      # 197 减少;5 增加说明换到了备用区

hdparm 直接向 SATA 盘发命令,盘在硬件 RAID 卡后面时用不了。写入 0 以后,对应文件的内容就损坏了,要从备份恢复该文件;坏扇区落在文件系统元数据上时,覆盖后再对卸载状态的分区跑一次 fsck。

第三步:坏扇区多时整盘处理

坏扇区多,或者盘已经退出生产、要决定去留,就整盘处理一遍:

命令 读写方式 对数据的影响 用途
badblocks -sv -b 4096 /dev/sdb 只读 不改数据 列出读不出的块
badblocks -nsv -b 4096 /dev/sdb 读出原内容、写测试图案、校验、写回 正常跑完不破坏数据,但分区必须未挂载 有数据、能停机的盘做读写检测
badblocks -wsv -b 4096 /dev/sdb 写满测试图案再读回校验,默认 4 种图案 清空整盘 新盘验收、坏盘复检
dd if=/dev/zero of=/dev/sdb bs=1M oflag=direct status=progress 顺序写一遍 0 清空整盘 让所有待映射扇区完成重映射

时间要提前算好。以 8 TB 机械盘、平均 200 MB/s 估算,全盘写一遍约 11 小时;badblocks -w 默认 4 种图案各写一遍、读一遍,共 8 遍,接近 4 天,加 -t 0 只测一种图案,可以缩短到一天左右。badblocks 的块号上限是 32 位,-b 4096 时最多覆盖约 16 TiB,更大的盘要把 -b 调大,例如 8192。

处理完再跑一次长自检。197 归零、自检通过、之后几周 5 号不再增长,这块盘可以降级去做不重要的用途;自检仍然失败,或者 5 号还在涨,就报废或返修。

e2fsck -c 会调用 badblocks,把坏块记进 ext4 的坏块表,让文件系统绕开它们。这是硬盘还不会自动重映射的年代留下的做法,现在的盘在写入时会自己处理;到了需要文件系统来躲坏块的地步,说明备用区已经不够用,该换盘了。fsck 本身只修文件系统结构,和坏道无关。

服务器上的坏道:交给阵列修,修完决定换不换

阵列的巡读和一致性检查

服务器的盘大多在 RAID 里,修坏道用不着上面这些单盘工具,阵列自己就会做,而且不丢数据:阵列读到某块成员盘的坏扇区时,用镜像或校验算出正确内容,再写回这个扇区,硬盘就在这次写入时完成重映射。问题是平时没被读到的扇区不会触发这个过程,潜伏的坏道会一直留到某块盘故障、阵列重建时才暴露,导致重建失败。所以要定期全盘巡检:

阵列 巡检方式 命令
Broadcom/LSI MegaRAID、Dell PERC 巡读(Patrol Read),周期性扫描全部成员盘 查看 storcli64 /c0 show patrolread;开启 storcli64 /c0 set patrolread=on mode=auto
同上 一致性检查(CC),核对数据与校验是否一致 storcli64 /c0/v0 start cc;进度 storcli64 /c0/v0 show cc
Linux 软 RAID(mdadm) check 读遍所有成员,遇到读错误用冗余数据重写 echo check > /sys/block/md0/md/sync_action;cat /proc/mdstat 看进度
ZFS scrub 校验全部数据块,用冗余副本修复 zpool scrub tank;zpool status tank

Dell 服务器上的 perccli 与 storcli 命令格式基本相同。巡读和一致性检查都会占用磁盘 IO,阵列卡一般会自动限速,仍然建议排在业务低峰。单盘服务器或 RAID 0 没有冗余数据可以回写,只能按上一节的方法处理,并认定坏扇区上的数据已经丢失。

修完还能不能用:按盘的位置决定

盘的位置 出现坏道后怎么处理 理由
RAID 1、5、6、10 的成员盘 不在原位修,让阵列回写坏扇区,同时安排更换;198 不为 0 或自检读失败就换 单冗余阵列重建时要读遍其他盘,带着潜伏坏道的盘最容易在这时出事
单盘系统盘 先备份或迁移,再用 hdparm 或写零处理;修完继续用只作短期过渡 没有冗余,下一个坏扇区可能就落在系统文件上
热备盘、库存备件 不修,直接返修或报废 热备盘要在别的盘坏时顶上,本身不能有问题
测试机、临时存储 全盘写零、自检通过后可以继续用,持续盯住 5 号计数 数据不重要,能用多久算多久
新到货的盘 验收时 badblocks -w 或全盘写一遍,出现重映射就退换 新盘出现坏道属于早期失效
固态硬盘 不修,看备用块和介质错误计数决定是否更换 坏块由主控处理,外部工具帮不上

出现下面任何一条,就不再修,直接换:SMART 总体健康为 FAILED;同一块盘的 5 号计数一个月内持续上涨;修复后的长自检仍报 read failure;阵列卡标记为 Predictive Failure;通电后有异响。

硬盘修复工具哪个好:按用途选

工具 平台 擅长做什么 注意
chkdsk、Repair-Volume Windows 自带 修复 NTFS 文件系统,/r 顺带扫坏簇 看不到坏道分布和响应时间
DiskGenius Windows 分区管理与恢复、文件恢复、坏道检测与修复、磁盘克隆 坏道修复会改写坏道所在区域,先恢复文件再修
Victoria Windows 表面扫描,按每个块的响应时间分档着色;查看 SMART 扫描模式中除 Ignore 外,Remap、Erase、Refresh 都会写盘
CrystalDiskInfo Windows 读取 SMART,给出 Good、Caution、Bad 三档判断 只看不修
smartctl(smartmontools) Linux、Windows 读 SMART、跑自检、穿透 RAID 卡读取成员盘 只诊断不修复
badblocks、hdparm、dd Linux 扫坏块、覆盖指定扇区、全盘写零 -w、–write-sector、dd 都会改写数据
e2fsck、xfs_repair Linux 修复文件系统结构 分区必须先卸载
ddrescue Linux 从有坏道的盘上尽量把数据复制出来 任何修复之前,先用它做镜像
厂商诊断工具(如希捷 SeaTools) 视厂商而定 按厂商标准测试 报修时是否需要测试结果,以厂商说明为准
storcli、perccli、ssacli 随阵列卡提供 巡读(HPE 阵列卡称为表面扫描)、一致性检查、成员盘错误计数 服务器 RAID 优先用它们

“哪个好”取决于要做什么:救数据,用 ddrescue 做镜像、DiskGenius 恢复文件;判断盘还能不能用,看 smartctl 或 CrystalDiskInfo 的计数,再用 Victoria 看响应时间分布,响应明显偏慢的块往往是坏道的前兆;让坏扇区完成重映射,用 hdparm 覆盖单个扇区,或用 Victoria 的 Remap、badblocks -w、全盘写零;文件系统打不开,用 chkdsk 或 fsck。没有哪款软件能修好物理损坏的盘面,上限就是触发重映射。

在管理系统里怎么落地

修盘之后真正麻烦的是追踪:哪台服务器的哪块盘修过、修完计数有没有再涨、换下来的盘送修回来没有。Toplink DCIM 的机柜与资产把硬盘等可更换部件按批次入库,坏盘登记返修后,首页能看到处于返修流程中的部件数量;向服务器下发硬件采集脚本后,硬盘信息自动入库并保留每次采集的历史,换盘前后的记录一对就知道动过哪块盘。Windows 服务器重启后停在开机磁盘检查、Linux 停在要求手动 fsck 的提示符时,可以在 IPMI 远程管理里打开 VNC 控制台查看进度、输入命令,不必为了按一个键专门跑一趟机房。

常见问题

chkdsk /r 卡在某个百分比很久不动怎么办?

读到坏扇区时,硬盘自身会反复重试,每个坏扇区可能耗时数秒到数十秒,进度看起来就像卡住。盘里有重要数据时不要硬等,宁可中断检查,先用 ddrescue 或 DiskGenius 把数据拷出来。开机前的磁盘检查反复出现时,可以进系统后执行 chkntfs /x C: 跳过预定检查,但盘的问题并没有解决。

固态硬盘能用 Victoria 之类的工具修坏道吗?

不能。SSD 的逻辑地址和闪存物理块之间隔着主控的映射表,坏块由主控用备用块替换,外部工具扫描看到的只是逻辑地址,反复全盘读写只会消耗写入寿命。SSD 出现读错误时,看 SMART 里的可用备用块和介质错误计数,接近阈值就换盘。

chkdsk 和 sfc /scannow、DISM 有什么区别?

chkdsk 修的是磁盘上的文件系统结构;sfc /scannow 检查并替换损坏的 Windows 系统文件;DISM /Online /Cleanup-Image /RestoreHealth 修复 sfc 所依赖的组件存储。系统文件报错先跑 DISM 再跑 sfc,分区打不开、目录损坏才用 chkdsk。

低级格式化能修复坏道吗?

现在所说的“低级格式化”工具,实际做的是全盘写零,和 diskpart 的 clean all、dd 写零效果相同:能让待映射扇区完成重映射,但已经换到备用区的扇区不会还原,盘面也不会变好。真正意义上的低级格式化在出厂时完成,用户无法执行。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88