加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 中小企業專區
分享到Plurk
分享到FaceBook
 
免費IT建置--
Linux系統操作與管理
文‧圖/柳百郁 2011/7/19 下午 03:32:09

每套Linux分支套件都會提供基本系統管理工具組,供系統操作員與管理者,透過指令與程式調整系統或解決系統的基本問題,只是工具程式版本不同,而可能在選項與參數的搭配上會略有差異,在結果上可能也有些微不同。

市面上有相當多Linux指令集的相關書籍,可以找到完整的指令目錄與用法。這裡將針對初接觸Linux的管理者或一般使用者,介紹最基本的幾個重要指令,會是Linux學習之旅的開始,且不及你將會用上的百分之一。系統背景將以Fedora分支套件為基礎,若範例與讀者實際操作的結果有所不同,可以man一下,瞭解指令在系統裡的正確用法,那麼就從man這個指令開始吧!

遇上不會用的指令,就man一下
有時知道某個指令可以完成當下任務,但完全不知道如何下參數得到想要的結果,有時那個指令已經用了很多遍,就是忘了某個參數應該先下還是後下,這時侯在系統裡man一下這個指令,就能迅速得到解答:
$ man tar <= 顯示『打包檔案的指令tar』的用法
<略>
NAME
tar - manual page for tar 1.22 <= 這是tar 1.22版的用法說明
SYNOPSIS
tar [OPTION...] [FILE]... <= 語法是先指定選項、後選擇檔案
DESCRIPTION
GNU ‘tar’ saves many files together into a single tape or disk archive, and can restore individual files from the archive. <= 指令敘述,部份工具已可顯示中文說明
EXAMPLES
tar -cf archive.tar foo bar <= 範例:建立一個名為archive.tar的打包檔,內容是foo與bar這兩個檔
<略>
光是man這個指令,也有相當精細的使用方式,例如當想瞭解某個組態檔的設定方式,就可以指定【man 5 <組態檔>】,讓系統顯示的是組態檔,而非指令的用法。除了man之外,想要更詳盡瞭解指令,也可以透過info的方式,指令下達方式與man類同【info <指令>】,只是用這個方式會以info的格式顯示說明,資訊也較為完整。

另一個常見的指令查詢為help,用法為【<指令> --help】或【<指令> -h】,這是比man更簡短、更速成的使用方式。

檔案操作
無論是本機或遠端登入,在系統上輸入帳號與對應的密碼後,會來到該帳號使用者的家目錄。你可以執行【pwd指令:瞭解現在所在目錄為何】,另一方面當在系統裡處理問題,不斷切換目錄操作一段時間後,不知身在何處時,也可以用這個指令瞭解現在處於哪個目錄下。

使用cd切換目錄時,除了常見的「..」 (兩個連續英文句點)切換為上一個目錄外,有時為省去打字時間,可以使用【cd -:切換到上一個所處的目錄】,例如cd /etc/sysconfig/network-scripts/切換目錄編輯網路介面組態檔後,cd /tmp至tmp目錄下查詢資料,此時若想再回到/etc/sysconfig/network-scripts/目錄下時,可以直接輸入「cd -」,便能切換至上一個停留過的目錄(並非上一層)。

