天天看點

一個 UNIX 開發者需要掌握的 AIX 技巧

正在使用哪個版本的 AIX? 在需要幫助時 , 提供詳細資訊 !

做為一個 UNIX 開發、維護者,當然要知道目前登陸系統的具體版本。這樣當需要和其它技術人員交流經驗,分享樂趣,以及尋求幫助的時候,你可以讓他們盡快而詳解的了解你的系統的基本資訊。從 2006 年後,AIX 的版本管理更加細化全面, 但複雜的層次也更容易讓不了解的人産生混亂。先看一個輸出例子:

$ oslevel -s 
 5300-06-05-0806 
 $ 
      

這裡列出的版本資訊可以具體解釋為,目前的系統環境是 AIX 版本 5, ML (Maintenance Level)3,TL(Technical Level)06,SP(Service Pack)05。

TL 是 IBM 會較長時間支援的版本, 對于每個釋出的 TL,AIX 産品部門每隔 6 周左右都會釋出更新的 SP 來釋出新的硬體支援, 解決系統已知的漏洞等。

另外一個更全面的指令, 經常為 AIX 系統工程師,AIX 系統管理者使用的是一個 AIX 4.3.3 以來即支援的指令,prtconf (或者 lsconf)。它的示例輸出如下:

清單 1.prtconf 指令輸出樣本

$ prtconf 
 System Model: IBM,8203-E4A 
 Machine Serial Number: XXXXXXX 
 Processor Type: PowerPC_POWER6 
 Processor Implementation Mode: POWER 6 
 Processor Version: PV_6_Compat 
 Number Of Processors: 1 
 Processor Clock Speed: 4204 MHz 
 CPU Type: 64-bit 
 Kernel Type: 64-bit 
 LPAR Info: 3 aix53 
 Memory Size: 6208 MB 
 Good Memory Size: 6208 MB 
 Platform Firmware level: EL320_076 
 Firmware Version: IBM,EL320_076 
 Console Login: enable 
 Auto Restart: true 
 Full Core: false 

 Network Information 
        Host Name: aix53 
        IP Address: 9.125.241.55 
        Sub Netmask: 255.255.255.0 
        Gateway: 9.125.241.1 
        Name Server: 9.181.2.101 
        Domain Name: cn.ibm.com 

 Paging Space Information 
        Total Paging Space: 2048MB 
        Percent Used: 4% 

 ............................... 
 $ 
      

我們可以看到這個指令詳細的列出了系統的硬體配置, 包括硬碟,CPU,記憶體的配置以及網絡位址等資訊。這比我們使用 ifconfig – a、uname、lsdev 等指令分别去收集快多了。

回頁首

監控系統性能,不是超級使用者也可以做到!

開發者和系統普通使用者如 DBA 也需要關注系統的性能。AIX 系統也在其環境下也為我們這些非 root 的普通使用者準備了足夠的監控工具。

首先介紹一個視窗式的工具 topas,在不同的 UNIX 或者 Linux 下的指令 top 有所不同,AIX 中使用的是 topas。使用這個指令我們可以在同一個界面下,全局性的觀察到系統中各個資源 - CPU,網絡,磁盤, 記憶體和交換區等使用情況。常常我們需要關注的參見如下圖框選的各個部分:

圖 1.topas 指令的系統界面截圖

一個 UNIX 開發者需要掌握的 AIX 技巧

框選的部分分别代表了系統 CPU 等待時間(這個名額常常影響着 CPU 性能), 磁盤的繁忙程度以及程序占用 CPU 的百分比, 交換區的使用情況。這些是最常用和基本的名額。

另外常用的普通使用者可以使用的監控指令包括 iostat 和 vmstat。 前者報告存儲 IO 的使用情況, 而後者主要用于監控記憶體和 CPU 的使用情況。常常用于系統日常運作狀态的資訊收集。使用起來很簡單, 比如“iostat 3”和 “vmstat 1 10” 等。需要注意 vmstat 的第一行表示的是系統啟動以來的統計資訊, 在進行實時資料統計和分析的時候需要排除這一行。

回頁首

識别你目前的 session – 使用變量 "PS1"

