天天看點

Linux 監視磁盤空間和使用情況

在本文中,您将了解到監視磁盤空間、發現究竟是哪些檔案、使用者或應用程式占用了大部分的空間、以及如何使用配額和其他解決方案查找需要的資訊的方法。

對于許多管理者來說,使用 df 工具可能有點像斷續的神經運動,因為它通過一個指令提供了所有檔案系統中已使用的和可用的存儲空間的快照視圖。根據您的 unix 環境的不同,df 的預設輸出可能包含各種不同的資訊。

大部分現代的 df 變種都可以顯示磁盤空間、使用情況和可用性,通常還包括裝入點(有時包括裝置)。例如,基于 bsd 的 mac os x 顯示如清單 1 所示的資訊。

1

2

3

4

5

6

<code>filesystem    512-blocks      used     avail capacity  mounted on</code>

<code>/dev/disk0s2   268435456 119741344 148182112    45%    /</code>

<code>devfs                195       195         0   100%    /dev</code>

<code>fdesc                  2         2         0   100%    /dev</code>

<code>&lt;volfs&gt;             1024      1024         0   100%    /.vol</code>

<code>/dev/disk0s3    43474520   7251448  36223072    17%    /volumes/untitled</code>

  請注意,所顯示的大小是以 512 位元組塊為機關,而不是千位元組。預設情況下,幾乎所有傳統的 unix 作業系統都以 512 位元組塊為機關報告大小,而不是千位元組。要獲得以 1k 塊為機關的資訊,可以使用 -k 指令行選項,如清單 2 所示。

  

7

<code>$ df -k</code>

<code>filesystem    1k-blocks      used     avail capacity  mounted on</code>

<code>/dev/disk0s2  134217728  59870704  74091024    45%    /</code>

<code>devfs                97        97         0   100%    /dev</code>

<code>fdesc                 1         1         0   100%    /dev</code>

<code>&lt;volfs&gt;             512       512         0   100%    /.vol</code>

<code>/dev/disk0s3   21737260   3625724  18111536    17%    /volumes/untitled</code>

  有些變種可能還支援可選的塊大小,如兆位元組(使用 -m)和千兆位元組(使用 -g),如清單 3 所示。

<code>$ df -g</code>

<code>filesystem    1g-blocks used avail capacity  mounted on</code>

<code>/dev/disk0s2        128   57    70    45%    /</code>

<code>devfs                 0    0     0   100%    /dev</code>

<code>fdesc                 0    0     0   100%    /dev</code>

<code>&lt;volfs&gt;               0    0     0   100%    /.vol</code>

<code>/dev/disk0s3         20    3    17    17%    /volumes/untitled</code>

  很顯然,在增大顯示的塊大小的同時,資訊中的詳細級别也開始降低,但使用可選的大小是一種快速監視磁盤,特别是超大容量磁盤的很有用的方法。其他版本的 df 工具(特别是 solaris),預設情況下将報告空塊和檔案可用性資訊。大部分檔案系統都具有能夠存儲檔案的上限數值(該數值很大,以至于通常不會達到該上限),是以有可能整個系統填滿了檔案,還有可用磁盤容量但卻不能再存儲任何檔案了。

您可以在清單 4 中看到 solaris 的預設輸出示例。

8

9

10

11

12

13

14

<code>$ df</code>

<code>/                  (/dev/dsk/c0t0d0s0 ):14877208 blocks   914042 files</code>

<code>/devices           (/devices          ):       0 blocks        0 files</code>

<code>/</code><code>system</code><code>/contract   (ctfs              ):       0 blocks 2147483618 files</code>

<code>/proc              (proc              ):       0 blocks    16109 files</code>

<code>/etc/mnttab        (mnttab            ):       0 blocks        0 files</code>

<code>/etc/svc/</code><code>volatile</code>  <code>(swap              ): 5737216 blocks   147177 files</code>

<code>/</code><code>system</code><code>/object     (objfs             ):       0 blocks 2147483532 files</code>

<code>/usr               (/dev/dsk/c0t0d0s3 ): 9076010 blocks   863695 files</code>

<code>/dev/fd            (fd                ):       0 blocks        0 files</code>

<code>/var               (/dev/dsk/c0t0d0s4 ): 8110796 blocks   483714 files</code>