在檔案處理時,ls也是使用率相當高的指令。ls是用來列出所處目錄下的所有檔案與目錄(類似dos系統裡的dir),當需要檔案與目錄的詳細資料,例如權限、大小、變更的時間等等,或是需要其它的列表方式時,可以搭配不同的參數:
$ ls -l <= 列出該目錄下所有檔案目錄的詳盡資訊
$ ls -la <= 列出該目錄下所有檔案目錄-包括隱藏檔的詳盡資訊
$ ls -S <= 大寫S,以檔案大小排序
$ ls -t <= 以變更時間排序
對系統管理者而言,最常出現的任務,不外乎編輯組態檔與查看事件紀錄檔。在Linux的分支套件裡,絕大多數皆提供vi(套件名稱為vim)作為文字模式下的編輯器。
# vi /etc/inittab <=以vi編輯器開啟/etc/inittab檔
<略>
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
"/etc/inittab" 26L, 853C <= vi編輯器最末端出現正修改中的檔名、行數、字元數(character)
部份遠端連線軟體對鍵盤處理的解讀與本機不同,甚至本機上對vi的處理,也會因為版本不同而有所差異,較常見的是不支援鍵盤的上下左右鍵,這時可以使用正規的K、J、H與L鍵,依序個別代表上、下、左與右。如須編輯內容,則先輸入I,進入vi編輯器的插入模式即可編輯。vi編輯器的其它的用法還有:
DD=>連續按兩次D鍵,刪除游標所在行列
X=>刪除游標所在字母
YY=>連續按兩次Y鍵,複製游標所在行列
P=>貼上方才所複製行列
:=>冒號,進入vi的命令模式,在命令模式下可輸入指令進行處理,較常見的是輸入w表示對檔案寫入方才作的變更、輸入q則為離開,因此離開vi的方式之一為【:wq存檔離開】,或【:q!忽略方才所作的所有變更,不存檔離開】。
/=>搜尋關鍵字。於/之後輸入要尋找的關鍵字(英文字母大小寫有別),找到後輸入小寫n可搜尋下一個相同關鍵字、大寫N則是回到上一個。
一般來說只有需要編輯檔案時才使用vi,若只是查看事件紀錄檔(log),建議使用less,less比早期的more更具彈性、功能更多,例如less /var/log/messages:以less檢視器查看messages檔。進入less檢視器後基本操作則有:
j=>下一行
k=>上一行
/=>搜尋關鍵字。於/之後輸入要尋找的關鍵字(英文字母大小寫有別),找到後輸入小寫n可搜尋下一個相同關鍵字、大寫N則是回到上一個。
p=>回到第一行/頁
q=>離開
:<行號>=>指定游標直接到哪一行列
查看事件紀綠檔時有個方便的小技巧,一般來說系統異常時,就會需要查看事件紀錄檔,有時問題發生在當下,管理者需要進行一些測試查看事件檔的變化。這時,很可能只需要查看事件紀錄檔最後更新的幾行,透過tail指令可以完成此任務,例如:tail -n 20 /var/log/messages,查看messages檔的最末二十行,省略-n 20則顯示最後(預設值)十行。筆者另一個常用的方式是tail -f /var/log/messages,指定「-f」選項,會將螢幕畫面鎖定在不斷更新檔案的狀態,過程中透過Enter鍵可區隔時間或等待中的資訊,即時瞭解該檔案的變化,最後按下Ctrl+C鍵即可離開。

網路與系統狀態的查測
netstat可以說是最常用的連線檢測程式,基本用法是查看主機正在聆聽的通訊埠有哪些,它的代表IP位址為何,及其於系統裡執行的程序ID,進一步還可以透過指令瞭解,正與系統連結某個特定服務的主機有哪些。


▲ netstat瞭解主機連線狀態


上圖使用了netstat的t、n與p三個參數,分別代表TCP通訊埠、以數字(number)表示通訊埠,以及列出程序(process)。因此結果分別為,列出192.168.0.105主機的tcp連線狀態,正與主機59341通訊埠連結的外部主機為207.46.124.177,其窗口為1863埠,且與主機56559通訊埠連結的外部主機,為72.14.203.17的80埠,其狀態為『已建立連線』,於本機上使用的程式為pidgin與google-chrome。

