Unix/Linux 系統自動化管理: 磁盤管理篇

 
 
 
未顯示需要 JavaScript 的文檔選項

級別: 初級
李 婷婷, 軟件工程師, IBM
王 磊, 軟件工程師, IBM
2009 年 7 月 30 日
本文是 Unix/Linux 系統管理自動化系列中的一篇,主要講述如何實現自動化監控磁盤空間狀態並及時通知系統管理員採取相應措施。
在 Unix/Linux 系統的日常管理工作中,系統管理員可能會遇到因磁盤空間耗盡而導致丟失數據,或者系統崩潰等。這些嚴重的事故極大的影響了工作效率。因此,關注系統的磁盤使用情況,建立一個警告系統對磁盤空間的潛在問題發出警告,確保文件系統沒有被填滿或濫用是系統管理的一個重要的方面。
在本文中,作者介紹了一些查看磁盤使用情況的工具命令並結合這些工具實現了一個自動化監控磁盤空間的示範腳本。通過介紹,讀者將瞭解如何監視磁盤空間、如何發現究竟是哪些文件系統佔用了大部分的空間並以此爲依據做出相應的調整。
在獲知磁盤使用狀態之前,你可能需要知道你當前的系統使用的是什麼類型的磁盤,它的屬性參數是什麼。目前大多數的 Linux/Unix 服務器硬盤使用 SCSI 或 IDE 硬盤。在 Linux 和 AIX 中查看硬盤的屬性使用不同的命令,下面的例子給出了在不同系統上如何獲得硬盤屬性,其中包括製造商,機器型號,序列號等。
 # dmesg |grep scsi 
 vio_register_driver: driver ibmvscsi registering 
 ibmvscsi 30000002: SRP_VERSION: 16.a 
 scsi0 : IBM POWER Virtual SCSI Adapter 1.5.9 
 ibmvscsi 30000002: partner initialization complete 
 ibmvscsi 30000002: sent SRP login 
 ibmvscsi 30000002: SRP_LOGIN succeeded 
 ibmvscsi 30000002: host srp version: 16.a, host partition vios (1), OS 3, max io 1048576 
 sd 0:0:1:0: Attached scsi disk sda 
 sd 0:0:1:0: Attached scsi generic sg0 type 0 

 # lsdev -CHc disk 
 name   status    location     description 
 hdisk0 Available 01-08-00-1,0 SCSI Disk Drive 
上面的命令給出了系統可用的硬盤信息,從上面的輸出可以看出,系統有一個可用的 SCSI 硬盤,如果要獲得硬盤的配置信息,可以使用 lscfg 來查看。
 # lscfg -vl hdisk0 
  hdisk0           U788D.001.99DZG0B-P1-T10-L1-L0  SCSI Disk Drive (36400 MB) 
        Manufacturer................IBM-ESXS 
        Machine Type and Model......ST936701SS 
        FRU Number..................39R7368 
        ROS Level and ID............42353142 
        Serial Number...............3LC0BGY8 
        EC Level....................H17923E 
        Part Number.................26K5266 
        Device Specific.(Z0)........000005129F00100A 
        Device Specific.(Z1)........0106B51B 
        Device Specific.(Z2)........1000 
        Device Specific.(Z3)........06114 
        Device Specific.(Z4)........0001 
        Device Specific.(Z5)........22 
        Device Specific.(Z6)........H17923E 
        Brand.......................XS 

