蓝易云:解决 Ubuntu 文件系统突然变成只读(Read-only)的实战方法
当 Ubuntu 分区被系统自动切到只读,本质上是内核在“止损”:文件系统或底层磁盘出现异常,为避免越写越坏而触发保护性重挂载(常见关键字:errors=remount-ro、Remounting filesystem read-only)。(Unix & Linux Stack Exchange)
先别急着“硬改回可写”,正确顺序是:先定位 → 再修复 → 最后复盘预防。🔧
1)先用一张表把原因锁死(建议照表排查)
| 典型原因 | 你会看到的现象 | 如何验证 | 正确处理动作 |
|---|---|---|---|
| 文件系统元数据错误(ext4 最常见) | 读写报错、目录创建失败、系统提示只读 | dmesg/journalctl有 ext4 error/readonly | 离线fsck修复 |
| 底层磁盘/阵列I/O 错误 | 变只读反复出现,甚至卡顿 | dmesg出现 I/O error;SMART 异常 | 先保数据,再做硬件/盘体检查 |
| 空间或 inode 用尽 | 不是典型“自动只读”,但业务表现像“写不进去” | df -h/df -i100% | 清理空间/文件数量,避免误判 |
| 云盘/虚拟化底座抖动 | 业务高峰更易触发,只读后恢复不稳定 | 宿主/云平台告警、块设备重置 | 升级云盘档位/迁移/开监控告警 |
2)快速定位:确认“到底是谁变只读了”
mount | grep -E " on / | ro[,)]" findmnt -no SOURCE,FSTYPE,OPTIONS / lsblk -f解释(逐条看懂):
mount ... ro:直接确认哪些挂载点处于只读(ro)。findmnt ... /:定位根分区“对应的设备是谁”、文件系统类型(ext4/xfs 等)以及挂载参数。lsblk -f:把设备、UUID、文件系统类型一屏看清,后面跑修复命令不会“修错盘”。
3)看日志抓“第一现场”:别凭感觉下结论
dmesg -T | egrep -i "EXT4|I/O error|read-only|remount" | tail -n 80 journalctl -k -b -p err --no-pager | tail -n 200解释:
dmesg -T:看内核实时记录,通常能直接看到为何触发只读(ext4 错误或I/O error)。(Unix & Linux Stack Exchange)journalctl -k -b -p err:只筛内核级错误(err),并限定本次启动(-b),效率更高。
4)“临时止血”方案:只用于应急,不是根治 ✅
sudo mount -o remount,rw /解释:
这只是把已挂载的分区尝试“重新以可写方式挂载”。如果底层错误仍在,系统很可能很快又切回只读。(Ask Ubuntu)
我的明确观点:能 remount 成功不代表盘没问题,只代表你暂时抢到写入窗口。趁这窗口先导出关键数据,别恋战。😄
5)根治方案:离线修复(强烈建议)🧯
A. ext4(最常见)
原则:不要对“正在挂载的读写分区”做修复;根分区要进 Recovery 或 LiveCD 环境做。
sudo fsck -f /dev/sdXN解释:
fsck:文件系统一致性检查与修复工具。-f:强制做完整检查(更彻底)。/dev/sdXN:替换成你在findmnt/lsblk里定位到的真实分区。
B. 想在下次启动强制跑 fsck(适合“重启窗口”明确的场景)
sudo touch /forcefsck sudo reboot解释:
touch /forcefsck:创建一个标记文件,让系统在启动流程中倾向执行检查;不同发行版/引导链路行为会有差异。(Ask Ubuntu)如果你用的是较新的 systemd 引导链路,常见做法是加内核参数
fsck.mode=force fsck.repair=yes来强制检查与自动修复。(Ask Ubuntu)
6)别忽略“硬件侧”体检:只读反复出现,盘大概率在报警
sudo apt-get update sudo apt-get install -y smartmontools sudo smartctl -a /dev/sda sudo smartctl -t short /dev/sda解释:
smartmontools:读取磁盘 SMART 指标。smartctl -a:查看健康状态、坏块相关计数、错误日志等,是判断“盘是否在走下坡路”的核心证据。(Super User)smartctl -t short:发起短自检,快速验证盘体基本可靠性(有条件再做 long test)。
7)给你一个最稳的排障流程(vditor 支持 Mermaid)
flowchart TD A[发现分区变成只读] --> B[定位挂载点/设备 findmnt/lsblk] B --> C[查内核日志 dmesg/journalctl] C --> D{是ext4一致性错误?} D -->|是| E[离线fsck修复] D -->|否| F{出现I/O error或SMART异常?} F -->|是| G[优先保数据+硬件/云盘排查] F -->|否| H[检查空间/ inode/配置与底座] E --> I[重启验证+监控告警] G --> I H --> I最后一句务实建议
如果你的系统是生产业务机:一旦出现只读,把它当成“底座风险事件”处理,不要把它当成“小故障”。你越早完成“离线修复 + 硬件证据链”,后面少掉的不是工单,是通宵。
如果你把findmnt -no SOURCE,FSTYPE,OPTIONS /和dmesg -T | tail -n 120的输出贴出来,我可以直接帮你把“原因”定位到表格里的某一行,并给出最短修复路径。