我在某云上有一台linux服务器,安装的是Centos7。在这台服务器上玩了一下Docker和Docker-Compose容器和容器编排。用docker-compose安装了一个Nginx和redis、mongodb的环境,跑了一个内部开发的调用接口。一直工做还算正常,因为是内部的测试服务器,系统的安装以及使用,并无多想过是否合理。也一直没有以为有啥大问题。php
但是有一天,我又上去玩容器,打算装一个git的guns版本。结果在安装过程当中,忽然提示我没有磁盘空间了。个人思惟仍是在windows服务器上的思惟,查一查空间都被谁用了,而后看看能不能删除点什么。因而,我抱着这样的目的开始查找linux下的命令,df和du什么的。发现/var/log/下有很多日志文件。仔细查看了下,彷佛占了很多空间。我想删除点日志应该没啥大影响,因此,就专门挑大的日志文件进行了删除,一会儿删了好些个。而后,我再一次查看磁盘,哈哈空间又有了。因此回到数据盘上接着弄,这里个人数据盘是单独挂载在一个/data的目录下的。html
但是,随后问题就开始出现了:显示数据盘上的目录忽然访问失败了,我想有些异常,就重启机器下吧,windows下不都这么干吗。因而,我reboot命令敲下,但是这一次关机却迟迟没法关闭,对linux熟悉的人可能看到这里要偷笑了。我把重要的日志都干掉了,swap盘上的内存数据和日志配合,极可能没法正确写回磁盘,因此关机操做挂起来了。这里可能还有童鞋笑话我,你怎么能删的掉日志文件,很不幸的我告诉你,我一直在用root的身份执行命令。唉,这就是无知啊。前端
随后的问题更严重了,因为迟迟没法正常关闭,我只能在云主机上点击断电关机。虽然云主机上的断电操做也是虚拟化的操做方式。可是随着断电操做的执行,linux终于又开始启动了,可是启动过程当中开始出现了错误,最后虽然启动起来了,我却发现数据盘自动挂载失败了。因而,我尝试手动挂载数据盘,但是竟然一样挂载不上,我开始慌了,里面的程序和数据但是有用的啊,有没有备份呢?脑子开始飞速地评估最坏的结果是什么。linux
我也开始联系云主机公司的客服人员,咨询他们该如何处理。谈到这,各位看客们有什么感触了吗?git
经过一些列的咨询和问题反馈,我也上传了错误提示:redis
经过查看系统日志,看到了红色的错误的日志提醒:mongodb
最终,云主机的工做人员建议我先卸载数据盘,而后从新挂载磁盘分区,若是不行,则使用xfs_repair命令去修复文件系统。虽然我又反复咨询这样的修复是否会丢失数据,获得的结果是颇有可能有数据的丢失。无奈和没法以后,我按照这样的指导去操做了下,如下是截图:docker
结果证实:的确修复成功,可是是加了xfs_repair -L参数的修复,重修挂载后,发现一个重要的项目目录完全不见了,我后来从found+lost目录里找回来一些文件。可仍是丢掉了一些重要的配置文件和前端代码。不过,幸亏开发环境上还有备份,只不过配置得要重来再来一遍调试了,非常麻烦。windows
我一直在复盘这次事故的教训。我以为最根本的缘由是系统磁盘为何会满了。为何删除日志文件会有这么大的影响。抱着这些疑问我在网上搜寻了一阵。却无法找到问题的答案,因而,我翻箱倒柜地找出当年买的一本《鸟哥的linux私房菜》的书翻了起来,我决定仔细看一下linux有关磁盘和日志部分的内容,但愿在里面找到答案。结果仔细阅读了相关章节后,我忽然发现本身在使用linux的过程当中犯了不少的错误理解和入坑的想固然的操做。因此,整理了这篇的后半部分,以提醒本身和后来人,必定要重视linux原理和底层的知识,不要只想着找命令解决问题,这样急功近利的思路终会给你一个当头棒喝的教训。centos
====================================================================
如下为这次事故复盘后的总结:
(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)真出现磁盘文件系统的问题,修复流程以下:
(4)linux系统的监控,实际上对日志的自动分析很重要,在鸟哥的书中就给过一个他本身写的监控程序,下载地址是:
总之,此次是我学习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系统重装调整完毕!