2.linux 的服務與進程管理
【2.1】系統啟動流程
簡單的介紹下linux的系統啟動流程,方便我們深入了解linux操作系統,對排除linux系統故障進行幫助。啟動流程雖然簡單但背后還有着更加復雜的底層函數調用,等待咱們去研究,本節課就算拋磚引玉了。
啟動第一步--加載BIOS
當你打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至於計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息、時鍾信息、PnP特性等等。在此之后,計算機心里就有譜了,知道應該去讀取哪個硬件設備了。
啟動第二步--讀取MBR
眾所周知,硬盤上第0磁道第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,別看地方不大,可里面卻存放了預啟動信息、分區表信息。
系統找到BIOS所指定的硬盤的MBR后,就會將其復制到0×7c00地址所在的物理內存中。其實被復制到物理內存的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。
啟動第三步--Boot Loader
Boot Loader 就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核做好一切准備。
Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。
我們以Grub為例來講解吧,畢竟用lilo和spfdisk的人並不多。
系統讀取內存中的grub配置信息(一般為menu.lst或grub.lst),並依照此配置信息來啟動不同的操作系統。
啟動第四步--加載內核
根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操作。此時,屏幕一般會輸出“Uncompressing Linux”的提示。當解壓縮內核完成后,屏幕輸出“OK, booting the kernel”。
系統將解壓后的內核放置在內存之中,並調用start_kernel()函數來啟動一系列的初始化函數並初始化各種設備,完成Linux核心環境的建立。至此,Linux內核已經建立起來了,基於Linux的程序應該可以正常運行了。
啟動第五步--用戶層init依據inittab文件來設定運行等級
內核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,並依據此文件來進行初始化工作。
其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:
0:關機
1:單用戶模式
2:無網絡支持的多用戶模式
3:有網絡支持的多用戶模式
4:保留,未使用
5:有網絡支持有X-Window支持的多用戶模式
6:重新引導系統,即重啟
關於/etc/inittab文件的學問,其實還有很多,以后運用到我們會逐步講解。
啟動第六步--init進程執行rc.sysinit
在設定了運行等級后,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它做的工作非常多,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啟動swap分區、設定/proc等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的腳本夠你看幾天的。
啟動第七步--啟動內核模塊
具體是依據/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內核模塊。
啟動第八步--執行不同運行級別的腳本程序
根據運行級別的不同,系統會運行rc0.d到rc6.d中的相應的腳本程序,來完成相應的初始化工作和啟動相應的服務。
具體位置:/etc/rc.d/
啟動第九步--執行/etc/rc.d/rc.local
你如果打開了此文件,里面有一句話,讀過之后,你就會對此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留給用戶進行個性化的地方。你可以把你想設置和啟動的東西放到這里。
啟動第十步--執行/bin/login程序,進入登錄狀態
此時,系統已經進入到了等待用戶輸入username和password的時候了,你已經可以用自己的帳號登入系統了。漫長的啟動過程結束了,一切都清靜了…
【2.2】服務的介紹
在開始介紹如何管理Linux的服務前,先為你介紹Linux的服務究竟有哪些。這些服務的分類方法,以及一些關於服務的基本概念
服務的種類
Linux提供了許多的服務。這些服務,可以使依照其功能和依照服務啟動的方法與執行時的特性進行分類。
依照功能分類:
Ø 系統服務
— 某些服務的服務對象是Linux系統本身,或者Linux系統用戶,這類的服務我們稱為系統服務(System Service)
Ø 網絡服務
— 提供給網絡中的其他客戶端(Clients)調用使用的服務,這類的服務我們統稱為網絡服務(Networking Service)。
依照服務啟動的方法分類
Ø 獨立系統服務
— 服務一經啟動,除非因為關閉系統或者管理者手動結束,否則都將在后台執行,不管有沒有被用到。這樣的服務我們稱為獨立系統服務(Standalone Service)。 獨立系統服務有時候又被稱為Sys V服務 (Sys V Service)
Ø 臨時服務
— 與獨立系統服務不同,臨時服務(Transient Service)平時並不會啟動,而是當客戶端需要時才會被啟動,使用完畢會結束。
【2.2】服務的管理
手動的啟動或停止獨立系統服務
為了簡化Linux服務管理的麻煩,Linux特別為每一個獨立式的服務,提供了一個服務啟動程序文件(Service Startup Script)。
所有的服務啟動文件被儲存在/etc/rc.d/init.d/目錄下
如何利用腳本直接管理服務
/etc/rc.d/init.d/里面每一個文件就是某一個服務的啟動程序文件,你可以直接執行某一個啟動程序文件,借以來啟動或者停止該服務
不同的服務啟動文件可能會有不同的動作參數:
- start: 啟動這個服務
- stop: 停止這個服務
- restart: 先停止,再啟動,也就是重新啟動的意思。
- reload: 重載配置文件,這個參數只有在服務已經啟動的狀況下才 能使用。
- condrestart:有條件的重新啟動,這個服務必須是已經啟動的,才會被重新啟動;如果這個服務尚未啟動,則無須啟動之。
- status: 查看目前服務的啟動狀態。
service命令管理方法
用法: service filename action
動作參數:
start
stop
status
【2.3】守護進程
inetd是一個特殊的程序,不斷監控所有通訊端口。一旦有客戶端調用某一個啟動文件時,這個程序就要負責啟動該服務;而在客戶端使用完畢后,改程序也必須要負責結束。
守護進程服務位置:/etc/xinetd.d
service xinetd start/stop/status
【2.4】服務的自啟動
chkconfig命令主要用來更新(啟動或停止)和查詢系統服務的運行級信息。謹記chkconfig不是立即自動禁止或激活一個服務,它只是簡單的改變了符號連接。
使用語法:
chkconfig [--add][--del][--list][系統服務] 或 chkconfig [--level <等級代號>][系統服務][on/off/reset]
參數用法:
--add 增加所指定的系統服務,讓chkconfig指令得以管理它,並同時在系統啟動的敘述文件內增加相關數據。
--del 刪除所指定的系統服務,不再由chkconfig指令管理,並同時在系統啟動的敘述文件內刪除相關數據。
--level<等級代號> 指定讀系統服務要在哪一個執行等級中開啟或關畢。
等級0表示:表示關機
等級1表示:單用戶模式
等級2表示:無網絡連接的多用戶命令行模式
等級3表示:有網絡連接的多用戶命令行模式
等級4表示:不可用
等級5表示:帶圖形界面的多用戶模式
等級6表示:重新啟動
需要說明的是,level選項可以指定要查看的運行級而不一定是當前運行級。對於每個運行級,只能有一個啟動腳本或者停止腳本。當切換運行級時,init不會重新啟動已經啟動的服務,也不會再次去停止已經停止的服務。
chkconfig --list [name]:顯示所有運行級系統服務的運行狀態信息(on或off)。如果指定了name,那么只顯示指定的服務在不同運行級的狀態。
chkconfig --add name:增加一項新的服務。chkconfig確保每個運行級有一項啟動(S)或者殺死(K)入口。如有缺少,則會從缺省的init腳本自動建立。
chkconfig --del name:刪除服務,並把相關符號連接從/etc/rc[0-6].d刪除。
chkconfig [--level levels] name:設置某一服務在指定的運行級是被啟動,停止還是重置。
使用范例:
chkconfig --list #列出所有的系統服務
chkconfig --add httpd #增加httpd服務
chkconfig --del httpd #刪除httpd服務
chkconfig --list #列出系統所有的服務啟動情況
chkconfig --list mysqld #列出mysqld服務設置情況
chkconfig --level 35 mysqld on #設定mysqld在等級3和5為開機運行服務,--level 35表示操作只在等級3和5執行,on表示啟動,off表示關閉
chkconfig mysqld on #設定mysqld在各等級為on,“各等級”包括2、3、4、5等級
2.4【screen用法】
Screen被稱之為一個全屏窗口管理器,用他可以輕松在一個物理終端上獲得多個虛擬終端的效果。
Screen功能說明:
簡單來說,Screen是一個可以在多個進程之間多路復用一個物理終端的窗口管理器,這意味着你能夠使用一個單一的終端窗口運行多終端的應用。Screen中有會話的概念,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。
Screen命令語法:
screen [-AmRvx -ls -wipe][-d < >][-h < >][-r < >][-s ][-S < >]
Screen命令參數:
-A -[r|R] 將所有的視窗都調整為目前終端機的大小。
-c filename 用指定的filename文件替代screen的配置文件’.screenrc’.
-d [pid.tty.host] 斷開screen進程(使用該命令時,screen的狀態一定要是Attached,也就是說有用戶連在screen里)。一般進程的名字是以pid.tty.host這種形式表示(用screen -list命令可以看出狀態)。
-D [pid.tty.host] 與-d命令實現一樣的功能,區別就是如果執行成功,會踢掉原來在screen里的用戶並讓他logout。
-h < > 指定視窗的緩沖區行數。
-ls或–list 顯示目前所有的screen作業。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-p number or name 預先選擇一個窗口。
-r [pid.tty.host] 恢復離線的screen進程,如果有多個斷開的進程,需要指定[pid.tty.host]
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s shell 指定建立新視窗時,所要執行的shell。
-S < > 指定screen作業的名稱。(用來替代[pid.tty.host]的命名方式,可以簡化操作).
-v 顯示版本信息。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
-x 恢復之前離線的screen作業。
Screen命令的常規用法:
screen -d -r:連接一個screen進程,如果該進程是attached,就先踢掉遠端用戶再連接。
screen -D -r:連接一個screen進程,如果該進程是attached,就先踢掉遠端用戶並讓他logout再連接
screen -ls或者-list:顯示存在的screen進程,常用命令
screen -m:如果在一個Screen進程里,用快捷鍵crtl+a c或者直接打screen可以創建一個新窗口,screen -m可以新建一個screen進程。
screen -dm:新建一個screen,並默認是detached模式,也就是建好之后不會連上去。
screen -p number or name:預先選擇一個窗口。
Screen實現后台運行程序的簡單步驟:
1< 要進行某項操作時,先使用命令創建一個Screen:
[linux@user~]$ screen -S test1
2<接着就可以在里面進行操作了,如果你的任務還沒完成就要走開的話,使用命令保留Screen:
[linux@user~]$ Ctrl+a+d #按Ctrl+a,然后再按d即可保留Screen
[detached] #這時會顯示出這個提示,說明已經保留好Screen了
如果你工作完成的話,就直接輸入:
[linux@user~]$ exit #這樣就表示成功退出了
[screen is terminating]
3< 如果你上一次保留了Screen,可以使用命令查看:
[linux@user~]$ screen -ls
There is a screen on:
9649.test1 (Detached)
恢復Screen,使用命令:
[linux@user~]$ screen -r test1 (or 9649)