你得先搞清楚,到底是磁盘本身硬件坏了,还是分区表坏了,还是文件系统出问题了,不一样的问题处理方法完全不一样。
如果是物理坏道,从内核日志里能直接看到类似 I/O error, dev sda 这样的提示,用 smartctl -a /dev/sda 看一下SMART信息,就能看到当前磁盘的健康状态,坏道数量已经重新分配扇区的计数,如果已经超过了阈值,直接换盘就完了,别想着修修补补继续用,生产环境经不起随时宕机的风险。
如果是逻辑坏道,或者只是文件系统出错了,那修复起来就简单多了。先卸载出问题的分区,然后执行 e2fsck -f /dev/sdb1 (如果是ext系列文件系统的话),如果是xfs就用 xfs_repair,大部分的文件系统错误都能修复好。
这里一定要注意,千万不要在挂载状态下执行修复命令,不然反而会把文件系统搞坏,这个是很多新手常踩的坑,一定要记牢。
如果是分区表损坏了,其实也不用太慌。现在很多工具都能修复分区表,比如testdisk,扫一遍就能把原来的分区信息找回来,只要数据区没被覆盖,大部分都能恢复正常。我之前就遇到过一次误操作把分区表删了,最后用testdisk完整恢复了所有数据,比想象中好用很多。
如果是挂载了网络存储,比如NFS或者iSCSI,那还要先排查是不是链路出问题了,不是磁盘本身坏了,可能是交换机端口故障,或者存储服务器宕机了,别盯着本地磁盘瞎忙活,先排查链路层,很多时候都是网络问题导致的磁盘访问异常。