為了找出子網域裡還沒用的IP位址,或是確認本機服務是否已正常開啟時,筆者習慣用nmap。以正式說法來講,nmap是用來探測網路的工具,也作安全性與通訊埠掃瞄用途,它能作的不只是瞭解本機以及本機所掛載的各個IP位址,對外開啟了哪些通訊埠(服務),還能掃瞄整個子網路有哪些IP位址正在使用,以及各開啟了哪些服務。
# nmap -v -sP 192.168.0.0/24 <=將以Ping的方式掃瞄256台主機
<略>
Nmap scan report for 192.168.0.105
Host is up. <= 192.168.0.104這台主機是活著的
Initiating ARP Ping Scan at 14:18
Scanning 150 hosts [1 port/host] <=繼續掃瞄接下來的150台主機
Completed ARP Ping Scan at 14:18, 1.62s elapsed (150 total hosts)
Initiating Parallel DNS resolution of 150 hosts. at 14:18
Completed Parallel DNS resolution of 150 hosts. at 14:18, 0.02s elapsed
Nmap scan report for 192.168.0.106 [host down] <=192.168.0.106主機未啟動
<略>
# nmap 192.168.0.105 <=簡單掃瞄192.168.0.105這台主機開啟哪些通訊埠,以localhost取代IP位址則可掃瞄本機所開啟的通訊埠
Starting Nmap 5.21 ( http://nmap.org ) at 2011-03-05 14:26 CST
Nmap scan report for 192.168.0.105
Host is up (0.000015s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
111/tcp open rpcbind <=本機開啟111通訊埠,其服務為rpcbind
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
當系統執行速度過慢,或啟動某個程式後系統感覺不對勁時,可以透過top瞭解當下耗用系統資源最多的程序,以及瞭解記憶體的使用狀況。


▲ top指令瞭解系統目前執行狀態


就上圖而言,現行耗用主機最多資源的就屬chrome指令,top會將耗用最多資源的指令列排在清單第一位,由大至小依序排列,且三秒鐘更新一次。

除了top外,另一個常用來查詢系統執行中程序的指令為ps,它可以列出系統現正執行中的所有指令,並以時間序排列,透過top或ps找到有問題的程序編號後,只需要透過kill指令砍除即可:
# ps aux <=列出所有執行中的程序,BSD與UNIX規定使用-aux,Linux/Fedora下則兩者皆為可行,唯-aux時會出現警告訊息
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <=首行列出各欄位資訊為何
root 1 0.0 0.0 4076 852 ? Ss 12:57 0:00 /sbin/init
<略>
nicholas 6583 1.9 1.1 984128 47108 ? Sl 16:21 0:07 /opt/google/chrome/chrome --type=rendere
root 6693 2.0 0.0 11024 924 pts/0 R+ 16:27 0:00 ps -aux
# kill -9 6583 <=刪除編號為6583的程序(ps第二欄PID為程序編號),使用-9參數為『強制』刪除此程序,許多頑強的程序需加上-9才得已刪除
伺服器運作
筆者習慣上於系統初架設完成時,會先以chkconfig指令查看開機時,將自動啟動的服務有哪些,將不必要的服務關閉,此舉除了避免不必要的程式與服務浪費系統與網路資源外,另一方面就資訊安全的原則來說,開啟的通訊埠越少、風險也就越低。
# chkconfig <=列出本機所有服務在各個執行層級是否自動開啟
<略>
bluetooth 0:off 1:off 2:off 3:off 4:off 5:off 6:off
xend 0:off 1:off 2:off 3:on 4:on 5:on 6:off
# chkconfig xend off <=關閉xend服務在所有層級的自動啟動
# chkconfig | grep 3:on <=表列執行層級3之下,自動開啟的服務有哪些
chkconfig是用來關閉『系統開機時自動開啟的服務』,對現正執行中與停止中的服務不產生任何影響。就RedHat/Fedora而言,伺服器與服務當下的執行與否,通常以service指令來完成,例如:service httpd stop,當下停止httpd的服務。事實上,這些服務存放在/etc/init.d/下,因為部份服務名稱與使用上的稱呼不盡相同,例如httpd或http或dns伺服器與named,因此筆者會建議透過此目錄下指令可以省下錯誤嘗試的時間:
# service httpd status <=瞭解httpd服務的現行狀態,方法一
httpd 已停止
# /etc/init.d/httpd status <=瞭解httpd服務的現行狀態,方法二
httpd is stopped <=httpd現在為停止執行的狀態
系統執行過程中,伺服器與服務的啟動、停止等動作,皆以此方式執行,但透過原始程式碼自行編譯完成的伺服器,則不一定如此,需視編譯時套件的說明而定。

事件紀錄檔-log,記錄系統與網路的大小事
Linux分支套件RedHat/Fedora預設將事件紀錄檔存放在/var/log目錄下,有些服務會在這個目錄下再建一個自已的子目錄,例如httpd與samba等。以系統管理者而言,最常查看的應該就是messages與secure事件紀錄檔。系統執行時留下的紀錄,以及可能產生的一般性問題,都可以透過此檔找到答案;secure則紀錄與安全性、權限有關的資訊,例如若有使用者試圖以沒有權限的身份登入,產生失敗時,就會在這個檔裡留下紀錄。
# less /var/log/secure
Mar 5 18:30:06 JNT unix_chkpwd[7013]: password check failed for user (root)
Mar 5 18:30:06 JNT su: pam_unix(su-l:auth): authentication failure; logname=nicholas uid=500 euid=0 tty=pts/0 ruser=nicholas rhost= user=root
使用者於三月五日晚間六點半左右,試圖以root身份登入JNT主機,密碼確認失敗,第二行則顯示該使用者在切換為root身份前,登入名稱為nicholas。

crontab與at
讓系統在指定時間,為系統管理者執行一些工作是必要的,尤其是可以將一些會耗用系統資源、影響執行效能或網路流量的工作,分散在離峰時間執行,可以讓伺服器系統更有效率,例如尖峰時間處理日常作業、服務客戶,離峰時間整理系統、執行備份等不具時效性的作業。
crontab與at乃Linux裡較常見的兩個命令列排程工具,最簡單的差別在於at用於一次性的執行,例如希望系統在明天這個時侯、或下週某個時間執行特定程式,而且就執行這麼一次或兩次,而非每週或每天固定執行,此時使用at是最簡便的。
# at -f cp.sh 22:30 <=設定at於22時30分執行cp.sh檔,此檔將作簡單的檔案備份
# ls Re* <=此時目錄下不存在仍未複製的目的檔ReadmeWithAt.txt
ls: 無法存取 Re*: 沒有此一檔案或目錄
# date <=已過設定執行的時間22時30分
二 3月 8 22:31:01 CST 2011
# ls Re* <=表列目錄發現檔案已經複製過來
ReadmeWithAt.txt
# atq <=查詢at佇列中還有哪些工作未執行
25 2011-03-08 21:58 a nicholas
24 2011-03-08 21:56 a nicholas
# atrm 24 25 <= at任務編號24與25已過執行時間或不再需要執行,則透過atrm刪除之
一次性執行的動作,管理者可以寫一個簡單的script,將之設定為可執行模式,測試執行無誤後即可交由at程式在你想要的時間執行之。

crontab則是較廣為管理者熟知與使用的排程程式,多數預設自動執行的應用程式亦使用它來完成任務,例如事件紀錄檔的整理與打包、locate資料庫建立等等。/etc目錄下,為crontab的執行分別建立了日、時、月、周的目錄,方便使用者將要執行的程式分門別類放在對應的目錄下。
# cat /etc/crontab <=預設系統檔(取自CentOS)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly <=預設每小時零一分時執行此目錄下的程式
02 4 * * * root run-parts /etc/cron.daily <=預設每天四時零二分執行此目錄下的程式
22 4 * * 0 root run-parts /etc/cron.weekly <=預設每周日(0與7皆可代表)的四時二十二分執行此目錄下的程式
42 4 1 * * root run-parts /etc/cron.monthly <=預設每月一日的四時四十二分執行此目錄下的程式
由系統預設檔中可以瞭解,執行日期或時間的設定中(最末四行),前五個數字依序代表了分、時、日、月與週,接下來才是欲執行的程式。就個別使用者而言,應透過crontab -e,進入自有的設定表格,依『分 時 日 月 週 指令』的格式,設定自動執行的任務。
# crontab -e <=以使用者nicholas身份執行crontab編輯模式
57 22 8 3 * /home/nicholas/tar.sh <= 設定每年三月八日22時57分執行tar.sh程式
:wq <=以vi存檔模式wq離開crontab編輯模式(crontab預設以vi為編輯器)
# crontab -l <=查看當下使用者身份有哪些cron job設定執行
文章篇幅有限,不可能盡述首次使用Linux會用得上的指令。由於各種系統與分支套件都可能面臨各種不同的狀況,透過上述有限的指令,瞭解你所使用的系統狀況,遇上不熟悉的指令時,系統本身就提供了健全的man使用手冊來引領你學習與解決問題。

藉由本文的介紹作為起點,對各個指令的用法若能有更深入的瞭解,就能對系統有更深一層的認識,接下來對於伺服器與應用的建置,也就更容易上手。