现场是这样的。进入某个上传目录执行 ls 直接报 Input/output error,cd 也失败,同分区的其他目录却完全正常,dmesg 里能看到对应的块读错误。

真正麻烦的地方在于,几个原因的现象几乎一样。目录块损坏,元数据已经无法解析;磁盘坏道正好落在这个目录占用的块上;上次 fsck 中途中断,目录项只修了一半。

第一件事是确认是单目录还是整个分区

ls /data | head

卸载后做只读检查

fsck.ext4 -fn /dev/vdb1

随后备份可读文件之后再修

fsck.ext4 -y /dev/vdb1

末了用 debugfs 尝试导出目录

debugfs -R 'ls -l /bad' /dev/vdb1

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

别只看报错消失,验证要多做一步。修复后 ls 该目录能正常列出文件,dmesg 不再出现该分区块的读错误,业务也能重新写入。

这里还有个坑。修复前先 dd 一份分区镜像,fsck 可能把残留目录项直接清空,那就彻底找不回来了;有坏道的盘要尽早换。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189