<code>/tmp               (swap              ): 5737216 blocks   147177 files</code>

<code>/var/run           (swap              ): 5737216 blocks   147177 files</code>

<code>/export/home       (/dev/dsk/c0t0d0s7 ):69362510 blocks  4272812 files</code>

  所有的 df 變種都接受一個目錄或路徑,然後顯示包含該路徑的檔案系統的磁盤空間資訊。例如,下面顯示了應該如何獲得根檔案系統的空間資訊:

<code>$ df -k /</code>

<code>filesystem            kbytes    used   avail capacity  mounted on</code>

<code>/dev/dsk/c0t0d0s0    7644629  206026 7362157     3%    /</code>

  使用 df 的輸出

df 工具實際上是 disk free 的縮寫,并且這也正是該工具所顯示的内容。如果再次檢視某個示例輸出,您可以從中提取一些特别重要的元素:

<code>filesystem             kbytes    used    avail capacity  mounted on</code>

<code>/dev/dsk/c0t0d0s7    35611388  930133 34325142     3%    /export/home</code>

  第一列通常具有與塊大小資料相對應的标題,它顯示了磁盤的總大小。used 列顯示了該檔案系統或裝置上已使用的塊數。avail 列顯示了該檔案系統上尚未使用的(可用的)塊數。

capacity 列提供了總大小中已使用的磁盤空間所占的百分比。這個資訊本身可以提供關于可用空間的直覺訓示。

預設情況下,unix 所建立的檔案系統中百分之九十的容量可用于存放使用者資料。剩下的百分之十由系統保留,以便 root 使用者執行緊急維護工作。如果使用者試圖添加或建立超出該限制的檔案,那麼将傳回一個錯誤(超出檔案系統空間)。

有了這個緊急維護空間,就可以利用它對一塊已滿的磁盤進行恢複。例如,作為管理者,您可以使用這個空間來建立快速備份,或對現有的資料進行壓縮而無需為達到該目的使用輔助檔案系統。您可以使用 tunefs 工具或在建立檔案系統時,調整保留的空閑空間的大小。對于大容量磁盤來說,這是至關重要的,因為其中百分之十的緩沖區可能等于許多個 gb 的潛在空間。通常好的做法是至少保留百分之一的空間,以便在完全用盡存儲空間之前,提供最低限度的緩沖區空間。在深入研究這個問題之前,特别是如果已經使用了大量的磁盤空間,您需要确定到底是誰使用了所有的這些空間。

使用 du

du 指令并不是顯示磁盤的空閑空間,而是顯示磁盤使用情況的資訊。du 工具用于确定檔案和目錄的磁盤使用情況。要使用這個工具,改變到一個目錄,然後運作該工具:

<code>$ cd /var</code>

<code>$ du</code>

<code>16      ./lost+found</code>

<code>4       ./sadm/install/admin</code>

<code>22      ./sadm/install/logs</code>

<code>28448   ./sadm/install</code>

<code>4       ./sadm/pkg/sunwocfd/install</code>

<code>4       ./sadm/pkg/sunwocfd/save/pspool/sunwocfd/install</code>

<code>16      ./sadm/pkg/sunwocfd/save/pspool/sunwocfd</code>

<code>18      ./sadm/pkg/sunwocfd/save/pspool</code>

<code>20      ./sadm/pkg/sunwocfd/save</code>

<code>28      ./sadm/pkg/sunwocfd</code>

<code>4       ./sadm/pkg/sunwcsu/inst</code>

<code>...</code>

  經過了适當的調整。預設情況下,du 将顯示目前或指定的目錄下每個檔案和目錄的檔案使用情況。得到的值是檔案的大小,機關為該系統中的預設塊大小,與 df 所使用的機關相同。可能是也可能不是 1k,而使用 -k 指令行選項,您可以強制以 1k 塊為機關進行顯示。

  使用該工具時,特别是在使用者目錄中使用該工具時,請特别小心,因為所顯示的資訊中不包含隐藏 檔案,換句話說,具有單點号字首的那些檔案和目錄。您可能希望使用下面的代碼行,在使用者目錄中獲得所有的摘要資訊:

