但如果你常常上網去查看一些數據的話,尤其是 Unix-Like 的相關操作系統,應該常常看到『請啟動某某 daemon 來提供某某功能』,唔!那么 daemon 與 service 有關啰?否則為什么都能夠提供某些系統或網絡功能?此外,這個 daemon 是什么東西呀? daemon 的字面上的意思就是『守護神、惡魔?』還真是有點奇怪呦!^_^""!
簡單的說,系統為了某些功能必須要提供一些服務 (不論是系統本身還是網絡方面),這個服務就稱為 service 。 但是 service 的提供總是需要程序的運行吧!否則如何運行呢?所以達成這個 service 的程序我們就稱呼他為 daemon 啰! 舉例來說,達成循環型例行性工作排程服務 (service) 的程序為 crond 這個 daemon 啦!這樣說比較容易理解了吧!
一般來說,當我們以文本模式或圖形模式 (非單人維護模式) 完整啟動進入 Linux 主機后, 系統已經提供我們很多的服務了!包括打印服務、工作排程服務、郵件管理服務等等; 那么這些服務是如何被啟動的?他們的工作型態如何?底下我們就來談一談啰!
daemon 的主要分類
如果依據 daemon 的啟動與管理方式來區分,基本上,可以將 daemon 分為可獨立啟動的 stand alone , 與透過一支 super daemon 來統一管理的服務這兩大類,這兩類 daemon 的說明如下:],這兩類 daemon 的說明如下:
stand_alone:此 daemon 可以自行單獨啟動服務動服務
就字面上的意思來說,stand alone 就是『獨立的啟動』的意思。這種類型的 daemon 可以自行啟動而不必透過其他機制的管理; daemon 啟動並加載到內存后就一直占用內存與系統資源。最大的優點就是:因為是一直存在內存內持續的提供服務, 因此對於發生客戶端的要求時,stand alone 的 daemon 響應速度較快。常見的 stand alone daemon 有 WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。
super daemon: 一支特殊的 daemon 來統一管理
這一種服務的啟動方式則是藉由一個統一的 daemon 來負責喚起服務!這個特殊的 daemon 就被稱為 super daemon 。 早期的 super daemon 是 inetd 這一個,后來則被 xinetd 所取代了。這種機制比較有趣的地方在於, 當沒有客戶端的要求時,各項服務都是未啟動的情況,等到有來自客戶端的要求時, super daemon 才喚醒相對應的服務。當客戶端的要求結束后,被喚醒的這個服務也會關閉並釋放系統資源。
這種機制的好處是: (1)由於 super daemon 負責喚醒各項服務,因此 super daemon 可以具有安全控管的機制,就是類似網絡防火牆的功能啦! (2)由於服務在客戶端的聯機結束后就關閉,因此不會一直占用系統資源。但是缺點是什么呢? 因為有客戶端的聯機才會喚醒該服務,而該服務加載到內存的時間需要考慮進去,因此服務的反應時間會比較慢一些啦! 常見的 super daemon 所管理的服務例如 telnet 這個玩意兒就是啦!
如上所示,Super daemon 是常駐在內存中的, Program 1, 2, 3 則是啟動某些服務的程序 (未被啟動狀態)。當有客戶端的要求時, Super daemon 才會去觸發相關的程序加載成為 daemon 而存在於內存中,此時,客戶端的要求才會被 Super daemon 導向 Daemon 1 去達成聯機!當客戶端的要求結束時,Daemon 1 將會被移除,圖中實線的聯機就會中斷啰!
窗口類型的解說
那么這兩種啟動的方式哪一個比較好呢?見仁見智啦!而且還要看該主機的工作負荷與實際的用途說! 例如當你的主機是用來作為 WWW 服務器的,那么 httpd 自然就以 stand alone 的啟動方式較佳!事實上,我們常常開玩笑的說明 stand alone 與 super daemon 的情況,可以銀行的窗口來作為說明的范例喔!
個別窗口負責單一服務的 stand alone:
在銀行里面,假設有一種單一服務的窗口,例如存錢窗口,所以當你需要存錢的時候,直接前往該窗口,就有『專人』為你服務啦! 這就是 stand alone 的情況。
統一窗口負責各種業務的 super daemon:
在銀行里面假設還有另外一種復合型態的統一窗口,同時提供轉賬、資金調度、提款等等的業務,那當你需要其中一項業務的時候, 就需要前往該窗口。但是坐在窗口的這個營業員,拿到你的需求單之后,往后面一丟『喂!那個轉賬的仁兄!該你的工作了』 那么那個仁兄就開始工作去!然而里頭還有資金調度與提款等負責業務的仁兄呢?他們在干嘛?嘿嘿!看看報、喝喝茶啰!
那么這里就會引出另外一個問題啦!假設銀行今天的人潮特別的洶涌,所以這個窗口后面除了你之外還有很多的人! 那么想一想,這個窗口是要『一個完成再來下一個』還是『全部都把你們的單據拿來,我全部處理掉』呢?呵呵! 是不是不太一樣?基本上,針對這種 super daemon 的處理模式有兩種,分別是這樣:
multi-threaded (多重線程):
就是我們提到的,全部的客戶之要求都給他拿來,一次給他交辦下去,所以一個服務同時會負責好幾個程序。
single-threaded (單個線程):
這個就是目前我們『人類的銀行』最常見的方式啦,不論如何,反正一個一個來,第一個沒有處理完之前,后面的請排隊!嘿嘿! 所以如果 client 的要求突然大增的話,那么這些晚到的 client 可得等上一等!
如上所示,左側為多重運行的方式, daemon 會一直被觸發多支程序來提供不同 client 的服務,所以不論你是第幾個登陸者, 都可以享用 daemon 的服務。至於右側則是單一運行的方式,僅會有一支 daemon 被喚醒,第一個用戶達成聯機后, 后續想要聯機的用戶就得要等待,因此她們的聯機不會成功的。
另外,需要注意的是,既然銀行里頭有這兩種窗口同時存在,所以啰,在 Linux 系統里面,這兩種 daemon 的啟動方式也是可以同時存在的啦!也就是說,某些服務可以使用 stand alone 來啟動,而有些其他的服務則可以使用 xinetd 這個 super daemon 來管理,大致的情況就是這樣啦!瞭乎!
daemon 工作形態的類型
如果以 daemon 提供服務的的工作狀態來區分,又可以將 daemon 分為兩大類,分別是:
signal-control
這種 daemon 是透過訊號來管理的,只要有任何客戶端的需求進來,他就會立即啟動去處理!例如打印機的服務 (cupsd)。
interval-control
這種 daemon 則主要是『每隔一段時間就主動的去運行某項工作』,所以,你要做的是在配置文件指定服務要進行的時間與工作, 該服務在指定的時間才會去完成工作。我們在第十六章提到的 atd 與 crond 就屬於這種類型的 daemon 啦 (每分鍾偵測一次配置文件)
另外,如果你對於開發程序很有興趣的話,那么可以自行查閱一下『 man 3 daemon 』看看系統對於 daemon 的詳細說明吧! ^_^。
daemon 的命名守則
每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不過,無論如何,這些服務的名稱被創建之后,被掛上 Linux 使用時,通常在服務的名稱之后會加上一個 d ,例如例行性命令的創建的 at, 與 cron 這兩個服務, 他的程序文件名會被取為 atd 與 crond,這個 d 代表的就是 daemon 的意思。所以,在第十七章中,我們使用了 ps 與 top 來觀察程序時,都會發現到很多的 {xxx}d 的程序,呵呵!通常那就是一些 daemon 的程序啰!
服務與端口的對應
從第十七章與前一小節對服務的說明后,你應該要知道的是, 系統所有的功能都是某些程序所提供的,而程序則是透過觸發程序而產生的。同樣的,系統提供的網絡服務當然也是這樣的! 只是由於網絡牽涉到 TCP/IP 的概念,所以顯的比較復雜一些就是了。
玩過因特網 (Internet) 的朋友應該知道 IP 這玩意兒,大家都說 IP 就是代表你的主機在因特網上面的『門牌號碼』。 但是你的主機總是可以提供非常多的網絡服務而不止一項功能而已,但我們僅有一個 IP 呢!當客戶端聯機過來我們的主機時, 我們主機是如何分辨不同的服務要求呢?那就是透過埠號 (port number) 啦!埠號簡單的想象,他就是你家門牌上面的第幾層樓! 這個 IP 與 port 就是因特網聯機的最重要機制之一啰。我們拿底下的網址來說明:
http://ftp.isu.edu.tw/
ftp://ftp.isu.edu.tw/
有沒有發現,兩個網址都是指向 ftp.isu.edu.tw 這個義守大學的 FTP 網站,但是瀏覽器上面顯示的結果卻是不一樣的? 是啊!這是因為我們指向不同的服務嘛!一個是 http 這個 WWW 的服務,一個則是 ftp 這個文件傳輸服務,當然顯示的結果就不同了。
事實上,為了統一整個因特網的端口號對應服務的功能,好讓所有的主機都能夠使用相同的機制來提供服務與要求服務, 所以就有了『通訊協議』這玩意兒。也就是說,有些約定俗成的服務都放置在同一個埠號上面啦!舉例來說, 網址列上面的 http 會讓瀏覽器向 WWW 服務器的 80 埠號進行聯機的要求!而 WWW 服務器也會將 httpd 這個軟件激活在 port 80, 這樣兩者才能夠達成聯機的!
嗯!那么想一想,系統上面有沒有什么配置可以讓服務與埠號對應在一起呢?那就是 /etc/services 啦!
[root@www ~]# cat /etc/services
....(前面省略)....
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
....(中間省略)....
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Protocol
....(底下省略)....
# 這個文件的內容是以底下的方式來編排的:
# <daemon name> <port/封包協議> <該服務的說明>
像上面說的是,第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的端口號與網絡數據封包協議, 封包協議主要為可靠聯機的 TCP 封包以及較快速但為非面向連接的 UDP 封包。 舉個例子說,那個遠程聯機機制使用的是 ssh 這個服務,而這個服務的使用的埠號為 22 !就是這樣啊!
daemon 的啟動腳本與啟動方式
提供某個服務的 daemon 雖然只是一支程序而已,但是這支 daemon 的啟動還是需要運行檔、配置文件、運行環境等等, 舉例來說,你可以查閱一下 httpd 這個程序 (man httpd) ,里面可談到不少的選項與參數呢!此外,為了管理上面的方便, 所以通常 distribution 都會記錄每一支 daemon 啟動后所取得程序的 PID 在 /var/run/ 這個目錄下呢! 還有還有,在啟動這些服務之前,你可能也要自行處理一下 daemon 能夠順利運行的環境是否正確等等。鳥哥這里要講的是, 要啟動一支 daemon 考慮的事情很多,並非單純運行一支程序就夠了。
為了解決上面談到的問題,因此通常 distribution 會給我們一個簡單的 shell script 來進行啟動的功能。 該 script 可以進行環境的偵測、配置文件的分析、PID 文件的放置,以及相關重要交換文件案的鎖住 (lock) 動作, 你只要運行該 script ,上述的動作就一口氣連續的進行,最終就能夠順利且簡單的啟動這個 daemon 啰! 這也是為何我們會希望你可以詳細的研究一下第十三章的原因啊。
OK!那么這些 daemon 的啟動腳本 (shell script) 放在哪里啊?還有, CentOS 5.x 通常將 daemon 相關的文件放在哪里? 以及某些重要的配置文件又是放置到哪里?基本上是放在這些地方:
/etc/init.d/* :啟動腳本放置處
系統上幾乎所有的服務啟動腳本都放置在這里!事實上這是公認的目錄,我們的 CentOS 實際上放置在 /etc/rc.d/init.d/ 啦! 不過還是有配置連結檔到 /etc/init.d/ 的!既然這是公認的目錄,因此建議您記憶這個目錄即可!
/etc/sysconfig/* :各服務的初始化環境配置文件
幾乎所有的服務都會將初始化的一些選項配置寫入到這個目錄下,舉例來說,登錄檔的 syslog 這支 daemon 的初始化配置就寫入在 /etc/sysconfig/syslog 這里呢!而網絡的配置則寫在 /etc/sysconfig/network 這個文件中。 所以,這個目錄內的文件也是挺重要的;
/etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件
super daemon 的主要配置文件 (其實是默認值) 為 /etc/xinetd.conf ,不過我們上面就談到了, super daemon 只是一個統一管理的機制,他所管理的其他 daemon 的配置則寫在 /etc/xinetd.d/* 里頭喔!
/etc/* :各服務各自的配置文件
第六章就講過了,大家的配置文件都是放置在 /etc/ 底下的喔!
/var/lib/* :各服務產生的數據庫
一些會產生數據的服務都會將他的數據寫入到 /var/lib/ 目錄中。舉例來說,數據庫管理系統 MySQL 的數據庫默認就是寫入 /var/lib/mysql/ 這個目錄下啦!
/var/run/* :各服務的程序之 PID 記錄處
我們在第十七章談到可以使用訊號 (signal) 來管理程序, 既然 daemon 是程序,所以當然也可以利用 kill 或 killall 來管理啦!不過為了擔心管理時影響到其他的程序, 因此 daemon 通常會將自己的 PID 記錄一份到 /var/run/ 當中!例如登錄文件的 PID 就記錄在 /var/run/syslogd.pid 這個文件中。如此一來, /etc/init.d/syslog 就能夠簡單的管理自己的程序啰。
上面談到的部分是配置文件,那么 stand alone 與 super daemon 所管理的服務啟動方式怎么作呢?他是這樣做的喔:
Stand alone 的 /etc/init.d/* 啟動
剛剛談到了幾乎系統上面所有服務的啟動腳本都在 /etc/init.d/ 底下,這里面的腳本會去偵測環境、搜尋配置文件、 加載 distribution 提供的函數功能、判斷環境是否可以運行此 daemon 等等,等到一切都偵測完畢且確定可以運行后, 再以 shell script 的 case....esac 語法來啟動、關閉、 觀察此 daemon 喔!我們可以簡單的以 /etc/init.d/syslog 這個登錄檔啟動腳本來進行說明:
[root@www ~]# /etc/init.d/syslog
用法: /etc/init.d/syslog {start|stop|status|restart|condrestart}
# 什么參數都不加的時候,系統會告訴你可以用的參數有哪些,如上所示。
范例一:觀察 syslog 這個 daemon 目前的狀態
[root@www ~]# /etc/init.d/syslog status
syslogd (pid 4264) 正在運行...
klogd (pid 4267) 正在運行...
# 代表 syslog 管理兩個 daemon ,這兩個 daemon 正在運行中啦!
范例二:重新讓 syslog 讀取一次配置文件
[root@www ~]# /etc/init.d/syslog restart
正在關閉核心記錄器: [ 確定 ]
正在關閉系統記錄器: [ 確定 ]
正在啟動系統記錄器: [ 確定 ]
正在啟動核心記錄器: [ 確定 ]
[root@www ~]# /etc/init.d/syslog status
syslogd (pid 4793) 正在運行...
klogd (pid 4796) 正在運行...
# 因為重新啟動過,所以 PID 與第一次觀察的值就不一樣了!這樣了解乎?
由於系統的環境都已經幫你制作妥當,所以利用 /etc/init.d/* 來啟動、關閉與觀察,就非常的簡單!話雖如此, CentOS 還是有提供另外一支可以啟動 stand alone 服務的腳本喔,那就是 service 這個程序。 其實 service 僅是一支 script 啦,他可以分析你下達的 service 后面的參數,然后根據你的參數再到 /etc/init.d/ 去取得正確的服務來 start 或 stop 哩!他的語法是這樣的啦:
[root@www ~]# service [service name] (start|stop|restart|...)
[root@www ~]# service --status-all
選項與參數:
service name:亦即是需要啟動的服務名稱,需與 /etc/init.d/ 對應;
start|... :亦即是該服務要進行的工作。
--status-all:將系統所有的 stand alone 的服務狀態通通列出來
范例三:重新啟動 crond 這支 daemon :
[root@www ~]# service crond restart
[root@www ~]# /etc/init.d/crond restart
# 這兩種方法隨便你用哪一種來處理都可以!不過鳥哥比較喜歡使用 /etc/init.d/*
范例四:顯示出目前系統上面所有服務的運行狀態
[root@www ~]# service --status-all
acpid (pid 4536) 正在運行...
anacron 已停止
atd (pid 4694) 正在運行...
....(底下省略)....
這樣就將一堆服務的運行狀態欄出,你也可以根據這個輸出的結果來查詢你的某些服務是否正確運行了啊!^_^! 其實,在上面的范例當中,啟動方式以 service 這個程序,或者直接去到 /etc/init.d/ 底下啟動,都一樣啦!自行去解析 /sbin/service 就知道為啥了! ^_^
Super daemon 的啟動方式
其實 Super daemon 本身也是一支 stand alone 的服務,看圖 1.1.1 就知道啦!因為 super daemon 要管理后續的其他服務嘛,他當然自己要常駐在內存中啦!所以 Super daemon 自己啟動的方式與 stand alone 是相同的! 但是他所管理的其他 daemon 就不是這樣做啰!必須要在配置文件中配置為啟動該 daemon 才行。配置文件就是 /etc/xinetd.d/* 的所有文件。那如何得知 super daemon 所管理的服務是否有啟動呢?你可以這樣做:
[root@www ~]# grep -i 'disable' /etc/xinetd.d/*
....(前面省略)....
/etc/xinetd.d/rsync: disable = yes
/etc/xinetd.d/tcpmux-server: disable = yes
/etc/xinetd.d/time-dgram: disable = yes
/etc/xinetd.d/time-stream: disable = yes
因為 disable 是『取消』的意思,因此如果『 disable = yes 』則代表取消此項服務的啟動,如果是『 disable = no 』 才是有啟動該服務啦!假設我想要啟動如上的 rsync 這個服務,那么你可以這樣做:
# 1. 先修改配置文件成為啟動的模樣:
[root@www ~]# vim /etc/xinetd.d/rsync
# 請將 disable 那一行改成如下的模樣 (原本是 yes 改成 no 就對了)
service rsync
{
disable = no
....(后面省略)....
# 2. 重新啟動 xinetd 這個服務
[root@www ~]# /etc/init.d/xinetd restart
正在停止 xinetd: [ 確定 ]
正在激活 xinetd: [ 確定 ]
# 3. 觀察啟動的端口
[root@www ~]# grep 'rsync' /etc/services <==先看看端口是哪一號
rsync 873/tcp # rsync
rsync 873/udp # rsync
[root@www ~]# netstat -tnlp | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4925/xinetd
# 注意看!啟動的服務並非 rsync 喔!而是 xinetd ,因為他要控管 rsync 嘛!
# 若有疑問,一定要去看看圖 1.1.1 才行!
也就是說,你先修改 /etc/xinetd.d/ 底下的配置文件,然后再重新啟動 xinetd 就對了!而 xinetd 是一個 stand alone 啟動的服務!這部份得要特別留意呢!
轉自:http://vbird.dic.ksu.edu.tw/linux_basic/0560daemons_1.php