如果細心觀察,你會發現,不同人使用的指令行界面常常是不同的,即使在同一個系統裡邊(當然這裡不是指 $ 和 #,一個為普通使用者在 AIX 下預設的指令提示符,另一個則為超級使用者 root 的預設提示符)。你可以看到提供很多有效資訊的指令提示符,比如:

[email protected]:/home/zhudany/Scripts> 
      

這個提示符裡紀錄了目前登陸使用者 ID 以及登陸的機器的主機名,目前你所在的檔案系統路徑。在同時使用多個系統的時候,這些資訊可以幫助你始終正确鑒别是否在正确的伺服器、使用者、檔案目錄下做正确的事情,而不用不時的輸入系統指令來檢視确認這些資訊。

如何配置出這樣的提示?很簡單,使用如下指令即可:

PS1=`whoami`'@'`hostname`':$PWD\>'
      

也就是設定變量 PS1 即可。當這個指令輸入後,你目前的指令提示符立即更新為你個性化的模樣了。怎麼樣, 還不試試?

回頁首

安全的設定系統的關鍵變量之一 - "PATH"

大量的 UNIX 安全相關的書籍都會建議,“為了安全起見,請使用絕對路徑來運作腳本 / 指令。”為什麼需要這樣?讓我們結合一個常見的環境變量 PATH 來揭開謎底。

首先看一個問題,如果給我們兩個設定環境變量 PATH 的方法:

選擇 1 

PATH=/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb:.

選擇 2 

PATH=.:/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb

可以看到,唯一的差別是路徑“.”的位置。你會選擇哪種呢?也許你會說無所謂。好,讓我們來看看其中的差别。

首先我們知道,路徑“.”代表目前的工作目錄。在揭曉謎底前我們先看個實驗。具體步驟如下:

實驗的目标很簡單,我們希望删除 experiment 目錄下的大量的 machineLog 開頭的檔案:

清單 2. 實驗初始環境

[email protected]:/experiment>ls -l 
 total 124 
 drwxr-xr-x    2 root     system         8192 Apr 08 16:02 ABB 
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog0.log 
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog1.log 
……
 -rw-r--r--    1 root     system            0 Apr 08 16:07 machineLog106.log 
……
 -rw-r--r--    1 root     system            0 Apr 08 16:06 machineLog209.log 
 -rwxr--r--    1 root     system           30 Apr 08 16:07 rm 
 -rw-r--r--    1 root     system            0 Apr 08 16:13 rm123333d 
 -rw-r--r--    1 root     system            0 Apr 08 16:14 rmddsf 
 -rw-r--r--    1 root     system            0 Apr 08 16:13 rmdfcdt45 
 -rw-r--r--    1 root     system            0 Apr 08 16:14 rmewrksadf 
 -rw-r--r--    1 root     system            0 Mar 26 23:40 t11aoopiupupo5t 
 -rw-r--r--    1 root     system            0 Mar 26 23:41 t123dsfdsaf3t 
 [email protected]:/experiment> 
      

同時在 /experiment/ABB 目錄下,有大量的項目源代碼等重要檔案,這些是我們絕對不希望丢失的重要檔案:

清單 3. 重要檔案清單

[email protected]:/experiment/ABB>ls -1 
 ProjectAFileA.java 
 ProjectACore.jar 
 ProjectASub1.jar 
……
 ProjectAFileZ.jsp 
 [email protected]:/experiment/ABB> 

我們目前的 PATH 設定為:
 [email protected]:/experiment>echo $PATH 
 .:/usr/bin:/etc:/usr/sbin:/usr/vac/bin/:/usr/ucb 
 [email protected]:/experiment> 
      

也就是采用了“選擇 2”。

現在我們輸入 AIX 指令 rm 來清理那些 machineLog 開頭的檔案:

[email protected]:/experiment>rm machineLog*.log 
 [email protected]:/experiment> 
      

指令正常結束,傳回到提示符,很好,一切正常。現在看目錄下很幹淨了:

[email protected]:/experiment>ls 
 ABB              rm123333d        rmdfcdt45        t11aoopiupupo5t 
 rm               rmddsf           rmewrksadf       t123dsfdsaf3t 
 [email protected]:/experiment> 
      

實作目标。但是,别高興太早, 我們再看看那個存放重要檔案的目錄,

[email protected]:/experiment>cd ABB 
 [email protected]:/experiment/ABB>ls 
 [email protected]:/experiment/ABB> 
      

什麼都沒有了!我們最不期望的事情發生了。這是為什麼?不要急,讓我們仔細觀察這個指令的輸出:

清單 4. 目前目錄檔案清單

[email protected]:/experiment>ls 
 ABB              rm123333d        rmdfcdt45        t11aoopiupupo5t 
 rm               rmddsf           rmewrksadf       t123dsfdsaf3t 
 [email protected]:/experiment> 
      

看到了麼,在目前目錄下,有一個檔案就叫做 rm (在大量檔案混雜的複雜目錄下,很容易忽略它)!看看它的内容:

清單 5. 僞造的 rm 指令内容

[email protected]:/experiment>cat rm 
 /usr/bin/rm -rf /experiment/ABB/* 
 /usr/bin/rm $1 
 [email protected]:/experiment> 
      

原來是它删除了我們重要的檔案!它實際是一個經過僞裝的 shell 腳本,我們執行的時候沒有發現異常,但是它已經偷偷删除了我們的重要檔案。

這裡隻列舉了一個簡單的例子。實際在系統遭遇惡意的破壞時,腳本裡邊可能寫的是更危險的指令, 或者設定後門等危及系統安全的操作。

由這個例子我們知道,使用絕對路徑是多麼的重要,它可以防止我們不慎運作了不期望的指令,尤其是使用 root 使用者操作的時候更要注意這一點。

另外,這裡需要提及的一句是, UNIX 隻在目前 shell 的 PATH 變量所設定的路徑中搜尋你輸入的指令所需要的執行檔案。也就是說, 如果 PATH 裡邊沒有’ . ’配置,UNIX 是不會搜尋目前目錄下的可執行檔案的。

為了操作友善,有時我們不想每次都使用絕對路徑來執行指令,而這時又常常需要運作目前目錄下的檔案,這種情況下,使用“選擇 1”也會保險的多!

回頁首

使用 "history" 指令 , 複用你的輸入 !

使用指令行的時候我們常常要輸入很多指令,這些指令又經常會需要有很多參數配合,是以有時 AIX 的指令看起來顯得很複雜冗長。尤其在調試的時候,常常會輸入大量重複的指令。有沒有辦法可以提高工作效率? 這裡解釋一個複用曆史指令的好方法。

首先介紹一下 AIX 的 shell 環境,預設情況下所有使用者都使用 Korn Shell。Korn Shell 會在使用者的 HOME 目錄下維護一個指令日志檔案 .sh_history 。預設情況下這個檔案會紀錄 128 條使用者的曆史指令資訊。這是個文本檔案,我們可以直接用文本工具檢視它的内容。

現在看看如何重複使用這些曆史指令。首先,AIX 提供了一個定制的别名(alias)指令 history,我們可以用它來查閱這些曆史指令:

清單 6. 曆史指令樣例

[email protected]:/experiment>history 
 1220    df -k 
 1221    df -k 
 1222    df -k 
 1223    df -k 
 1224    id 
 1225    pwd 
 1226    history 
 1227    man history 
 1228    find /etc – user root -ls 
 1229    alias 
 1230    man fc 
 1231    which fc 
 1232    man alias 
 1233    man r 
 1234    alias 
 1235    history 
 [email protected]:/experiment> 
      

也可以在 history 後加參數, 比如 history -128 來檢視更多的指令曆史。 之後我們采用另外一個定制的别名指令 r 來調用這些曆史指令紀錄。這裡舉一個例子, 比如我們要再次使用剛剛輸入過的指令 find /etc – user root – ls, 也就是我們需要調用标号為 1228 的曆史指令,同時我們又期望這次不再檢視使用者 root,而是使用者 user1 的情況,我們可以這樣調用:

[email protected]:/experiment>r 1228 root=user1       

這樣實際上就是輸入了曆史指令“find /etc – user user1 – ls”。 現在我們知道别名指令 history 和 r 可以通過複用或者修改一處曆史指令,來提高我們與系統互動的指令輸入速度。如果想修改更多地方呢,有沒有解決辦法?強大的 shell 環境告訴我們, 可以!

我們還可以使用 set -o vi 來調用編輯器 vi 來直接修改這些曆史指令,這樣當需要大量修改曆史指令的時候我們可以更有效率的工作。輸入這個指令後,指令行即激活了編輯模式, 我們可以在需要使用曆史指令的時候,敲“Esc”鍵進入 VI 編輯模式, 使用 VI 的“/”,“?”查找曆史指令,使用 VI 的光标移動和編輯指令來修改找到的要修改的目标指令。具體的操作可以參考 VI 的 help 文檔,這裡不再贅述。

回頁首

"." 指令 (csh 下則是 "source" 指令 )

做為一種重要的 UNIX 環境,要熟練使用 AIX,我們應該熟悉指令行界面。是以還是需要先介紹一下 shell 環境。

在 AIX 的預設 KSH 環境下,我們使用到的變量有兩種類型,環境變量和本地變量。我們可以分别使用指令 env 和 set 來檢查這兩種變量的設定, 也可以使用 export 指令将本地變量輸出為環境變量。

這兩種變量的差別是什麼?簡單來說,本地變量隻有目前 shell 可以使用,而環境變量則可以被目前 shell 以及它的子 shell 使用。

這種設定有時會給我們的腳本調試帶來一些額外的工作。比如我們會遇到兩個問題,而這時也是我們需要使用 source 指令來提高我們工作效率的時候:

1)、當我們調用子腳本的時候,為了傳遞必須的變量,我們必須調用 export 輸出所有的子 shell 用到的變量。在變化的環境中有時這種手工的設定很難做到及時準确。當調試複雜腳本集的時候尤其如此。這時我們可以使用 .(csh 下為 source 指令 ) 指令來調用子腳本。所有的本地變量都可以在子腳本中使用。舉個例子:

腳本 test5.sh 的内容為:

清單 7. 腳本 test5.sh

#test5.sh 
 echo "Trying to print Var1: $Var1"

 [email protected]:/experiment>Var1="Local variable a"
 [email protected]:/experiment>./"test5.sh"
 Trying to print Var1: 
 [email protected]:/experiment>. ./"test5.sh"
 Trying to print Var1: Local variable a 
 [email protected]:/experiment> 
      

2)、反過來,還有這樣一種需求,我們每次使用新的 shell 環境時,需要先設定較多的本地變量,我們也可以将這些變量存入一個腳本檔案,每次初始化 shell 環境的時候使用 source 指令調用這個腳本檔案既可。一個典型的例子是 .profile 檔案。比如做為 DB2 執行個體使用者的 db2inst1 的 .profile 檔案可能會有如下幾行:

清單 8. 常用的 db2 使用者 profile 内容

if [ -f /home/db2inst1/sqllib/db2profile ]; then 
    . /home/db2inst1/sqllib/db2profile 
 fi 
      

這就是使用 source 指令來引入了環境變量。

最後簡單提一句,所謂 source 指令方式執行,其實是 shell 沒有 fork 子程序 , 是以所有的變化被記錄到目前的 shell 程序。

回頁首

一些常用指令的技巧

下面介紹一些常用的有益的小技巧: 1)、合并文本檔案: 還在用 windows 工具或者 vi 來合并檔案麼? 介紹一個簡單的方法 ,我們可以采用

cat fileA fileB >fileC 
       

來合并文本檔案 , 或者

cat file?[1-9] >fileSum 
       

來合并大量類似檔案名的檔案 ;

2)、實時監控日志檔案(自動重新整理内容,UNIX 流模式的最佳好處!), 指令很簡單:

tail -f FileName 
      

這樣既可!

3)、find 指令的力量:

Unix 下大量的實用程式極大的豐富了系統的功能 , 這裡簡單列舉 find 的幾個用法:

查詢大于 1000 個 block 的檔案并列出檔案的詳細資訊;

find . -size +10000 -exec ls -l {} \; 
      

查詢屬主為 user1,group 組權限不為 rwx,類型為目錄的資訊,并生成修改其權限的腳本;

find /projects -user user1 \( ! -perm -0020 -o ! -perm -0040  -o ! -perm -0010 \) 
 -type d -exec echo "chmod -R g+rwx " {} \; >/tmp/chmoduser1.sh 2>/tmp/error.log 
      

回頁首

一個好 AIX 指令 - "portmir", 分布環境下的好幫手!

portmir 是一個優秀的 AIX 獨有的小工具。使用它我們可以甚至避免使用 Netmeeting 或者其它類似的遠端桌面共享工具。我把它稱為指令行界面的“桌面共享軟體”。 它的使用很簡單,十分适于分布環境下的開發團隊、系統管理團隊協同工作。 下面介紹一下使用的步驟,先假設你的使用環境是, 你的使用者 ID 是 dev1,你希望 dev2 使用者可以通路、附屬(attach)到你的 login 界面,以便你們兩個人都可以觀察、使用同一個指令行界面, 就如同在同一個機器前 (當然如果你和遠端使用者使用同一個 ID 的時候共享指令行界面更加簡單,但是這在很多開發場景裡邊可能是不允許的。) - 1)、使用使用者 ID dev1 登陸 login 到你項目組裡的 AIX 開發系統上, 這個過程在系統中會打開一個 tty 終端裝置, 這裡假設它是 "pts/1"; (确認自己目前登陸界面的 tty 終端裝置, 隻需要執行指令“who am i”,注意是 3 個分開的單詞,指令 whoami 是不能顯示這些資訊的。) 2)、在你登陸的 ID 的 $HOME 目錄下,建立一個檔案 .mir - touch .mir 3)、編輯這個檔案,在這個檔案裡邊增加一行,内容就是你希望使用你的指令行界面的使用者 ID, 也就是 dev2, 然後儲存退出。 4)、配置結束,遠端使用者在使用 dev2 使用者登陸系統,在他自己的指令行界面下, 輸入指令“portmir -t pts/1”既可鏡像到你的界面了!兩個界面下都可以輸入指令,輸出會被完全一緻的列印在兩個指令行界面下。這裡給一個簡單的例子:

圖 2.,portmir 指令輸出情況系統界面截圖

一個 UNIX 開發者需要掌握的 AIX 技巧
從例子裡邊可以看到,兩個螢幕都可以輸入指令,同步顯示指令的輸入以及輸出。怎麼樣,是不是很神奇?盡情享受吧!
      

回頁首

調試 shell 腳本

UNIX 的強大還展現在它的 shell 語言功能的強大,并且有十分豐富的系統工具。 在 AIX 下我們經常使用的是系統預設的 Korn Shell。通過 shell 語言我們可以寫出十分複雜的腳本來自動化處理大量的系統管理任務甚至應用的業務邏輯。實際開發中,調試這些腳本也是很有必要的。 如何調試呢?這需要用到 shell 的内部指令 set。 我們可以通過在需要調試的腳本程式段前後分别執行 set – x 和 set +x 來打開、關閉 debug 開關。

簡單來說打開這個 debug 開關後, shell 在運作腳本時會逐句列印要執行的指令,然後再輸出指令執行的結果。通過這個指令我們可以快速定位到 shell 邏輯中存在 bug 或者錯誤的地方。

回頁首

解決 "The parameter list is too long"問題

我們都使用 ls 指令來檢視檔案夾下的檔案清單。 但是這個指令并不總是成功。比如常常我們會遇到“

The parameter list is too long”

的報錯。 這是為什麼?

這是因為 shell 本身對輸入指令行是有長度限制的。比如在 AIX 預設的 K shell 環境下,指令行的最大長度是 6*4096 位元組。(參考 sys0 裝置的參數 ncargs)。 知道了問題的原因,解決方案也就随之而來了。 那就是, 我們可以修改這個參數(使用 smit chgsys)來增大系統的預設值,但是這需要 root 權限來執行。對于我們大多數的隻有普通系統權限的使用者, 可以采用減小通配結果的長度或者使用 UNIX 已有的工具來處理。 這裡介紹一個常用的指令 xargs-

find /tmp/ -mtime +7 -print | |xargs -n10 -ti rm {} 
      

通過這個指令,我們可以找到 /tmp 目錄下,七天之前修改的檔案并且删除掉, 無論找到的檔案有多少。

回頁首

檢查檔案系統滿的錯誤

我們都知道 UNIX 檔案系統是層次結構的。一個路徑很深的子目錄下面往往可能存在一個很大的檔案系統, 比如在 /tmp/tmp1/tmp2/tmp3/tmpx/ 下挂着(mount)一塊來自 SAN 存儲的大小為 300GB 的檔案系統。 如果這個子目錄的空間使用在一夜之間突然增加, 甚至讓人意外的已經滿了,向該子目錄寫入内容的程式都将報錯甚至異常退出。 那麼我們如何查找并定位到有問題的檔案?也就是突然增大并填滿子目錄下的這塊 300G 的檔案系統的罪魁禍首是誰? 剛剛介紹的 find 指令在這裡可以大展宏圖了,假設這裡我們想尋找一夜之内修改、更新過的,大小超過 100MB 的檔案, 并且列出最大的十個檔案-

find /tmp -size +204800 -mtime -1 -ls|sort -rnk7|head 
      

這樣基本上我們可以立即定位到有問題的檔案,并且進行相應的檢查和處理。 簡單的情況下我們也可以使用 du 指令來快速定位。 才用“du – sk *|sort – nk1”指令我們可以依次找到占用最大空間的子目錄、檔案, 進而快速定位問題的元兇

回頁首

一個遊戲 - 介紹如何正确使用指令 "ln"

我們一起做個小遊戲。 來猜猜這些簡單的指令的執行結果:

清單 9. 遊戲涉及的指令

cd /Lib/lab3 
 ln -s /Lib/lab3 abc 
 while true; do cd abc; sleep 1; done 
      

等待 15 秒, 然後取消循環。

運作 pwd 指令,結果會是如何?!猜不到?現在來公布答案吧-

清單 10. pwd 指令輸出

/Lab/lab3/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc/abc 
      

有趣吧?!原來 UNIX 下不光有企業應用,用 script 我們可以寫出貪吃蛇遊戲, 也可以用來檢視“奇迹”!

這個遊戲也告訴我們要正确使用 

ln

指令。尤其是在使用符号連結來連接配接一個絕對路徑的時候。

回頁首

總結

AIX 是個豐富多彩的世界。本文通過執行個體由淺入深的介紹了對 AIX 環境下系統的檢查(配置,運作情況)、配置(指令提示符,PATH 變量)、使用(history 指令複用,source 指令使用,一些指令技巧,好用的指令 portmir)、排錯(調試 shell,解決指令使用報錯,檔案系統滿,以及一個小遊戲來介紹 ln 指令可能産生的錯誤和調整思路)的常用技巧,相信讀者在細讀本文後, 對 AIX 的使用必将達到一個新的層次。

參考資料

學習

  • P Series and AIX Information Center,從這裡 可以了解更多 AIX 相關技術。 
  • AIX Commands Reference,可了解更多相關指令使用方法。 
  • AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的資訊,您可以利用它們來擴充自己的 UNIX 技能。
  • AIX and UNIX 新手入門:通路“AIX and UNIX 新手入門”頁面可了解更多關于 AIX 和 UNIX 的内容。
  • AIX and UNIX 專題彙總:AIX and UNIX 專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,為了友善您的通路,我們在這裡為您把本專區的所有專題進行彙總,讓您更友善的找到您需要的内容。
  • AIX and UNIX 下載下傳中心:在這裡你可以下載下傳到可以運作在 AIX 或者是 UNIX 系統上的 IBM 伺服器軟體以及工具,讓您可以提前免費試用他們的強大功能。
  • IBM Systems Magazine for AIX 中文版:本雜志的内容更加關注于趨勢和企業級架構應用方面的内容,同時對于新興的技術、産品、應用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分資深的業内人士撰寫的,包括 IBM 的合作夥伴、IBM 的主機工程師以及進階管理人員。是以,從這些内容中,您可以了解到更高層次的應用理念,讓您在選擇和應用 IBM 系統時有一個更好的認識。