POST

飞牛 btrfs 数据校验:scrub 能发现什么、修不了什么

硬盘没坏,文件却读不出来,这叫静默损坏。btrfs 的 scrub 就是专门抓这种问题的。

有一种故障最难查:硬盘 SMART 全绿、系统一切正常,打开某个文件却报错,或者照片打开是花的。

这叫静默损坏(silent corruption)——数据在写入或存放过程中悄悄变了,硬盘本身没报错。

btrfs 有校验和,也有专门扫描校验和的工具:scrub。

scrub 在做什么

btrfs 给每个数据块存了一份校验和。scrub 就是把这些块全部读一遍,重新算校验和,和存的对不上就报告。

它能做到:

  • 发现哪块数据坏了;
  • 如果开了 RAID1/RAID5/RAID6 这类有冗余的模式,还能用另一份好的副本把坏块修回来;
  • 单盘、无冗余的情况下,只能报告,修不了。

什么时候该跑

  • 定期检查,比如每个月一次,或者每季度一次;
  • 怀疑数据损坏时;
  • 硬盘更换、掉盘重建之后;
  • 长期断电、非正常关机之后。

怎么跑

SSH 进去,用 btrfs 命令对挂载点操作:

btrfs scrub start /挂载点
btrfs scrub status /挂载点

scrub 是后台任务,跑完看状态里的错误数。几 TB 的盘,跑几个小时很正常。

跑出来有错误怎么办

先看错误类型和涉及的路径:

  • 有冗余的阵列:多数能自动修复,跑完再跑一次确认错误清零;
  • 单盘无冗余:错误修不了,只能从备份恢复对应的文件;
  • 错误集中在同一块盘:那块盘大概率要换了,跑一下 SMART 看看。

scrub 修不了什么

这点很重要,很多人对它有误解:

  • 它不防误删——删掉就是删掉,scrub 不管你删了什么;
  • 它不防勒索——加密后的数据校验和是好的,scrub 看不出来;
  • 它不替代备份——冗余只能救单块盘的坏块,救不了整机损坏、火灾、水淹;
  • 它不能修复没有冗余的损坏,只能告诉你哪里坏了。

跑 scrub 的代价

  • 全盘读一遍,机械盘会很慢,期间 I/O 压力大;
  • 建议放在夜里或者空闲时段;
  • 别和 RAID 重建、大文件拷贝同时跑。

一点建议

用了 btrfs + RAID 的组合,scrub 是最值得养的定期任务之一。它能把「半年后才发现照片是花的」变成「上个月就修好了」。

前提是:你得有冗余,也得有备份。scrub 是体检,不是保险。

👁 - 次浏览

留言

← 返回首页