SysV init是systemV風(fēng)格的init系統(tǒng),顧名思義,它源于SystemV系列UNIX。它提供了比BSD風(fēng)格init系統(tǒng)更高的靈活性。是已經(jīng)風(fēng)行了幾十年的UNIX init系統(tǒng),一直被各類(lèi)Linux發(fā)行版所采用。
(1) 什么是SystemV
SystemV,曾經(jīng)也被稱(chēng)為ATT SystemV,是Unix操作系統(tǒng)眾多版本中的一支。它最初由ATT開(kāi)發(fā),在1983年第一次發(fā)布。一共發(fā)行了4個(gè)SystemV的主要版本:版本1、2、3和4。SystemV Release4,或者稱(chēng)為SVR4,是最成功的版本,成為一些UNIX共同特性的源頭,例如”SysV初始化腳本“(/etc/init.d),用來(lái)控制系統(tǒng)啟動(dòng)和關(guān)閉,SystemV Interface Definition(SVID)是一個(gè)SystemV如何工作的標(biāo)準(zhǔn)定義。
(2)SysV init的運(yùn)行級(jí)別
SysV init用術(shù)語(yǔ)runlevel來(lái)定義"預(yù)訂的運(yùn)行模式"。SysV init檢查'/etc/inittab'文件中是否含有'initdefault'項(xiàng)。來(lái)告訴init系統(tǒng)是否有一個(gè)默認(rèn)運(yùn)行模式。如果沒(méi)有默認(rèn)的運(yùn)行模式,那么用戶將進(jìn)入系統(tǒng)控制臺(tái),手動(dòng)決定進(jìn)入何種運(yùn)行模式。
SysV init中運(yùn)行模式描述了系統(tǒng)各種預(yù)訂的運(yùn)行模式。通常會(huì)有8種運(yùn)行模式,即運(yùn)行模式0到6和S或者s。
每種Linux發(fā)行版對(duì)運(yùn)行模式的定義都不太一樣。但0,1,6卻得到了大家的一致贊同:
0關(guān)機(jī)
1單用戶模式
6重啟
通常在/etc/inittab文件中定義了各種運(yùn)行模式的工作范圍。比如RedHat定義了runlevel3和5。運(yùn)行模式3將系統(tǒng)初始化為字符界面的shell模式;運(yùn)行模式5將系統(tǒng)初始化為GUI模式。無(wú)論是命令行界面還是GUI,運(yùn)行模式3和5相對(duì)于其他運(yùn)行模式而言都是完整的正式的運(yùn)行狀態(tài),計(jì)算機(jī)可以完成用戶需要的任務(wù)。而模式1,S等往往用于系統(tǒng)故障之后的排錯(cuò)和恢復(fù)。
很顯然,這些不同的運(yùn)行模式下系統(tǒng)需要初始化運(yùn)行的進(jìn)程,需要進(jìn)行的初始化準(zhǔn)備都是不同的。比如運(yùn)行模式3不需要啟動(dòng)X系統(tǒng)。用戶只需要指定需要進(jìn)入哪種模式,SysV init負(fù)責(zé)執(zhí)行所有該模式所必須的初始化工作。
(3)SysV init運(yùn)行順序
SysV init巧妙地用腳本,文件命名規(guī)則和軟鏈接來(lái)實(shí)現(xiàn)不同的runlevel。首先,SysV init需要讀取/etc/inittab文件。分析這個(gè)文件的內(nèi)容,它獲得以下一些配置信息:
系統(tǒng)需要進(jìn)入的runlevel;
捕獲組合鍵的定義;
定義電源fail/restore腳本;
啟動(dòng)getty和虛擬控制臺(tái);
得到配置信息后,SysV init順序地執(zhí)行以下這些步驟,從而將系統(tǒng)初始化為預(yù)訂的runlevelX:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc和/etc/rc.d/rcX.d/(X代表運(yùn)行級(jí)別0-6)
/etc/rc.d/rc.local
XDisplayManager(如果需要的話)
1)rc.sysinit腳本功能
首先,運(yùn)行rc.sysinit以便執(zhí)行一些重要的系統(tǒng)初始化任務(wù)。在RedHat公司的RHEL5中(RHEL6已經(jīng)使用UpStart了),rc.sysinit主要完成以下這些工作:
激活udev和selinux;
設(shè)置定義在/etc/sysctl.conf中的內(nèi)核參數(shù);
設(shè)置系統(tǒng)時(shí)鐘;
加載keymaps;
激活交換分區(qū);
設(shè)置主機(jī)名(hostname);
根分區(qū)檢查和remount;
激活RAID和LVM設(shè)備;
開(kāi)啟磁盤(pán)配額;
檢查并掛載所有文件系統(tǒng);
清除過(guò)期的locks和PID文件;
2)rc.d腳本
完成了以上這些工作之后,SysV init開(kāi)始運(yùn)行/etc/rc.d/rc腳本。根據(jù)不同的runlevel,rc腳本將打開(kāi)對(duì)應(yīng)runlevel的rcX.d目錄(X就是runlevel),找到并運(yùn)行存放在該目錄下的所有啟動(dòng)腳本。每個(gè)runlevelX都有一個(gè)這樣的目錄,目錄名為/etc/rc.d/rcX.d。
在這些目錄下存放著很多不同的腳本。文件名以S開(kāi)頭的腳本就是啟動(dòng)時(shí)應(yīng)該運(yùn)行的腳本,S后面跟的數(shù)字定義了這些腳本的執(zhí)行順序。在/etc/rc.d/rcX.d目錄下的腳本其實(shí)都是一些軟鏈接文件,真實(shí)的腳本文件存放在/etc/init.d目錄下。如下所示:
rc5.d目錄下的腳本
[root@www~]#ll/etc/rc5.d/
lrwxrwxrwx1rootroot16Sep42008K02dhcdbd->../init.d/dhcdbd
....(中間省略)....
lrwxrwxrwx1rootroot14Sep42008K91capi->../init.d/capi
lrwxrwxrwx1rootroot23Sep42008S00microcode_ctl->../init.d/microcode_ctl
lrwxrwxrwx1rootroot22Sep42008S02lvm2-monitor->../init.d/lvm2-monitor
....(中間省略)....
lrwxrwxrwx1rootroot17Sep42008S10network->../init.d/network
....(中間省略)....
lrwxrwxrwx1rootroot11Sep42008S99local->../rc.local
lrwxrwxrwx1rootroot16Sep42008S99smartd->../init.d/smartd
....(底下省略)....
當(dāng)所有的初始化腳本執(zhí)行完畢。SysV init運(yùn)行/etc/rc.d/rc.local腳本。
rc.local是Linux留給用戶進(jìn)行個(gè)性化設(shè)置的地方??梢园炎约核饺讼朐O(shè)置和啟動(dòng)的東西放到這里,一臺(tái)LinuxServer的用戶一般不止一個(gè),所以才有這樣的考慮。
(4)SysV init和系統(tǒng)關(guān)閉
SysV init不僅需要負(fù)責(zé)初始化系統(tǒng),還需要負(fù)責(zé)關(guān)閉系統(tǒng)。在系統(tǒng)關(guān)閉時(shí),為了保證數(shù)據(jù)的一致性,需要小心地按順序進(jìn)行結(jié)束和清理工作。
比如應(yīng)該先停止對(duì)文件系統(tǒng)有讀寫(xiě)操作的服務(wù),然后再u(mài)mount文件系統(tǒng)。否則數(shù)據(jù)就會(huì)丟失。
這種順序的控制這也是依靠/etc/rc.d/rcX.d/目錄下所有腳本的命名規(guī)則來(lái)控制的,在該目錄下所有以K開(kāi)頭的腳本都將在關(guān)閉系統(tǒng)時(shí)調(diào)用,字母K之后的數(shù)字定義了它們的執(zhí)行順序。
這些腳本負(fù)責(zé)安全地停止服務(wù)或者其他的關(guān)閉工作。
(5)SysV init的管理和控制功能
此外,在系統(tǒng)啟動(dòng)之后,管理員還需要對(duì)已經(jīng)啟動(dòng)的進(jìn)程進(jìn)行管理和控制。SysV init軟件包包含了一系列的控制啟動(dòng),運(yùn)行和關(guān)閉所有其他程序的工具。
halt停止系統(tǒng)。
init就是SysV init本身的init進(jìn)程實(shí)體,以pid1身份運(yùn)行,是所有用戶進(jìn)程的父進(jìn)程。最主要的作用是在啟動(dòng)過(guò)程中使用/etc/inittab文件創(chuàng)建進(jìn)程。
killall5就是System V的killall命令。向除自己的會(huì)話(session)進(jìn)程之外的其它進(jìn)程發(fā)出信號(hào),所以不能殺死當(dāng)前使用的shell。
last回溯/var/log/wtmp文件(或者-f選項(xiàng)指定的文件),顯示自從這個(gè)文件建立以來(lái),所有用戶的登錄情況。
lastb作用和last差不多,默認(rèn)情況下使用/var/log/btmp文件,顯示所有失敗登錄企圖。
mesg控制其它用戶對(duì)用戶終端的訪問(wèn)。
pidof找出程序的進(jìn)程識(shí)別號(hào)(pid),輸出到標(biāo)準(zhǔn)輸出設(shè)備。
poweroff等于shutdown-h–p,或者telinit0。關(guān)閉系統(tǒng)并切斷電源。
reboot等于shutdown–r或者telinit6。重啟系統(tǒng)。
runlevel讀取系統(tǒng)的登錄記錄文件(一般是/var/run/utmp)把以前和當(dāng)前的系統(tǒng)運(yùn)行級(jí)輸出到標(biāo)準(zhǔn)輸出設(shè)備。
shutdown以一種安全的方式終止系統(tǒng),所有正在登錄的用戶都會(huì)收到系統(tǒng)將要終止通知,并且不準(zhǔn)新的登錄。
sulogin當(dāng)系統(tǒng)進(jìn)入單用戶模式時(shí),被init調(diào)用。當(dāng)接收到啟動(dòng)加載程序傳遞的-b選項(xiàng)時(shí),init也會(huì)調(diào)用sulogin。
telinit實(shí)際是init的一個(gè)連接,用來(lái)向init傳送單字符參數(shù)和信號(hào)。
utmpdump以一種用戶友好的格式向標(biāo)準(zhǔn)輸出設(shè)備顯示/var/run/utmp文件的內(nèi)容。
wall向所有有信息權(quán)限的登錄用戶發(fā)送消息。
不同的Linux發(fā)行版在這些SysV init的基本工具基礎(chǔ)上又開(kāi)發(fā)了一些輔助工具用來(lái)簡(jiǎn)化init系統(tǒng)的管理工作。比如RedHat的RHEL在SysV init的基礎(chǔ)上開(kāi)發(fā)了initscripts軟件包,包含了大量的啟動(dòng)腳本(如rc.sysinit),還提供了service,chkconfig等命令行工具,甚至一套圖形化界面來(lái)管理init系統(tǒng)。其他的Linux發(fā)行版也有各自的initscript或其他名字的init軟件包來(lái)簡(jiǎn)化SysV init的管理。
只要理解了SysV init的機(jī)制,在一個(gè)最簡(jiǎn)的僅有SysV init的系統(tǒng)下,可以直接調(diào)用腳本啟動(dòng)和停止服務(wù),手動(dòng)創(chuàng)建inittab和創(chuàng)建軟連接來(lái)完成這些任務(wù)。因此理解SysV init的基本原理和命令是最重要的。甚至也可以開(kāi)發(fā)自己的一套管理工具。