硬盤需要分區,格式化並掛載後方能使用,Linux 下硬盤上的每個分區表示爲一個設備文件。AIX 系統對磁盤的管理和 Linux 系統不同,AIX 默認使用 LVM 對磁盤進行管理。傳統的磁盤管理方法使用類似 fdisk 的工具對物理磁盤進行分區的劃分和刪除,每個分區的大小是固定的,在此基礎上掛載文件系統。AIX 系統上將多個物理分區匯聚爲一個卷組,然後再從中分割出一塊一塊的邏輯卷,在邏輯捲上可以創建文件系統。在較新的 Linux 版本中,也開始提供對 LVM 的支持,和 AIX 中的概念和使用方法非常相似。
通過在 Linux 系統上面使用 fdisk 命令可以獲得硬盤分區信息。而在 AIX 系統上,用戶可以使用 lspv 來獲得一個硬盤上的邏輯卷與文件系統對應信息。
在 Linux 和 AIX 系統上,都提供了一個 df 命令。df 的功能是檢查文件系統的磁盤空間佔用情況以及可用性,通常還包掛載點。管理員能利用該命令來獲取硬盤被佔用了多少空間,目前還剩下多少空間等信息。 df 的參數在 AIX 和 Linux 系統上略有不同。管理員可以通過查看用戶手冊來確定它的用法。
 # df 
 Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on 
 /dev/hd4          360448     84208   77%     9790    48% / 
 /dev/hd2         3309568    298576   91%    30742    47% /usr 
 /dev/hd9var       163840    124448   25%      514     4% /var 
 /dev/hd3          131072    122696    7%       70     1% /tmp 
 /dev/hd1           32768     32064    3%        5     1% /home 
 /dev/hd11admin     262144    261416    1%        5     1% /admin 
 /proc                  -         -    -         -     -  
 /proc/dev/hd10opt      294912    127536   57%     1661    11% /opt 

在上面 df 的輸出列表中,第一列是表示文件系統對應的設備文件的路徑名;第二列給出分區包含的數據塊的數目;第三列表示可用的數據塊數目,在缺省的每個分區都留了少量空間供系統管理員使用,即使遇見普通用戶空間已滿的情況,管理員仍能登錄和留有解決問題所需的工作空間;清單中第四列 use% 列表示普通用戶空間使用的百分比;最後一列表示文件系統的安裝點。
需要注意的是上面顯示的大小是以 512 字節塊爲單位,而不是千字節。缺省情況下,幾乎所有傳統的 UNIX 操作系統都以 512 字節塊爲單位報告大小。要獲得以 1K 塊爲單位的信息,可以使用 -k 命令行選項,要獲得以 MB 爲單位的信息,需要使用 -m 命令,要獲得以 GB 爲單位的信息,需要使用 -g 命令行選項。
df 工具在 Linux 上默認顯示是以 1K 字節爲單位的。在 Linux 系統上,-h 選項是比較常用的選項,它能使得顯示的內容簡單易讀。
 # df -h 
 Filesystem            Size  Used Avail Use% Mounted on 
 /dev/sda6              38G   16G   23G  41% / 
 udev                  1.5G   96K  1.5G   1% /dev 

du 命令並不是顯示磁盤的空閒空間,而是顯示磁盤使用情況的信息,它將統計目錄或文件所佔磁盤空間的大小。du 命令用於確定文件和目錄的磁盤使用情況。
該命令可逐級進入指定目錄的每一個子目錄並顯示該目錄佔用文件系統數據塊的情況。若沒有給出目錄或文件的名字,則對當前目錄進行統計。
下面的 du 輸出清單中的第一列是以塊爲單位計的磁盤空間容量,第二列列出目錄中使用這些空間的目錄和文件名稱。 帶 -a 選項的 du 命令將從當前目錄開始沿着目錄結構向下直到列出所有目錄和文件的容量爲止。
 #du -a 
 0       ./lost+found 
 0       ./.oslevel.datafiles/.oslevel.hold 
 8       ./.oslevel.datafiles/.oslevel.mlinfo.cache 
 8       ./diagSEgenSnap/general/emgr.snap 
 2304    ./diagSEgenSnap/general/trcfmt 
 8       ./diagSEgenSnap/general/inittab 
 8       ./diagSEgenSnap/general/survdump.settings 
 4976    ./diagSEgenSnap/general 
 1448    ./diagSEgenSnap/snapH.pax.Z 
 6424    ./diagSEgenSnap 
 8       ./.ctinst.log 
 0       ./rc.net.serial.out 
 400     ./lvmt.log 
