磁盘突然变成只读,文件写不进去:先别重启,查这三处
服务器跑得好好的,突然写文件报错:Read-only file system。服务写不了日志,程序保存不了数据。重启大法这时候别急着用——只读挂载往往是文件系统在自我保护,先查清原因再动手,不然可能把还能抢救的数据也弄丢了。
先确认是不是真的只读
跑这两条:
mount | grep ' / '
df -h /
如果 mount 输出里根分区后面跟着 ro,那就是真的只读挂载了。df 可能还显示有空闲空间——只读和写满是两回事,别混了。
再看内核日志,十分钟前发生了什么:
dmesg | tail -50
重点找 ext4、I/O error、remount 这类关键字。只读的原因基本逃不出下面三处。
第一处:文件系统出错,内核自动改成只读
这是最常见的原因。磁盘出现坏道、底层存储抖动、或者上次异常断电留下了不一致,ext4 在检测到错误后会按挂载参数的 errors=remount-ro 把分区改成只读,防止继续写入造成更大损坏。
dmesg 里一般能看到类似的字样:EXT4-fs error、I/O error, dev sda、Remounting filesystem read-only。
处理办法:先备份还能读的数据,然后卸载分区做检查:
umount /dev/vda1
fsck -y /dev/vda1
云服务器上操作前先打个快照再动手。fsck 修完重新挂载:
mount -o remount,rw /
如果 fsck 反复报错、或者修完很快又变只读,基本是盘本身有问题,别硬撑,挂新盘迁移数据。
第二处:有人(或者某个脚本)把它 remount 成了只读
不是每次只读都是故障。查一下最近有没有人动过挂载:
history | grep -i remount
cat /etc/fstab
fstab 里如果某一行写了 ro,或者某个定时任务、部署脚本里带了 mount -o remount,ro,分区就会被改成只读。这种情况 dmesg 里干净得很,没有任何错误。
处理很简单,改回读写挂载就行:
mount -o remount,rw /
然后把 fstab 或者脚本里那行 ro 改掉,不然下次重启又变回去。
第三处:底层存储出了问题,云盘被限制了
云服务器上还有一种情况:云盘欠费、到期、或者云平台侧的存储出现异常,平台会把盘置成只读。这种情况机器里面怎么查都查不出毛病,dmesg 干净、fsck 也没问题。
这时候去云厂商控制台看一眼云盘状态:有没有欠费提醒、盘是不是被标记异常、有没有快照或备份策略在跑。欠费就补齐,平台侧异常就提工单,别在机器里瞎折腾。
只读是保护,不是故障本身
记住一个顺序:先 mount 确认、再 dmesg 找原因、然后按原因处理。不要一上来就重启——重启解决不了坏道和欠费,还可能让正在写一半的数据彻底丢失。
平时防一手也不难:监控里加一条 dmesg 关键字告警(I/O error、EXT4-fs error),云盘开自动快照,根分区别塞满大文件。盘出问题不可怕,可怕的是发现的时候数据已经没了。
- 点赞
- 收藏
- 关注作者
评论(0)