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