在本文中,您將了解到監視磁盤空間、發現究竟是哪些文件、用戶或應用程序占用了大部分的空間、以及如何使用配額和其他解決方案查找需要的信息的方法。
對於許多管理員來說,使用 df 工具可能有點像斷續的神經運動,因為它通過一個命令提供了所有文件系統中已使用的和可用的存儲空間的快照視圖。根據您的 UNIX 環境的不同,df 的缺省輸出可能包含各種不同的信息。
大部分現代的 df 變種都可以顯示磁盤空間、使用情況和可用性,通常還包括裝入點(有時包括設備)。例如,基於 BSD 的 Mac OS X 顯示如清單 1 所示的信息。
Filesystem 512-blocks Used Avail Capacity Mounted on /dev/disk0s2 268435456 119741344 148182112 45% / devfs 195 195 0 100% /dev fdesc 2 2 0 100% /dev <volfs> 1024 1024 0 100% /.vol /dev/disk0s3 43474520 7251448 36223072 17% /Volumes/Untitled
請注意,所顯示的大小是以 512 字節塊為單位,而不是千字節。缺省情況下,幾乎所有傳統的 UNIX 操作系統都以 512 字節塊為單位報告大小,而不是千字節。要獲得以 1K 塊為單位的信息,可以使用 -k 命令行選項,如清單 2 所示。
$ df -k Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/disk0s2 134217728 59870704 74091024 45% / devfs 97 97 0 100% /dev fdesc 1 1 0 100% /dev <volfs> 512 512 0 100% /.vol /dev/disk0s3 21737260 3625724 18111536 17% /Volumes/Untitled
有些變種可能還支持可選的塊大小,如兆字節(使用 -m)和千兆字節(使用 -g),如清單 3 所示。
$ df -g Filesystem 1G-blocks Used Avail Capacity Mounted on /dev/disk0s2 128 57 70 45% / devfs 0 0 0 100% /dev fdesc 0 0 0 100% /dev <volfs> 0 0 0 100% /.vol /dev/disk0s3 20 3 17 17% /Volumes/Untitled
很顯然,在增大顯示的塊大小的同時,信息中的詳細級別也開始降低,但使用可選的大小是一種快速監視磁盤,特別是超大容量磁盤的很有用的方法。其他版本的 df 工具(特別是 Solaris),缺省情況下將報告空塊和文件可用性信息。大部分文件系統都具有能夠存儲文件的上限數值(該數值很大,以至於通常不會達到該上限),所以有可能整個系統填滿了文件,還有可用磁盤容量但卻不能再存儲任何文件了。
您可以在清單 4 中看到 Solaris 的缺省輸出示例。
$ df / (/dev/dsk/c0t0d0s0 ):14877208 blocks 914042 files /devices (/devices ): 0 blocks 0 files /system/contract (ctfs ): 0 blocks 2147483618 files /proc (proc ): 0 blocks 16109 files /etc/mnttab (mnttab ): 0 blocks 0 files /etc/svc/volatile (swap ): 5737216 blocks 147177 files /system/object (objfs ): 0 blocks 2147483532 files /usr (/dev/dsk/c0t0d0s3 ): 9076010 blocks 863695 files /dev/fd (fd ): 0 blocks 0 files /var (/dev/dsk/c0t0d0s4 ): 8110796 blocks 483714 files /tmp (swap ): 5737216 blocks 147177 files /var/run (swap ): 5737216 blocks 147177 files /export/home (/dev/dsk/c0t0d0s7 ):69362510 blocks 4272812 files
所有的 df 變種都接受一個目錄或路徑,然后顯示包含該路徑的文件系統的磁盤空間信息。例如,下面顯示了應該如何獲得根文件系統的空間信息:
$ df -k / Filesystem kbytes used avail capacity Mounted on /dev/dsk/c0t0d0s0 7644629 206026 7362157 3% /
使用 df 的輸出
df 工具實際上是 disk free 的縮寫,並且這也正是該工具所顯示的內容。如果再次查看某個示例輸出,您可以從中提取一些特別重要的元素:
Filesystem kbytes used avail capacity Mounted on /dev/dsk/c0t0d0s7 35611388 930133 34325142 3% /export/home
第一列通常具有與塊大小數據相對應的標題,它顯示了磁盤的總大小。used 列顯示了該文件系統或設備上已使用的塊數。avail 列顯示了該文件系統上尚未使用的(可用的)塊數。
capacity 列提供了總大小中已使用的磁盤空間所占的百分比。這個信息本身可以提供關於可用空間的直觀指示。
缺省情況下,UNIX 所創建的文件系統中百分之九十的容量可用於存放用戶數據。剩下的百分之十由系統保留,以便 root 用戶執行緊急維護工作。如果用戶試圖添加或創建超出該限制的文件,那么將返回一個錯誤(超出文件系統空間)。
有了這個緊急維護空間,就可以利用它對一塊已滿的磁盤進行恢復。例如,作為管理員,您可以使用這個空間來創建快速備份,或對現有的數據進行壓縮而無需為達到該目的使用輔助文件系統。您可以使用 tunefs 工具或在創建文件系統時,調整保留的空閑空間的大小。對於大容量磁盤來說,這是至關重要的,因為其中百分之十的緩沖區可能等於許多個 GB 的潛在空間。通常好的做法是至少保留百分之一的空間,以便在完全用盡存儲空間之前,提供最低限度的緩沖區空間。在深入研究這個問題之前,特別是如果已經使用了大量的磁盤空間,您需要確定到底是誰使用了所有的這些空間。
使用 du
du 命令並不是顯示磁盤的空閑空間,而是顯示磁盤使用情況的信息。du 工具用於確定文件和目錄的磁盤使用情況。要使用這個工具,改變到一個目錄,然后運行該工具:
$ cd /var $ du 16 ./lost+found 4 ./sadm/install/admin 22 ./sadm/install/logs 28448 ./sadm/install 4 ./sadm/pkg/SUNWocfd/install 4 ./sadm/pkg/SUNWocfd/save/pspool/SUNWocfd/install 16 ./sadm/pkg/SUNWocfd/save/pspool/SUNWocfd 18 ./sadm/pkg/SUNWocfd/save/pspool 20 ./sadm/pkg/SUNWocfd/save 28 ./sadm/pkg/SUNWocfd 4 ./sadm/pkg/SUNWcsu/inst ...
經過了適當的調整。缺省情況下,du 將顯示當前或指定的目錄下每個文件和目錄的文件使用情況。得到的值是文件的大小,單位為該系統中的缺省塊大小,與 df 所使用的單位相同。可能是也可能不是 1K,而使用 -k 命令行選項,您可以強制以 1K 塊為單位進行顯示。
使用該工具時,特別是在用戶目錄中使用該工具時,請特別小心,因為所顯示的信息中不包含隱藏 文件,換句話說,具有單點號前綴的那些文件和目錄。您可能希望使用下面的代碼行,在用戶目錄中獲得所有的摘要信息:
$ du -sk * .[a-zA-Z0-9]*
du 命令的最后一個非常有用的選項是 -d,該選項可以防止 du 命令超過文件系統邊界。例如,要確定根文件系統而不是任何其他的文件系統的磁盤使用情況,您可以使用 -d 選項.
查找一個特定用戶的磁盤使用情況
要查找某個用戶所使用的磁盤空間,在使用 find 命令的同時,您需要結合使用 du 命令以僅報告特定用戶的磁盤使用情況。
$ find . -user mc -type f -exec du -k {} \;
-user 選項允許您指定 find 將僅報告屬於特定用戶的文件。-type 選項強制 find 僅返回特定類型(在本示例中是文件)項目的路徑,這樣可以防止 du 包含目錄,因為這些目錄可能屬於某個用戶,但其中卻包含了許多用戶的文件。然后,對於查找到的每個路徑,執行 du 命令以報告磁盤使用情況。
要獲得摘要信息,換句話說,即某個特定用戶所使用的總空間,您可以使用 awk 對該信息進行總計,並打印出最后的值:
$ find . -user mc -type f -exec du -k {} \;|awk '{ s = s+$1 } END { print "Total used: ",s }' Total used: 123721
對於組,您可以根據相同的原則對 find 使用 -group 選項:
$ find . -group mcslp -type f -exec du -k {} \;|awk '{ s = s+$1 } END { print "Total used: ",s }' Total used: 542485
使用配額
配額系統以文件系統為單位,自動監視該文件系統中各個用戶的磁盤使用情況。配額環境不僅允許您監視磁盤的使用情況,而且還允許設置相應的使用限制,在超過使用限制時提供警告或者更直接地禁止用戶使用超過所分配的配額值的磁盤空間。下限(發出警告)稱為軟限制,而上限(禁止創建超過該限制的文件)稱為硬限制。有些系統可能還允許您控制每個用戶所擁有的文件的數目。
在您的計算機上啟動配額的確切方法取決於您所使用的操作系統。大多數 UNIX 系統在缺省情況下都包含配額的支持。Linux® 系統可能需要構建新的包含配額支持的內核。然而,通常大多數操作系統為每個文件系統使用一個稱為 quotas 的文件,其中包含了對每個用戶的空間使用限制。
要啟用配額,您首先需要創建該文件,並確保僅有 root 用戶可以編輯該配額文件:
$ touch /export/home/quotas $ chmod 600 /export/home/quotas $ quotaon /export/home $ edquota mc
然后,使用 quotaon 命令啟用配額功能,最后,您必須為每個用戶編輯適當的配額。可以使用 edquota 命令並指定相應的用戶來完成這項任務.
這將打開缺省的編輯器(或者 vi,如果您沒有設置可選的編輯器),其中包含一個用來設置配額值的簡單表格。在下面您可以看到,已為用戶 home 目錄文件系統啟用了配額,並且軟限制為 200,000KB,硬限制為 400,000KB。文件限制的設置為零,這表示沒有設置限制,用戶可以設置並創建任意數目的文件。
fs /export/home blocks (soft = 200000, hard = 400000) inodes (soft = 0, hard = 0)
如果您需要對多個用戶配置配額,那么可以首先為一個用戶設置配額,然后對 edquota 使用 -p 命令行選項。這將使用指定的用戶作為基礎來創建新的用戶。例如,要使用 mc 的設置為用戶名 slp、tw 和 sh 設置配額,請執行下面的命令:
$ edquota -p mc slp tw sh
使用配額進行文件限制警告
當用戶創建一個超過其軟限制的文件時,他們將會得到下面的警告:
quota_ufs: Warning: over disk limit (pid 1738, uid 101, inum 94, fs /export/home)
請注意,留給用戶 7 天的時間更正該問題,您可以使用 edquota -t 來更改這個期限。
如果用戶試圖創建超過硬限制的文件,那么系統將終止寫進程並根據相應的限制來截斷該文件:
$ mkfile 210000k overlimit quota_ufs: over hard disk limit (pid 1843, uid 101, inum 130, fs /export/home) overlimit: initialized 191873024 of 215040000 bytes: Disc quota exceeded
通過運行 quota 命令,任何用戶都可以檢查他們自己的配額限制和磁盤使用情況:
$ quota Over disk quota on /export/home, remove 199993K within 7.0 days
配額管理
使用 quota 命令,系統管理員可以檢查任何用戶的配額,您應該使用 -v 命令行選項以提供關於文件系統、使用情況和限制信息的完整報告
$ quota -v mc Disk quotas for mc (uid 101): Filesystem usage quota limit timeleft files quota limit timeleft /export/home 399993 200000 400000 6.9 days 151 0 0
要獲得某個文件系統中詳細描述所有用戶的磁盤和配額使用情況的報告,可以使用 repquota 命令,並指定要報告的文件系統
$ repquota -v /export/home /dev/dsk/c0t0d0s7 (/export/home): Block limits File limits User used soft hard timeleft used soft hard timeleft mc +- 399993 200000 400000 6.9 days 151 0 0
要確保配額信息保持最新,您應該使用 quotacheck 命令。這將利用用來報告配額信息的配額信息對文件存儲數據進行驗證。您應該使用 cron 來自動地運行這項任務,每天一次比較合適(因為這個過程是比較耗時的)。
配額系統提供了監視和自動管理的最佳組合,但是您應該注意啟用了配額的文件系統以及您所設置的限制,因為它們可能會妨礙用戶的工作,而不是控制他們的磁盤使用情況。
例如,與您進行的使用配置相比,程序員可能需要更多的空間來構建一個應用程序。通過提供一個不受限制的編譯區域(通過設置一個可選的臨時目錄),您可以在維持他們的 home 目錄配額的同時避開這個問題,或者在設置很高的硬限制(甚至可能是該文件系統的最大容量)的同時,設置合適的軟限制。
其結果應該是當達到軟限制時給出一個警告,而不會真正地實施硬限制。用戶應該仍然可以構建和創建臨時文件,但是因為在構建的過程中會刪除這些文件,所以不應該禁止用戶創建他們所需的文件。
配額還可以用來幫助完成監視任務,並提醒您關於特殊用戶帳戶的空間使用情況。我過去曾使用配額來監視 Web 用戶帳戶,即所謂的 nobody 帳戶和其他帳戶,以確保它們無法向不應具有訪問權限的文件系統中寫入文件。要完成這項任務,可以將您需要保護的文件系統和用戶的硬限制設置為 1KB。
自動監視
手動監視磁盤空間使用情況是可行的,但是您並不希望不停地運行 df(甚至 du)來確定已使用的或可用的磁盤空間。您可以使這個過程自動化,並且當可用空間降低到一定的級別時,自動地向管理員(或者管理員組)發送電子郵件。清單 10 中的腳本用來監視磁盤空間,您可以設置警告 (warninglimit) 和緊急情況 (lowlimit) 限制,以及進行檢查的文件系統的列表。
監視磁盤空間:
1 #!/bin/sh 2 3 warninglimit=500000 4 lowlimit=250000 5 6 filesystems="/export/data /export/home /" 7 8 for fs in $filesystems 9 do 10 size=`df -k $fs|grep $fs|awk '{ print $4; }'` 11 if [ $size -le $lowlimit ] 12 then 13 mailx -s "URGENT: Low disk space for $fs ($size)" 14 break 15 fi 16 if [ $size -le $warninglimit ] 17 then 18 mailx -s "WARNING: Low disk space for $fs ($size)" 19 fi 20 done
其中關鍵的一行是提取每個文件系統中空閑磁盤空間的大小:
size=`df -k $fs|grep $fs|awk '{ print $4; }'`
該腳本使用 df 僅提取了要進行 grep 的行,然后使用 awk 提取數據的第 4 列,該列是空閑空間的大小。
然后,您可以根據 warninglimit/lowlimit 來檢查空閑空間,並生成合適的錯誤。要避免系統同時發生下限和警告錯誤,該腳本首先檢查下限,並在嘗試測試警告之前使用 break 跳到循環中的下一個文件系統。