Command-Line-Interface

查找消耗大量 AFS 卷配額的目錄

  • November 12, 2012

我們的一位電腦使用者幾乎超出了 AFS 卷配額。執行fs listquotafs lq給他一個警告:

olifri@ubuntu:~$ fs listquota ~
Volume Name                    Quota       Used %Used   Partition
H.olifri                      500000     492787   99%<<       38% <<WARNING

我想與他分享一個 shell 腳本,該腳本將檢測他的哪些目錄消耗了他的大部分 AFS 卷配額。然後他會更好地了解從哪裡開始刪除文件。

請注意,在 AFS 文件系統中,使用者可以在 AFS 卷中安裝其他 AFS 卷。這意味著使用**/usr/bin/find**的遞歸可能會進入我們不感興趣的其他 AFS 卷。

我們的 AFS 客戶端軟體是 Openafs 1.6.1,它在 Ubuntu 12.04 電腦上執行。我們對 AFS 文件伺服器沒有管理員權限,因為它們由另一個部門管理。

命令**/usr/bin/du**似乎不知道 AFS 卷的概念。我現在最好的想法是編寫一個腳本,為每個子目錄測試該目錄是否是 AFS 卷的掛載點。例如,該命令fs lsmount可以用於此。對於普通目錄fs lsmount會產生此結果

esjolund@ubuntu:~$ mkdir ~/testdir
esjolund@ubuntu:~$ fs lsmount ~/testdir
'/afs/pdc.kth.se/home/e/esjolund/testdir' is not a mount point.

並且對於 AFS 掛載點fs lsmount會產生這個結果

esjolund@ubuntu:~$ fs mkmount -dir ~/testmount -vol prj.sbc.esjolund00
esjolund@ubuntu:~$ fs lsmount ~/testmount
'/afs/pdc.kth.se/home/e/esjolund/testmount' is a mount point for volume '#prj.sbc.esjolund00'

在開始編寫 shell 腳本之前,我想听聽您是否對如何解決問題有更好的想法?

#!/usr/bin/python                                                                                                                  
import os
import sys
import subprocess

if len(sys.argv) != 2:
 print >> sys.stderr, "error: Wrong number of arguments. One argument expected (the directory name)"
 sys.exit(1)

for dirpath, dirnames, filenames in os.walk(sys.argv[1]):
 for dirname in dirnames:
   subdirpath = os.path.join(dirpath, dirname)
   p = subprocess.Popen(["fs", "lsmount", subdirpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   # It seems we can distinguish an AFS volume mount point from a normal directory by just                                        
   # looking at the return code.                                                                                                  
   # Maybe we should also look at the stdout and stderr?                                                                          
   # (In other words the variables out and err)                                                                                   
   out, err = p.communicate()
   if ( p.returncode == 0 ):
     dirnames.remove(dirname)
 total_size = 0
 for filename in filenames:
   filepath = os.path.join(dirpath, filename)
   statinfo = os.lstat(filepath)
   total_size += statinfo.st_size
 print "%i %s" % (total_size, dirpath)

像這樣使用命令

olifri@ubuntu:~$ python /tmp/script.py  ~ | sort -n

引用自:https://serverfault.com/questions/425962