…
 7344 





回頁首


在下面的內容中,我們給出了一個對磁盤分區剩餘空間大小進行自動化監控的示例,用戶可根據自身需求,對示例腳本進行修改以達到特定的管理目的。
我們的自動化磁盤分區空間監控系統分爲三個部分,由三個文件 /root/disktab,checkdisk 腳本和 /root/diskresp 實現。/root/disktab 文件定義了需要監控的磁盤分區,報警閾值和達到閾值後的動作。checkdisk 則實現了整個對於磁盤空間的監控過程,而 /root/diskresp 文件爲用戶自定義的磁盤空間達到閾值後的響應腳本。
監控腳本將被添加到 crontab 中,這樣就可以使監控循環進行。我們的腳本在 RedHatEL-Server 5.3(perl 版本 5.8.8)、SLES 11(perl 版本 5.10.0) 和 AIX 5.3(perl 版本 5.8.2) 上測試通過。
定義的 /root/disktab 文件擁有下面的格式
分區所 mount 的目錄 報警閾值 達到閾值後的動作
 /       80%     /root/diskresp 
 /data   100G 	    /root/diskresp 

在這個文件中,第一行表示當"/"分區空間佔用超過 80% 時,則運行腳本 /root/diskresp 進行響應;第二行表示當"/data"分區的空間佔用超過 100G 時運行腳本 /root/diskresp 進行響應。我們的文件允許報警閾值以 KB,MB,GB 爲單位,也可以以百分比表示。
腳本 checkdisk 主要完成的任務是分析 /root/disktab 文件並和當前查看磁盤空間的輸出進行比較,對於空間異常的分區採取相應的措施。腳本 checkdisk 的第一部分先進行了初始化,獲得了要使用的分區監控定義文件,默認的分區監控定義文件爲 /root/disktab,也可以通過參數指定該文件的位置。
 #!/usr/bin/perl 
 use strict; 
 my $DISKTABFILE = "/root/disktab"; 
 if ($ARGV[0] ne "") { 
    $DISKTABFILE = $ARGV[0]; 
 } 
 # 因爲 Linux 和 AIX 的 df 命令格式略有不同,所以首先判斷一下
 my $OS = `uname`; 
 chomp $OS; 
 my $DF; 
 if ($OS eq "Linux") { 
    $DF = "df -h"; 
 } elsif ($OS eq "AIX") { 
    # AIX 中的 df 命令,在這裏使用了 -m 選項,則其輸出都將以 MB 爲單位(但是 MB 字樣不會出現在結果輸出中)
    $DF = "df -I -m"; 
 } else { 
    print "This OS is not supported.\n"; 
    exit 1; 
 } 

