Centos7下数据盘访问失败后的反思(xfs,mount,日志,系统盘满)

2,392 阅读7分钟

我在某云上有一台linux服务器,安装的是Centos7。在这台服务器上玩了一下Docker和Docker-Compose容器和容器编排。用docker-compose安装了一个Nginx和redis、mongodb的环境,跑了一个内部开发的调用接口。一直工作还算正常,由于是内部的测试服务器,系统的安装以及使用,并没有多想过是否合理。也一直没有觉得有啥大问题。

可是有一天,我又上去玩容器,打算装一个git的guns版本。结果在安装过程中,突然提示我没有磁盘空间了。我的思维还是在windows服务器上的思维,查一查空间都被谁用了,然后看看能不能删除点什么。于是,我抱着这样的目的开始查找linux下的命令,df和du什么的。发现/var/log/下有不少日志文件。仔细查看了下,似乎占了不少空间。我想删除点日志应该没啥大影响,所以,就专门挑大的日志文件进行了删除,一下子删了好些个。然后,我再一次查看磁盘,哈哈空间又有了。所以回到数据盘上接着弄,这里我的数据盘是单独挂载在一个/data的目录下的。

可是,随后问题就开始出现了:显示数据盘上的目录突然访问失败了,我想有些异常,就重启机器下吧,windows下不都这么干嘛。于是,我reboot命令敲下,可是这一次关机却迟迟无法关闭,对linux熟悉的人可能看到这里要偷笑了。我把重要的日志都干掉了,swap盘上的内存数据和日志配合,很可能无法正确写回磁盘,所以关机操作挂起来了。这里可能还有童鞋笑话我,你怎么能删的掉日志文件,很不幸的我告诉你,我一直在用root的身份执行命令。唉,这就是无知啊。

随后的问题更严重了,由于迟迟无法正常关闭,我只能在云主机上点击断电关机。虽然云主机上的断电操作也是虚拟化的操作方式。但是随着断电操作的执行,linux终于又开始启动了,但是启动过程中开始出现了错误,最后虽然启动起来了,我却发现数据盘自动挂载失败了。于是,我尝试手动挂载数据盘,可是居然同样挂载不上,我开始慌了,里面的程序和数据可是有用的啊,有没有备份呢?脑子开始飞速地评估最坏的结果是什么。

我也开始联系云主机公司的客服人员,咨询他们该如何处理。谈到这,各位看客们有什么感触了吗?

通过一些列的咨询和问题反馈,我也上传了错误提示:

通过查看系统日志,看到了红色的错误的日志提醒:

最终,云主机的工作人员建议我先卸载数据盘,然后重新挂载磁盘分区,如果不行,则使用xfs_repair命令去修复文件系统。虽然我又反复咨询这样的修复是否会丢失数据,得到的结果是很有可能有数据的丢失。无奈和无法之后,我按照这样的指导去操作了下,以下是截图:

结果证明:的确修复成功,但是是加了xfs_repair -L参数的修复,重修挂载后,发现一个重要的项目目录彻底不见了,我后来从found+lost目录里找回来一些文件。可还是丢掉了一些重要的配置文件和前端代码。不过,幸好开发环境上还有备份,只不过配置得要重来再来一遍调试了,很是麻烦。

我一直在复盘此次事故的教训。我觉得最根本的原因是系统磁盘为什么会满了。为什么删除日志文件会有这么大的影响。抱着这些疑问我在网上搜寻了一阵。却没法找到问题的答案,于是,我翻箱倒柜地找出当年买的一本《鸟哥的linux私房菜》的书翻了起来,我决定仔细看一下linux有关磁盘和日志部分的内容,希望在里面找到答案。结果仔细阅读了相关章节后,我突然发现自己在使用linux的过程中犯了很多的错误理解和入坑的想当然的操作。所以,整理了这篇的后半部分,以提醒自己和后来人,一定要重视linux原理和底层的知识,不要只想着找命令解决问题,这样急功近利的思路终会给你一个当头棒喝的教训。

====================================================================

以下为此次事故复盘后的总结:

(1)不要一直使用root命令去执行一切操作。

因为root是天神身份,想删什么基本上都可以删除掉,不然你也可以试试在根目录上执行 rm -rf . 试试,呵呵。因为我一直使用root去操作,删除日志这些照理只能root删除,普通用户是不能删除的。

(2)系统盘空间为什么会满掉?

我的系统盘有20个G,虽然不大,照理和40G的数据盘配合使用,也不至于很快就满了。我事后总结了下,原因有这几点:

A. 我的数据盘没有分区挂载给linux的几个常用目录,譬如:/var /usr /home目录。 /usr是安装软件时的常用目录,相当于是windows下的program files目录,/var则是可变的数据目录,也是数据膨胀的主要目录

阿里云ECS服务器挂载磁盘到已有home目录下 blog.csdn.net/zhou_fan_xi…

B. 容器是占用空间的大头,容器和容器的数据也都在/var/lib/目录下,容器也应该放在数据盘上

在CentOS 7 更改Docker默认镜像和容器的位置 www.linuxidc.com/Linux/2017-…

C. 系统的日志和磁盘和虚拟内存swap盘都有很大的关系。关机前sync的命令会把内存盘上的数据写回磁盘上,如果要想不要日志文件挤满系统,也应该给日志数据设置轮替删除的调度任务,或者存储到别的盘上去。

(3)真出现磁盘文件系统的问题,修复流程如下:

www.cnblogs.com/yuzhaoxin/p…

(4)linux系统的监控,实际上对日志的自动分析很重要,在鸟哥的书中就给过一个他自己写的监控程序,下载地址是:

linux.vbird.org/download/in…

总之,这次是我学习linux以来得到的一次重大教训,也督促我对linux进行了一些深入的了解,希望以后使用linux的路途会越来越顺利。和大家共勉!

                                               2019-08-17 于杭州 菲哥

按照以上总结的方法,我快速重装了centos7系统,并对数据盘进行了分区,把数据盘分成了扩展分区,并在扩展分区内分了三个区,分别为:/dev/vdb5 10个G,用的ext4的文件系统; /dev/vdb6 24个G,用的xfs的文件系统,剩下6个G,分给了swap分区使用。 并且将:/dev/vdb5挂载到了/home目录,/dev/vdb6挂载到了/var目录。然后,迅速恢复安装了Docker和docker-compose软件,当容器创建好,执行df -h后,查看到了如下的容量占比结果。可以看出容器增加的占用是在/var目录里,也就放置在了数据盘上,不会影响系统盘的空间。以后,如果/usr占用太大,还可以挂在额外的数据盘,把/usr上的东西挪到新增的数据盘上,系统盘还是可以保持不受空间变化的太大影响。

至此,我的centos7系统重装调整完毕!