![f1af17e4b3a0684ed5064718e1982c7c.png](https://i-blog.csdnimg.cn/blog_migrate/8b36b74dceb5ec7f6b48ba426a94f14c.jpeg)
记录一个线上遇到的坑。
问题还原
有一个只读共享盘,它的文件系统是 xfs。它会被并发挂载到不同的容器上,数量规模是上百个吧。有一天运维人员发现这个盘无法挂载了,而且很奇怪的是:有一部分容器能挂载上,另外一部分容器挂载不上。报错信息提示文件系统有损坏。
问题原因
这很奇怪,文件系统损坏怎么会出现一部分容器能挂载呢?不应该是全部都有问题吗?
这个只读共享盘是一个克隆盘,它是由另外一个快照创建出来的。根据对比发现这个盘的数据与快照有几十 M 的数据差异。这就很诡异了,只读的盘为什么会有数据差异?!
尝试利用快照再创建一个新的盘,此时的盘与快照没有数据差异。然后用这个盘挂载成只读盘后发现有了一些数据差异。不是吧?!只读挂载都能往下写数据?!
是的!
这个挂载动作会往下写数据。如果在并发的场景下是会将盘里的数据写花,这个问题太坑了。我们之前完全没有注意这个点,以为只读挂载是不会下数据的。
接着测试 ext4 格式的盘,只读挂载不会写数据。可以断定这是文件系统本身所为,与底层存储系统应该没有关系。再去查看 xfs 系统的 mount 源码,发现它在 mount 过程中会初始化 log 并下刷数据。虽然它不会写元数据区和数据区,但它由于是一个日志文件系统,每一步都会记录到日志里面。
知道问题原因就好办了:要么换文件系统格式,要么修改 xfs 这个 mount 部分源码。仅供各位踩坑小伙伴参考。