记录下服务器开机以后某个分区突然变为 ro(read-only) 状态的解决办法

这是一篇发布于 1413 天前的文章,部分信息可能已发生改变。

背景

今天在盒子里跑了个不知道什么脚本(忘了),自动重启了以后发现根目录(/dev/md2)被内核自动挂载为了ro,并且取消了其他所有的挂载参数。此外,挂载参数的 data=writebackdata=ordered

环境

  • Ubuntu 18.04
  • 内核 4.15.0-140-generic
  • 没有更改过 fstab
  • 就是简单的重启,没有更换内核、更改内核参数等操作

排查

1. 取消 /etc/fstab 里所有的挂载参数

/etc/fstab 里的内容更改为

1
UUID=XXXX-XXXX-XXXX-XXXX-XXXX / ext4 defaults 0 1

成功,开机自动挂载为了 rw,但是挂载参数里的 data 依然是 ordered

2. 查看日志

1
2
3
4
# dmesg | grep EXT4

[ 4.570900] EXT4-fs (md2): mounted filesystem with ordered data mode. Opts: (null)
[ 7.113451] EXT4-fs (md2): re-mounte. Opts: nobarrier

没有提示,去 stackoverflow 寻找解决办法,最后找到了这样一个帖子。

https://askubuntu.com/questions/197459/how-to-fix-sudo-unable-to-open-read-only-file-system

里面提到了

1
fsck.ext4 -f /dev/md2

将md2挂载为只读,尝试以后失败。

3. 进入 Recsue 再次尝试 fsck

继续尝试

1
fsck.ext4 -f /dev/md2

等待许久,reboot 之后问题解决。

推测

在执行脚本之前或者是在执行脚本以后重启的时候文件系统损坏了,则 kernel 会将文件系统挂载为只读。

解决办法就是修复文件系统,使用 fsck.ext4 来修复 ext4 文件系统。

后续的一个小毛病

1
2
3
4
root@XiaoCai-SX63 ~ # mount | grep /dev/md
/dev/md2 on / type ext4 (rw,stripe=512)
/dev/md0 on /boot type ext3 (rw,stripe=512,data=writeback)
/dev/md1 on /home type ext4 (rw,stripe=512,data=writeback)

其他的分区都会显示 data=xxxxxxxx 唯独 /dev/md2 不显示。

解决

先查看文件被系统挂载为了啥模式

1
2
3
4
root@XiaoCai-SX63 ~ # dmesg | grep "filesystem"
[ 4.397600] EXT4-fs (md2): mounted filesystem with writeback data mode. Opts: (null)
[ 8.930265] EXT4-fs (md0): mounted filesystem with writeback data mode. Opts:data=writeback
[ 8.971793] EXT4-fs (md1): mounted filesystem with writeback data mode. Opts:data=writeback

看日志可以看出,三个分区都是 writeback 模式

查看默认模式

1
2
3
4
5
root@XiaoCai-SX63 ~ # tune2fs -l /dev/md2 | grep "Default mount options"
Default mount options: journal_data_writeback user_xattr acl

root@XiaoCai-SX63 ~ # tune2fs -l /dev/md1 | grep "Default mount options"
Default mount options: user_xattr acl

/dev/md2 的默认挂载模式是 writeback ,/dev/md1 的默认挂载模式是用户拓展模式

推测是因为默认挂载模式与现有挂载模式一致,故不在 mount 中显示挂载模式

移除 journal_data_writeback

1
2
3
4
5
root@XiaoCai-SX63 ~ # tune2fs -o^journal_data_writeback /dev/md2
tune2fs 1.44.1 (24-Mar-2018)

root@XiaoCai-SX63 ~ # tune2fs -l /dev/md2 | grep "Default mount options"
Default mount options: user_xattr acl

解决。

感谢

Telegram: @breakertt