我在某雲上有一臺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系統重裝調整完畢!