問題描述 我在我的一台運行20.04的ubuntu服務器上遇到問題:沒有剩餘磁盤空間。 我不知道占用空間的是什麽。是否有一個命令列出當前目錄的大小,所以我可以遍曆並最終占用占用所有空間的目錄?
最佳解決方案和Linux一樣,完成工作的方法不止一種。但是,如果您需要從CLI執行此操作,這是我首選的方法: 我首先以root用戶或sudo運行它: - du -cha --max-depth=1 / | grep -E "M|G"
複製代碼
grep是將返回的行限製為返回值為兆字節或千兆字節範圍的行。如果您的磁盤足夠大,您可以添加|T以包含太字節數量。您可能會在/proc,/sys和/或/dev上遇到一些錯誤,因為它們不是磁盤上的真實文件。但是,它仍應為root中的其餘目錄提供有效輸出。在找到最大的那個之後,你可以在該目錄中運行命令,以便縮小你的道路。因此,例如,如果/var是最大的,你可以這樣做下一個: - du -cha --max-depth=1 /var | grep -E "M|G"
複製代碼
這應該引導你解決問題! 其他考慮因素 雖然上麵的命令肯定會起到作用,但我在下麵的評論中有一些建設性的批評指出了你可以包括的一些事情。 我提供的grep可能導致如果目錄或文件的名稱具有大寫字母G或M,則偶爾會返回”K”值。如果您絕對不希望任何K值目錄顯示,則您需要啟動正則表達式遊戲更具創造性和複雜性。例如grep -E "^[0-9\.]*[MG]" 如果你知道哪個驅動器是問題,並且它上麵有其他安裝的驅動器,你不想浪費時間,包括在搜索中,你可以將-x標誌添加到您的du命令。該標誌的手冊頁描述: - -x, --one-file-system
- skip directories on different file systems
複製代碼
您可以對du命令的輸出進行排序,以使最高值位於底部。隻需將其附加到命令的末尾:| sort -h
次佳解決方案您可以使用ncdu。它工作得很好。
第三種解決方案我用這個命令 - sudo du -aBM -d 1 . | sort -nr | head -20
複製代碼
偶爾,我需要從/目錄運行它,因為我已經在奇怪的位置放置了一些東西。
第四種方案關於如何找到占據大部分空間的目錄,已經有很多很好的答案。如果你有理由相信很少有大文件是主要問題,而不是很多小文件,你可以使用像
這樣的東西。
第五種方案我不知道Ubuntu並且無法檢查我的答案但是根據我很久以前作為unix管理員的經驗在這裏發布我的答案。 找出哪些文件係統空間不足
將列出所有文件係統,它們的大小和可用空間。如果您調查具有足夠空間的文件係統,您隻會浪費時間。假設完整的文件係統是/myfilesystem。如果在/myfilesystems的子目錄中安裝了文件係統,請檢查df輸出。如果是這樣,以下speps必須適應這種情況。 找出這個文件係統的文件使用了多少空間
-x選項可用於保證僅考慮作為此文件係統成員的文件。某些Unix變體(例如Solaris)不知道du的-x選項。然後,您必須使用一些變通方法來查找文件係統的du。 現在檢查可見文件的du是否大約是df顯示的已用空間的大小。如果是這樣,您可以開始查找/myfilesystem文件係統的大文件/目錄以進行清理。 找到目錄/…/dir使用的最大子目錄 - du -sk /.../dir/*|sort -n
複製代碼
-k選項強製du以千字節為單位輸出sie而不使用任何單位。這可能是某些係統的默認設置。然後你可以省略這個選項。最大的文件/子目錄將顯示在輸出的底部。 如果您找到了不再需要的大文件/目錄,則可以以適當的方式將其刪除。不要打擾輸出頂部的小目錄。如果刪除它們將無法解決您的問題。如果仍然沒有足夠的空間,則可以在列表底部顯示的larges子目錄中重複步驟4。
但是如果du輸出大約不是df顯示的可用空間會發生什麽? 如果du輸出較大,那麽您錯過了安裝另一個文件係統的子目錄。如果du輸出小得多,則som文件不會顯示在任何目錄中。他的現象可能有不同的原因。 某些進程正在使用已刪除的文件。因此,這些文件已從目錄中刪除,du無法看到它們。但對於文件係統,它們的塊仍然在使用,直到進程關閉文件。您可以嘗試找出相關進程(例如使用lsof)並強製它們關閉此文件(例如,通過停止應用程序或通過終止進程)。或者您隻是重啟機器。 目錄中的文件不再可見,因為在其父目錄之一上安裝了另一個文件係統。所以,如果你有一個文件/myfilesysem /subdir /bigfile,現在在/myfilesystem /subdir上安裝另一個文件係統,那麽你就再也看不到這個文件了
將報告一個不包含/myfilesystem /subdir /bigfile大小的值。找出這些文件是否存在的唯一方法是卸載/myfilesystem /subir並檢查 - ls -la /myfilesystem/subdir
複製代碼
如果它包含文件。 可能有特殊類型的文件係統在磁盤上使用/保留ls命令不可見的空間。您需要使用特殊工具來顯示它。
除了使用du命令的這種係統方式之外,您還可以使用其他一些方法。因此,您可以使用find命令查找比您提供的值大的文件,您可以搜索大於您提供的某個值或新創建的文件或具有特殊名稱的文件(例如* .log,core,*帶.trc)。但是你總是應該按照1中的描述做一個df,這樣你才能使用正確的文件係統
第六種方案它可以讓您快速查看任何文件夾中使用磁盤空間的內容。
第七種方案如果尚未執行此操作,請嘗試使用sudo apt-get autoremove刪除未使用的文件
第八種方案(找目錄總容量)我經常使用這個
或是切到該目錄執行(馬上找到該目錄佔據多少容量)
- du -h --exclude=virtfs --max-depth=1 | egrep 'G|T'
複製代碼
然後,如果我找到一些大文件夾,我會切換到它並進行進一步調查
如果需要,您也可以自動排序
第九種方案不是一個真正的答案 – 而是一個附錄。 你的空間很難,無法從@erman的回答中安裝ncdu。 一些建議 sudo apt clean all刪除已下載的包。安全 sudo rm -f /var/log/*gz清除日誌文件超過一周或兩周 – 不會刪除更新/當前日誌。非常安全 sudo lsof | grep deleted列出所有打開的文件,但過濾到已從磁盤中刪除的文件。公平安全 sudo rm /tmp/*刪除一些臨時文件 – 如果某些東西正在使用它們,你可能會破壞一個進程。真的不安全
那個人可能會返回這樣的行: - lsof | grep deleted
- init 1 root 9r REG 253,0 10406312 3104 /var/lib/sss/mc/initgro ups (deleted)
- salt-mini 4532 root 0r REG 253,0 17 393614 /tmp/sh-thd-1492991421 (deleted)
複製代碼
初始化行無法做太多,但第二行建議salt-minion打開一個已刪除的文件,一旦服務重啟關閉了所有文件句柄,就會返回磁盤塊。 這裏的其他常見嫌疑人將包括syslog /rsyslog /syslog-ng,squid,apache或您的服務器運行的任何“重”的進程。
第十種方案我發現像Filelight這樣的工具的輸出特別有價值,但是,在您的情況下,在服務器上通常沒有安裝GUI,但du命令始終可用。 我通常做的是: 將du輸出寫入文件(du / > du_output.txt); 將文件複製到我的機器上; 使用DuFS將”mount”輸出到臨時目錄中的du;根據du輸出,DuFS使用FUSE創建虛擬文件係統(=實際上沒有創建文件,這都是假的); 在此臨時目錄上運行Filelight或其他GUI工具。
免責聲明:我寫過dufs – 正是因為我經常要找出無頭機器上的什麽占用磁盤空間。
參考文章
|