<code>$ du -sk * .[a-za-z0-9]*</code>

  du 指令的最後一個非常有用的選項是 -d,該選項可以防止 du 指令超過檔案系統邊界。例如,要确定根檔案系統而不是任何其他的檔案系統的磁盤使用情況,您可以使用 -d 選項.

  查找一個特定使用者的磁盤使用情況

要查找某個使用者所使用的磁盤空間,在使用 find 指令的同時,您需要結合使用 du 指令以僅報告特定使用者的磁盤使用情況。

<code>$ find . -user mc -type f -exec du -k {} \;</code>

  -user 選項允許您指定 find 将僅報告屬于特定使用者的檔案。-type 選項強制 find 僅傳回特定類型(在本示例中是檔案)項目的路徑,這樣可以防止 du 包含目錄,因為這些目錄可能屬于某個使用者,但其中卻包含了許多使用者的檔案。然後,對于查找到的每個路徑,執行 du 指令以報告磁盤使用情況。

  要獲得摘要資訊,換句話說,即某個特定使用者所使用的總空間,您可以使用 awk 對該資訊進行總計,并列印出最後的值:

<code>$ find . -user mc -type f -exec du -k {} \;|awk '{ s =</code>

<code>     </code><code>s+$1 } end { print </code><code>"total used: "</code><code>,s }'</code>

<code>total used:  123721</code>

  對于組,您可以根據相同的原則對 find 使用 -group 選項:

 

<code>$ find . -group mcslp -type f -exec du -k {} \;|awk '{ s = s+$1 } end { print</code>

<code> </code><code>"total used: "</code><code>,s }'</code>

<code>total used:  542485</code>

  使用配額

配額系統以檔案系統為機關,自動監視該檔案系統中各個使用者的磁盤使用情況。配額環境不僅允許您監視磁盤的使用情況,而且還允許設定相應的使用限制,在超過使用限制時提供警告或者更直接地禁止使用者使用超過所配置設定的配額值的磁盤空間。下限(發出警告)稱為軟限制,而上限(禁止建立超過該限制的檔案)稱為硬限制。有些系統可能還允許您控制每個使用者所擁有的檔案的數目。

在您的計算機上啟動配額的确切方法取決于您所使用的作業系統。大多數 unix 系統在預設情況下都包含配額的支援。linux&amp;reg; 系統可能需要建構新的包含配額支援的核心。然而,通常大多數作業系統為每個檔案系統使用一個稱為 quotas 的檔案,其中包含了對每個使用者的空間使用限制。

要啟用配額,您首先需要建立該檔案,并確定僅有 root 使用者可以編輯該配額檔案:

<code>$ touch /export/home/quotas</code>

<code>$ chmod 600 /export/home/quotas</code>

<code>$ quotaon /export/home</code>

<code>$ edquota mc</code>

  然後,使用 quotaon 指令啟用配額功能,最後,您必須為每個使用者編輯适當的配額。可以使用 edquota 指令并指定相應的使用者來完成這項任務.

這将打開預設的編輯器(或者 vi,如果您沒有設定可選的編輯器),其中包含一個用來設定配額值的簡單表格。在下面您可以看到,已為使用者 home 目錄檔案系統啟用了配額,并且軟限制為 200,000kb,硬限制為 400,000kb。檔案限制的設定為零,這表示沒有設定限制,使用者可以設定并建立任意數目的檔案。

<code>fs /export/home blocks (soft = 200000, hard = 400000) inodes (soft = 0,</code>

<code>hard = 0)</code>

  如果您需要對多個使用者配置配額,那麼可以首先為一個使用者設定配額,然後對 edquota 使用 -p 指令行選項。這将使用指定的使用者作為基礎來建立新的使用者。例如,要使用 mc 的設定為使用者名 slp、tw 和 sh 設定配額,請執行下面的指令:

<code>$ edquota -p mc slp tw sh</code>

  使用配額進行檔案限制警告

當使用者建立一個超過其軟限制的檔案時,他們将會得到下面的警告:

quota_ufs: warning: over disk limit (pid 1738, uid 101, inum 94, fs /export/home)

請注意,留給使用者 7 天的時間更正該問題,您可以使用 edquota -t 來更改這個期限。

如果使用者試圖建立超過硬限制的檔案,那麼系統将終止寫程序并根據相應的限制來截斷該檔案:

<code>$ mkfile 210000k overlimit</code>

<code>quota_ufs: over hard disk limit (pid 1843, uid 101, inum 130, fs</code>

<code> </code><code>/export/home)</code>

<code>overlimit: initialized 191873024 of 215040000 bytes: disc quota exceeded</code>

  通過運作 quota 指令,任何使用者都可以檢查他們自己的配額限制和磁盤使用情況:

<code>$ quota</code>

<code>over disk quota on /export/home, </code><code>remove</code> <code>199993k within 7.0 days</code>

  配額管理

使用 quota 指令,系統管理者可以檢查任何使用者的配額,您應該使用 -v 指令行選項以提供關于檔案系統、使用情況和限制資訊的完整報告

<code>$ quota -v mc</code>

<code>disk quotas </code><code>for</code> <code>mc (uid 101):</code>

<code>filesystem     usage  quota  limit    timeleft  files  quota  limit  </code>

<code> </code><code>timeleft</code>

<code>/export/home  399993 200000 400000    6.9 days    151      0      0</code>

  要獲得某個檔案系統中較長的描述所有使用者的磁盤和配額使用情況的報告,可以使用 repquota 指令,并指定要報告的檔案系統

<code>$ repquota -v /export/home</code>

<code>/dev/dsk/c0t0d0s7 (/export/home):</code>

<code>                      </code><code>block limits                  file limits</code>

<code>user           used   soft   hard  timeleft  used   soft   hard timeleft</code>

<code>mc        +- 399993 200000 400000  6.9 days   151      0      0    </code>

  要確定配額資訊保持最新,您應該使用 quotacheck 指令。這将利用用來報告配額資訊的配額資訊對檔案存儲資料進行驗證。您應該使用 cron 來自動地運作這項任務,每天一次比較合适(因為這個過程是比較耗時的)。 

  配額系統提供了監視和自動管理的最佳組合,但是您應該注意啟用了配額的檔案系統以及您所設定的限制,因為它們可能會妨礙使用者的工作,而不是控制他們的磁盤使用情況。

例如,與您進行的使用配置相比,程式員可能需要更多的空間來建構一個應用程式。通過提供一個不受限制的編譯區域(通過設定一個可選的臨時目錄),您可以在維持他們的 home 目錄配額的同時避開這個問題,或者在設定很高的硬限制(甚至可能是該檔案系統的最大容量)的同時,設定合适的軟限制。

其結果應該是當達到軟限制時給出一個警告,而不會真正地實施硬限制。使用者應該仍然可以建構和建立臨時檔案,但是因為在建構的過程中會删除這些檔案,是以不應該禁止使用者建立他們所需的檔案。

配額還可以用來幫助完成監視任務,并提醒您關于特殊使用者帳戶的空間使用情況。我過去曾使用配額來監視 web 使用者帳戶,即所謂的 nobody 帳戶和其他帳戶,以確定它們無法向不應具有通路權限的檔案系統中寫入檔案。要完成這項任務,可以将您需要保護的檔案系統和使用者的硬限制設定為 1kb。 

自動監視

手動監視磁盤空間使用情況是可行的,但是您并不希望不停地運作 df(甚至 du)來确定已使用的或可用的磁盤空間。您可以使這個過程自動化,并且當可用空間降低到一定的級别時,自動地向管理者(或者管理者組)發送電子郵件。清單 10 中的腳本用來監視磁盤空間,您可以設定警告 (warninglimit) 和緊急情況 (lowlimit) 限制,以及進行檢查的檔案系統的清單。

  監視磁盤空間:

Linux 監視磁盤空間和使用情況
Linux 監視磁盤空間和使用情況

其中關鍵的一行是提取每個檔案系統中空閑磁盤空間的大小:

size=`df -k $fs|grep $fs|awk '{ print $4; }'`

該腳本使用 df 僅提取了要進行 grep 的行,然後使用 awk 提取資料的第 4 列,該列是空閑空間的大小。

然後,您可以根據 warninglimit/lowlimit 來檢查空閑空間,并生成合适的錯誤。要避免系統同時發生下限和警告錯誤,該腳本首先檢查下限,并在嘗試測試警告之前使用 break 跳到循環中的下一個檔案系統。 

繼續閱讀