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

2021-04-07T01:24:00
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »

背景

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

环境

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

排查

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

/etc/fstab 里的内容更改为

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

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

2. 查看日志

# 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

里面提到了

fsck.ext4 -f /dev/md2

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

3. 进入 Recsue 再次尝试 fsck

继续尝试

fsck.ext4 -f /dev/md2

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

推测

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

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

后续的一个小毛病

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 不显示。

解决

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

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 模式

查看默认模式

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

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