daemon介紹
大家可能常聽到daemon,而什麼是daemon可能不太清楚,我的理解是讓服務啟動的東東稱為daemon。而服務(service)就是為我們提供服務(如web mail ftp等)的東東。所以說,我們是通過daemon來管理service的。而很多時候我們也把daemon說成service,其實這樣也差不多了。
daemon 的分類
根據daemon的啟動與管理方式來分,可以將daemon為可獨立啟動的daemon,和通過super daemon來統一管理的服務這兩大類,下面來簡單的介紹一下他們兩個的區別:
獨立啟動的服務:這種類型的daemon 可以獨立啟動而無需通過其他機制來管理,此類daemon啟動並載入到記憶體後就一直佔用記憶體與系統資源。最大的優點就是:因為是一直存在記憶體內,所以當有客戶請求時,他的響應速度較快。
super daemon:這種服務的啟動是由一個普通的daemon來統一管理(在RHEL/CentOS的系統中是xinetd)一些服務。這種管理方式的特點是:原本各項服務都是未啟動的,當有客戶來請求時,此時super daemon 才喚醒相對應的服務,當用戶端的請求結束後,被喚醒的這個服務也會關閉並釋放系統資源。所以說由super daemon管理的服務響應是比較慢的。
服務與連接埠
這個連接埠我相應大家都很清楚,可以用個比喻來說明一下IP與連接埠的作用。我們可以把IP當作互連網上的地址,而連接埠就是樓層號,不同的樓層就提供不同的服務了,哈哈……
想查看服務對應的連接埠,可以參考/etc/services。這裡只能參考,因為我們可以改變服務的連接埠號碼。
daemon啟動指令碼的相關目錄與檔案
/etc/init.d/ 此目錄是放啟動指令碼的位置。在RHEL/CentOS上實際上是放在/etc/rc.d/init.d/,為什麼呢?其實查看一下目錄就知道了。/etc/init.d其實是/etc/rc.d/init.d的連結目錄。
[root@yufei ~]# ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 May 31 17:43 /etc/init.d -> rc.d/init.d
/etc/sysconfig/ 各服務的初始化環境設定檔。幾乎所有的服務都會將初始化的一些選項設定寫到這個目錄下。
/etc/xinetd.conf, /etc/xinetd.d/ :super daemon 設定檔的目錄。super daemon 的主要設定檔為/etc/xinetd.conf ,super daemon所管理的其他daemon 的設定則在/etc/xinetd.d/ 裡。
/etc/ :各服務的設定檔的目錄,一般是以.conf結尾。
/var/run/ :各服務的程式的PID 存放的地方。
服務的啟動與停止或載入
我們先來看普通的daemon啟動方式
用RPM或YUM安裝的服務軟體,服務的指令碼基本上全部放在/etc/init.d/這個目錄下,這裡面的指令碼一般都可以用VI開啟來觀察。指令碼的內容大致有:指令碼的描述、環境調用、搜尋設定檔、載入functions、服務的啟動停止與載入、最後還會有指令碼的參數。
這裡面的指令碼可以用指令碼的相對路徑或絕對路徑來執行,當然RHEL/CentOS上還提供了一個命令service來直接調用這裡面的指令碼。
我們以SSHD為例來看一下
[root@yufei ~]# /etc/init.d/sshd --help
Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
這個提示很清楚,結合指令檔你就會看明白,參數執行了哪些東西,這就留給大家自己研究吧。
[root@yufei ~]# cd /etc/init.d/
[root@yufei init.d]# ./sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
用相對路徑啟動也是一樣的,當然還可以在任何目錄下用service來直接執行某個服務,至於為什麼他會調用/etc/init.d/裡面的指令碼,大家看一下/sbin/service這個檔案就知道了。
[root@yufei init.d]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
再來看看Super daemon 的啟動方式
其實Super daemon 本身也是普通的daemon,只是要通過他來管理一些不常用的服務而已。所以說,xinetd他的啟動方式與普通的daemon是一樣的,而由他管理的服務都在/etc/xinetd.d/目錄下,這裡面的服務開啟與關閉,都是由此目錄下的服務檔案本身來控制的。大家可以開啟來看看,每個檔案裡面都有disable = yes或disable = no這樣的內容,如果是YES,那就是不啟動了,如果是NO,就是啟動了。
下面我們以telnet為例來給大家示範
[root@yufei ~]# cd /etc/xinetd.d/
[root@yufei xinetd.d]# yum install telnet-server
[root@yufei xinetd.d]# ls -l |grep telnet
-rw-r--r--. 1 root root 305 Sep 9 2004 telnet
[root@yufei xinetd.d]# grep disable telnet
disable = yes
我們來啟動看看
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
發現telnet連不上
我們把disable = yes換成no
[root@yufei xinetd.d]# vim telnet
[root@yufei xinetd.d]# grep disable telnet
disable = no
重新啟動xinetd
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 6.1 (Santiago)
Kernel 2.6.32-131.0.15.el6.x86_64 on an x86_64
login:
發現這時候的反應有點慢,過一會,就出現了login:的登陸資訊了。在RHEL6.1上就算是使用者名稱和密碼正確,好像也無法正常登陸,應該是系統為了安全方面考慮,可能是禁止了什麼,這個有興趣的,自己研究吧。
這隻是示範了一下關於由xinetd管理的服務啟動的方法,我想大家應該很清楚了。當然,telnet是明文的,也是不安全的,所以我們把他卸載掉。
[root@yufei xinetd.d]# yum remove telnet-server -y
[root@yufei xinetd.d]# rm -fr telnet.rpmsave
下面來分析一下/etc/xinetd.conf這個檔案
這個檔案中包含日誌的記錄方式與記錄的內容設定、串連設定、網路設定和環境參數設定以及其他服務設定
我們主要來看串連限制設定
cps = 50 10
instances = 50
per_source = 10
第一行表示:同一秒內的最大聯機數為50 個,若超過則暫停10 秒
第二行表示:同一服務的最大同時聯機數
第三行表示:同一用戶端的最大聯機數
這個檔案中的參數是一個全域的設定,你也可以對其管理的服務來進行其他更多我設定。他管理的服務就是/etc/xinetd.d/這個目錄裡面的,你可以開啟某個服務看一下裡面的參數設定,這裡也不一一說明,主要講一下,關於網路方面的設定。
only_from:只有這裡設定的IP或者是主機名稱才可以使用某個服務。這個設定後面可以是某個網段如192.168.1.0/24,也可以是某個域如.opsers.org。如果說有多個不同的設定,就可以用+=來設定其他的內容。
no_access:和上面的一樣,只是用來限制某些主機不能使用某個服務。
access_times:設定服務開放的時間。他的設定方式是[00:00-12:00],就是從某個時段到某個時段。如果有多個時間段,中間用空格空開就可以,如:01:00-9:00 20:00-23:59
tcp_wrappers
其實,任何以xinetd 管理的服務,都可以通過/etc/hosts.allow, /etc/hosts.deny 來限定存取權限,可以叫做防火牆(tcp_wrappers)。這種管理機制更方便用來集中管理。那麼這兩個檔案是不是對系統中所有的服務都起作用呢?其實不是這樣的,只有載入了libwrap.so函數的服務才能被/etc/hosts.allow, /etc/hosts.deny 所能控制。下面我們就來看看
[root@yufei ~]# ldd $(which sshd) |grep libwrap.so
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f61d35bf000)
[root@yufei ~]# ldd $(which httpd) |grep libwrap.so
[root@yufei ~]#
我們發現,SSH是支援libwrap.so的,所以他可以通過/etc/hosts.allow, /etc/hosts.deny 這兩個檔案來控制許可權了。
關於檔案的格式使用可以通過man 5 hosts_options 和man 5 hosts_access來查看。
基本格式如下
服務:IP 或領域 或主機名稱:動作
第一及第二個欄位一些特殊參數:
ALL:代表全部的program_name 或者是IP 都接受的意思,例如ALL: ALL: deny
LOCAL:代表來自原生意思,例如:ALL: LOCAL: allow
UNKNOWN:代表不知道的IP 或者是domain 或者是服務
KNOWN:代表為可解析的IP, domain 等等資訊
特別要注意:
服務是啟動該服務的程式,一般情況下,服務名在指令碼中能看到。
一般情況下,我們把
1、允許進入的寫在/etc/hosts.allow 當中
2、阻止進入的則寫在/etc/hosts.deny 當中
而這兩個檔案判斷的依據是ALLOW優先
下面我們來介紹一下服務的觀察
一個命令是ps,這個命令一般是用來查詢系統中所有的進程
一個命令是netstat,他是用來顯示與IP、TCP、UDP和ICMP協議相關的統計資料,一般用於檢驗本機各連接埠的網路連接情況。我們主要來介紹netstat (network statistics) 的用法
[root@yufei ~]# netstat –help
使用上面的命令會顯示netstat的格式及相關參數,下面就介紹一下主要的參數意義。
-r, –route 顯示路由表(和route命令一樣,都可以加上後面的-n參數)
-i, –interfaces 顯示網路介面的串連情況(eth0、lo)
-s, –statistics 顯示IP、ICMP、IcmpMsg、TCP、UDP、UdpLite、TcpExt、IpExt的統計資訊
-n, –numeric 以數字形式顯示地址和連接埠號碼
-p, –programs 顯示PID/Program name
-l, –listening 顯示監聽連接埠
-a, –all, –listening 顯示所有串連和監聽連接埠
-t, –tcp 顯示TCP傳輸協議的連線狀況
-u, –udp 顯示UDP傳輸協議的連線狀況
–e本選項用於顯示關於乙太網路的統計資料。它列出的項目包括傳送的資料報的總位元組數、錯誤數、刪除數、資料報的數量和廣播的數量。這些統計資料既有發送的資料報數量,也有接收的資料報數量。這個選項可以用來統計一些基本的網路流量)。
從整體上看,netstat的輸出結果可以分為兩個部分,一個是Active Internet connections,稱為活動的網路連接。列出下面的一些資訊
Proto:顯示串連使用的協議
Recv-Q:本地未收到的位元組數
Send-Q:遠程主機未收到的位元組數
Local Address:本地的地址與連接埠
Foreign Address:遠端地址與連接埠
State:串連的狀態情況
另一個是Active UNIX domain sockets,稱為活動的Unix域套介面。列出下面的一些資訊
Proto:顯示串連使用的協議
RefCnt:表示串連到本套介面上的進程號
Types:顯示套介面的類型
State:顯示套介面當前的狀態
Path:表示串連到套介面的其它進程使用的路徑名
netstat與網路有密切關係,所以如果想更清楚的瞭解上面列出來的資訊,最好是有點網路基礎。當然,如果你沒有也沒有關係,下面我列舉幾個我們常用的命令組合,讓大家來使用。
netstat -tl 查看當前tcp監聽連接埠
netstat -ul 查看當前udp監聽連接埠
netstat -tlp 查看當前tcp監聽連接埠, 同時顯示監聽的程式名
netstat -tlpn 以數字方式顯示上面的內容
netstat -tulpna 查看出正在串連的網路資訊
以上這些資訊基本上夠用了,如果想瞭解更多的netstat相關用法,請用man來協助。
服務的管理
上面講了這麼多,我相信大家對服務有了一個更深入的瞭解了,那麼下面我們就來看看服務是如何來管理的。
要想管理好服務,就需要掌握chkconfig此命令的使用。先來看看這個命令的使用吧。
chkconfig –list [name]
列出系統中(/etc/init.d/目錄下)的服務(/etc/init.d/)狀態。[name]加上則是查看某個服務的狀態,不加就是查看系統中全部的服務狀態
chkconfig –add <name>
把某個服務增加到/etc/init.d/目錄下
chkconfig –del <name>
刪除/etc/init.d/目錄下的某個服務
chkconfig [--level <levels>] <name> <on|off>
設定某層級的某個服務的狀態
上面的命令比較簡單,但要注意幾點:
1、要想管理某個服務,那麼此服務必需要在/etc/init.d/目錄下,才能夠用chkconfig來管理,否則會出現“error reading information on service network: No such file or directory”這要的錯誤。
2、這個檔案要有執行許可權
3、/etc/init.d/目錄下的服務檔案都有一些共同點,那就是有一行類似# chkconfig: 2345 10 90這樣的內容,就和第一行#! /bin/bash一樣,是必需的,而不是我們平時所說的注釋。三欄表示的意思是:不同的運行層級、啟動順序、關閉順序。也就是說在/etc/rc.d/rcN.d/(N為2、3、4、5)下會有S10開頭的對應檔案和/etc/rc.d/rcN.d/(N為0、1、6)下以K90開頭的對應檔案。這個我們可以查看前面有關運行層級的相關資訊。
最後說明一點,如果你的系統中沒有xinetd的話,請安裝些軟體
[root@yufei ~]# yum install xinetd
[root@yufei ~]# chkconfig --list
省略
xinetd based services:
chargen-dgram: off
chargen-stream: off
daytime-dgram: off
daytime-stream: off
discard-dgram: off
discard-stream: off
echo-dgram: off
echo-stream: off
tcpmux-server: off
time-dgram: off
time-stream: off
摘自 羽飛部落格