接下來,checkdisk 腳本逐行分析了 /root/disktab 文件,使用 perl 的正則表達式,很容易可以從 /root/disktab 中將分區所 mount 的目錄,報警閾值以及達到閾值後的動作等信息提取出來,然後將獲得的信息存放在一個 hash table 中。
 # 分析 /root/disktab 文件
 my %table = getTable($DISKTABFILE); 
 sub getTable 
 { 
    # 通過參數取得 table 文件的位置
    my ($tabfile) = @_; 
    my %rs; 
    # 打開文件
    unless(open(TABF, $tabfile)) { 
        print "Can't open file '$tabfile'.\n"; 
        exit 1; 
    } 
    # 分析 disktab 文件每行的內容,將其存放在一個 hash table 中
    foreach my $line (<TABF>) { 
        # 使用正則表達式,分析出 table 文件中每一行的掛載點、閾值大小和採取的行動
        if(!($line =~ /^#/) && $line =~ /(\S+)\s+(\S+)\s+(.*)\s*$/) { 
            my $mp = $1; 
            my $size = $2; 
            my $action = $3; 
            $rs{$mp} = [$size, $action]; 
        } 
    } 
    close TABF; 
    return %rs; 
 } 

清單 9 中的腳本實現了實時監控並檢測分區狀況,通過前面獲得的用戶定義的閾值和 df 命令的輸出進行比較,如果 df 顯示的某個分區的空間佔用超過了用戶定義的閾值,則執行用戶定義的操作。
 # 將分析出的 hash table 以引用的形式傳遞給 checkDisk 函數,checkDisk 函數完成檢查分區空間,並執行相應動作的任務。
 checkDisk(\%table); 
 sub checkDisk 
 { 
    my ($tab) = @_; 
    my @df_rs = `$DF`; # 執行 df 命令
    chomp @df_rs; 
    my ($mp, $used_size, $used_perc); 
    my ($minsize, $minperc); 
    my $comp_with_perc; # 此變量用於表明是使用百分比進行比較還是使用絕對空間大小值
    my %rs; 
    my $env_str; 
    # 分析 df 命令的每一行輸出
    foreach my $line (@df_rs) { 
        $comp_with_perc = 0; 
        # 使用正則表達式,分析出 df 輸出的每一行的掛載點、空間使用大小和空間使用百分比
        if ($line =~ /^\S+\s+\S+\s+(\S+)\s+\S+\s+(\d+)%\s+(\S+)\s*$/) { 
            $mp = $3; $used_size = $1; $used_perc = $2; 
        } else { 
            next; 
        } 
        # 如果某個分區的 Mount Point 在 table 中有一項和它對應,則繼續進行,否則分析下一行
        if (!defined($$tab{$mp})) { 
            next; 
        } 
        # 將得到的信息,存儲起來,作爲環境變量傳遞給將要運行的響應腳本
        $env_str = "DISK_MOUNTP=$mp"; 
        $env_str .= " DISK_MIN=$$tab{$mp}[0]"; 
        $env_str .= $used_size =~ /^\d+\.?\d*$/ ? " DISK_USED=${used_size}M" : "
            DISK_USED=$used_size"; 
        $env_str .= " DISK_USED_PERC=$used_perc%"; 
        # 分析 hash table 中的閾值,如果閾值使用的是大小值,則現將其統一單位爲 MB 
        if ($$tab{$mp}[0] =~ /^(\d+\.?\d*)G$/) { 
            $minsize = $1 * 1024; 
        }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)M$/) { 
            $minsize = $1; 
        }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)K$/) { 
            $minsize = $1 / 1024; 
        }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)%$/) { 
            $minperc = $1; 
            # 如果 hash table 中閾值存放的是一個百分比,則表明要進行佔用百分比的比較
            $comp_with_perc = 1; 
        }else { 
            print "Format error: $$tab{$mp}[0]\n"; 
            next; 
        } 
        # 如果使用空間佔用 size 進行比較,則也將 df 命令中得到的空間大小統一單位到 MB 
        if (!$comp_with_perc) { 
            if ($used_size =~ /^(\d+\.?\d*)G$/) { 
                $used_size = $1 * 1024; 
            }elsif ($used_size =~ /^(\d+\.?\d*)M$/ || $used_size =~ /^(\d+\.?\d*)$/) { 
                $used_size = $1; 
            }elsif ($used_size =~ /^(\d+\.?\d*)K$/) { 
                $used_size = $1 / 1024; 
            } 
        } 
        # 比較實際空間佔用和 table 中記錄的閾值
        if ((!$comp_with_perc && $minsize < $used_size) || 
            ($comp_with_perc && $minperc < $used_perc)) { 
            print "WARNING DISK SIZE for $mp\n"; 
            # 調用 table 中記錄的響應腳本,$env_str 中存放的 DISK_MOUNTP,DISK_MIN,DISK_USED,
            # DISK_USED_PERC,作爲環境變量傳遞給腳本
            my $cmd = "$env_str $$tab{$mp}[1] 2>&1"; 
            print "Running command: $cmd\n"; 
            my $output = `$cmd`; chomp $output; 
            print "Output:\n$output\nExit code = $?\n"; 
        } 
    } 
 } 

