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