近日,筆者在一臺(tái)測試服務(wù)器中進(jìn)行實(shí)驗(yàn),需要從網(wǎng)絡(luò)中其他服務(wù)器上拷貝一些文件。該服務(wù)器使用CentOs 6.0操作系統(tǒng)。執(zhí)行scp遠(yuǎn)程文件拷貝命令后,文件沒有拷貝成功,出現(xiàn)報(bào)錯(cuò)信息“No space left on device”。根據(jù)報(bào)錯(cuò)信息,筆者使用命令“df –h”檢查磁盤空間使用情況,發(fā)現(xiàn)磁盤空間不足。磁盤已使用18GB,可用空間為0(如圖1)。
圖1 檢查磁盤空間使用情況
圖2 查找大于2GB文件
該服務(wù)器中平時(shí)只是用作實(shí)驗(yàn)使用,并沒有復(fù)制過大文件。筆者猜測,應(yīng)該是日志類文件不斷增長,造成的磁盤空間不足。如何知道是哪些文件占用了空間?于是筆者在根目錄下,使用:find / -size +2G命令,該命令的意思是,查找文件大小大于2GB的問題。執(zhí)行命令后,查找到如圖2所示的結(jié)果。
筆者對(duì)查找結(jié)果進(jìn)行了分析,其中/proc/kcore文件是一個(gè)由內(nèi)核產(chǎn)生的虛文件,其大小與內(nèi)存大致相當(dāng),但并不實(shí)際占用硬盤大小。而/var/log目錄下的“messages”文件經(jīng)檢查竟高達(dá)9.8GB,這個(gè)文件幾乎占用了近54%的硬盤空間。使用more命令查看messages文件,發(fā)現(xiàn)文件內(nèi)容是不斷出現(xiàn)的Keepalived_vrrp報(bào)錯(cuò)信息。
原來該服務(wù)器之前曾用作 過“LVS + Keepalived”高可用負(fù)載均衡集群實(shí)驗(yàn),實(shí)驗(yàn)完成后筆者忘記將相關(guān)數(shù)據(jù)刪除,于是該配置程序一直在運(yùn)行。而該服務(wù)器的網(wǎng)絡(luò)配置后續(xù)因?yàn)槠渌麑?shí)驗(yàn)的需要進(jìn)行了更改。Keepalived根據(jù)之前的配置檢測到網(wǎng)絡(luò)通訊錯(cuò)誤,因此不斷向系統(tǒng)日志文件/var/log/messages中上報(bào)錯(cuò)誤信息,導(dǎo)致該日志文件不斷擴(kuò)大,最終將硬盤空間占滿。
筆者通過“find”命令將占用磁盤空間巨大的文件找到,這種方法雖然快速簡單,但卻并不嚴(yán)謹(jǐn)。該命令適用于查找匹配條件的巨大文件,卻無法實(shí)現(xiàn)對(duì)目錄大小情況的查找。因此,還需要有更嚴(yán)謹(jǐn)?shù)姆椒?,查找磁盤空間占用的問題。
另外,雖然占用磁盤空間的巨大文件被找到,但如何安全有效地釋放磁盤空間呢?
本文將探討磁盤空間占用情況查詢方法和磁盤空間釋放方法。
在 Linux 系統(tǒng)中,“find”命令被用來在指定目錄下查找文件,使用參數(shù)“-size”可用來查找符合指定文件大小的文件。例如,用find /-size +2G這條命令,就是在根目錄下查找文件大小大于2GB的文件。使用這種方法不用過多考慮系統(tǒng)中目錄結(jié)構(gòu),能直接找到匹配條件的巨大文件。該命令可以針對(duì)文件大小進(jìn)行查找,但不能查找目錄的大小情況。因此,當(dāng)遇到磁盤空間不是被巨大文件所占用,而是被大量的小文件占用的情況,“find”命令就無法適用了。
“du”命令是用來統(tǒng)計(jì)目錄(或文件)所占磁盤空間的大小。該命令不僅可以統(tǒng)計(jì)文件的大小,還可以統(tǒng)計(jì)目錄的大小。如果再通過管道符配合排序命令,可以更好地提高使用效果。例如,使用du –a|sort –n可以快速查找出文件和目錄占用磁盤空間的情況,其中-a參數(shù)是顯示目錄中所有目錄、子目錄以及文件的大小情況,如果不使用該參數(shù),則只顯示目錄和子目錄的大小。通過管道符執(zhí)行的sort命令是對(duì)du命令執(zhí)行的結(jié)果進(jìn)行排序,-n參數(shù)是指將文件按大小進(jìn)行排序。
圖3 磁盤空間并未得到釋放
圖4 查詢被刪除軟件
通過比較可以發(fā)現(xiàn),對(duì)于查看磁盤空間的占用情況,使用du命令比find命令要好得多。通過配合排序命令,不僅列出了大文件,而且也列出了大目錄,適用于各種磁盤空間占用問題的查找。
messages文件是核心系統(tǒng)日志文件,它包含了系統(tǒng)啟動(dòng)時(shí)的引導(dǎo)消息,以及系統(tǒng)運(yùn)行時(shí)的其他狀態(tài)消息。I/O錯(cuò)誤、網(wǎng)絡(luò)錯(cuò)誤和其他系統(tǒng)錯(cuò)誤,都會(huì)記錄到這個(gè)文件中。該文件占用了大量的磁盤空間,為了快速解決問題,筆者考慮直接將messages文件刪除。但在使用rm命令將該文件刪除后,檢查發(fā)現(xiàn)磁盤空間并未得到釋放(如圖 3)。
經(jīng)分析,磁盤空間未得到釋放的原因是,在Linux系統(tǒng)中,通過rm或者文件管理器刪除文件,將會(huì)從文件系統(tǒng)的目錄結(jié)構(gòu)上解除鏈接(unlink)。然而,如果文件是被打開的(有一個(gè)進(jìn)程正在使用),那么進(jìn)程將仍然可以讀取該文件,磁盤空間也一直被占用。因此必須將使用messages文件的進(jìn)程kill掉或者重新啟動(dòng),才能將磁盤空間釋放。
使 用“l(fā)sof |grep deleted”命令查詢被刪除的軟件,發(fā)現(xiàn)messages文件是由rsyslogd進(jìn)程所占用,并且目前刪除的文件還在硬盤中,但是被標(biāo)注了已刪除“(deleted)”(如圖 4)。
在服務(wù)器上重啟rsyslog進(jìn)程后,經(jīng)查詢發(fā)現(xiàn)磁盤已經(jīng)有9.8GB的可用空間。證明之前是由于rsyslog進(jìn)程占用的原因,造成messages文件雖然已被執(zhí)行刪除,但磁盤空間沒有得到釋放。
lsof(listopen files)是一個(gè)列出當(dāng)前系統(tǒng)打開文件的工具,它可以列出某個(gè)進(jìn)程打開的所有文件信息。在Linux系統(tǒng)中,任何事務(wù)都以文件的形式存在,打開文件或新建文件,內(nèi)核向進(jìn)程會(huì)返回一個(gè)文件描述符(file descriptor),文件描述符是指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開文件的記錄表。在文件描述符中,包含了大量應(yīng)用程序的信息。利用lsof命令,可以查看文件描述符列表,為系統(tǒng)排錯(cuò)和檢測提供幫助。
Linux內(nèi)核提供一種通過proc文件系統(tǒng)在運(yùn)行時(shí)訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu),改變內(nèi)核設(shè)置的機(jī)制。這是一種內(nèi)核與內(nèi)核模塊用來向進(jìn)程(process)發(fā)送信息的機(jī)制。proc文件系統(tǒng)一般掛載在/proc下,是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口,內(nèi)核部件可以通過該文件系統(tǒng)向用戶空間提供接口來提供查詢信息、修改軟件行為。
/proc目錄下有一些以數(shù)字命名的目錄,它們是進(jìn)程目錄。系統(tǒng)中當(dāng)前運(yùn)行的每一個(gè)進(jìn)程都有對(duì)應(yīng)的一個(gè)目錄在/proc下,以進(jìn)程的PID號(hào)為目錄名,它們是讀取進(jìn)程信息的接口。在 /proc/
圖5 被刪除文件信息
本例中,rsyslogd進(jìn)程的PID為21956,因此,在/proc/21956/fd目錄中保存有rsyslogd進(jìn)程打開messages的所有文件描述符。
當(dāng)系統(tǒng)中的某個(gè)文件被意外地刪除了,只要這個(gè)時(shí)候系統(tǒng)中還有進(jìn)程正在訪問該文件,那么我們就可以通過lsof查詢?cè)撐募男畔?,并?proc目錄下恢復(fù)該文件的內(nèi)容。
如圖5所示,根據(jù)lsof命令查到的結(jié)果可知,被刪除的文件目前為/proc/21956/fd/2。使用ls –l命令查看可以驗(yàn)證該文件就是被刪除的messages文件。
使用命令“cat /proc/21956/fd/2 > /var/log/messages”即可將該被刪除的文件恢復(fù)。
如前所述,在Linux中刪除文件,如果磁盤空間沒有得到釋放,應(yīng)該kill掉文件占用進(jìn)程或者重啟該進(jìn)程。對(duì)于日志類的文件,其實(shí)可以使用這個(gè)命令cat /dev/null > /var/log/messages能夠快速將文件清空,而不用重啟進(jìn)程。
此命令是將該文件內(nèi)容清空,而不是刪除該文件,不會(huì)產(chǎn)生新的進(jìn)程,因此不用重啟進(jìn)程就可以達(dá)到釋放磁盤空間的效果。
磁盤是計(jì)算機(jī)的主要存儲(chǔ)設(shè)備。磁盤空間不足,會(huì)直接影響系統(tǒng)的運(yùn)行,造成磁盤無法讀寫,應(yīng)用程序無法執(zhí)行等故障。使用正確的方法進(jìn)行查詢和處理,可以快速解決磁盤空間的占用問題。本文通過對(duì)服務(wù)器磁盤空間不足問題的解決,介紹了磁盤空間占用情況的查詢方法,日志類文件的清空方法,以及對(duì)文件刪除后因被進(jìn)程占用而無法釋放磁盤空間的情況進(jìn)行了分析,對(duì)相關(guān)的lsof命令和proc文件系統(tǒng)也進(jìn)行了相應(yīng)的介紹。通過對(duì)實(shí)際問題的處理和分析,掌握了磁盤空間不足問題的解決方法。