響應腳本(在本例中爲 /root/diskresp)中可以從環境變量得到佔用空間異常的分區的 Mount Point(DISK_MOUNTP),設置的閾值(DISK_MIN),空間佔用大小(DISK_USED)以及空間佔用比例(DISK_USED_PERC)。
響應腳本可以採取各種動作來解決空間佔用問題,例如刪除一些臨時文件,或者是僅僅發一封信來通知管理員。一下給出一個響應腳本的例子,它所做的就是給 root 用戶發一封信。
 #!/bin/bash 
 echo "The $DISK_MOUNTP is now used $DISK_USED ($DISK_USED_PERC), over $DISK_MIN." | 
 mail -s "WARNING DISK SIZE for $DISK_MOUNTP" root 

現在通過手工運行 /root/checkdisk 腳本,其已經可以正常工作。爲了實現自動化的監控,我們需要系統的 cron 服務的幫助。
使用命令“crontab -e”編輯 crontab,添加一條類似於以下的項:
*/2 * * * * /root/checkdisk 2>&1 >> /root/checkdisk.log
這表示每兩分鐘運行一次 checkdisk 腳本,將其輸出存儲在 /root/checkdisk.log 文件中。可以根據自己的需求修改腳本運行的時間。cron 運行命令時,其命令輸出不會顯示在屏幕上,而是將輸出通過郵件發給管理員,所以爲了方便查看命令的輸出,最好將輸出重定向到文件中。
以上步驟完成後,就可以實現對磁盤分區的自動監控了。
對 checkdisk 腳本稍加修改就可以通過 ssh 或 rsh 實現對遠程機器某個分區的監控,也可以使用 du 實現對某個文件夾大小的監控。(比如管理員可能在沒有使用 quota 的情況下要監控每個用戶的 home 目錄的大小,以免某個用戶佔用過大的空間。)




回頁首


本文介紹了 Unix/Linux 上的磁盤管理命令並通過一個自動化監控腳本詳細介紹瞭如何實現磁盤空間的自動化監控管理。磁盤空間的自動化監控能幫助系統管理員及時發現磁盤空間的異常問題,通過採取相應的措施使得問題得以消除和緩解。


學習
  • IBM Publication: 《命令參考大全,卷 5:s - u 》:AIX 6.1 信息中心文檔,系統管理類。

  • 有關 Perl 信息及其相關資源,請查看 Perl.com

  • Programming Perl Third Edition(Larry Wall、Tom Christiansen 和 Jon Orwant 著;O'Reilly & Associates,2000)是當今最好的 Perl 指南,現在已經更新到 5.005 和 5.6.0。

  • Perl Cookbook(Tom Christiansen 和 Nathan Torkington 著;O'Reilly & Associates,1998)是關於所有 Perl 問題的權威性入門書籍。

  • AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的信息,您可以利用它們來擴展自己的 UNIX 技能。

  • AIX and UNIX 新手入門:訪問“AIX and UNIX 新手入門”頁面可瞭解更多關於 AIX 和 UNIX 的內容。

  • AIX and UNIX 專題彙總:AIX and UNIX 專區已經爲您推出了很多的技術專題,爲您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,爲了方便您的訪問,我們在這裏爲您把本專區的所有專題進行彙總,讓您更方便的找到您需要的內容。

  • developerWorks 技術活動網絡廣播:隨時關注 developerWorks 技術活動和網絡廣播。


獲得產品和技術
  • IBM 試用軟件:使用可從 developerWorks 直接下載的軟件構建您的下一個開發項目。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章