Linux系統運行級管理

來源:互聯網
上載者:User

運行級的概念來自System V,運行層級將啟動過程分成不同的集合,每個集合包含一組指令碼,當init程式“切換運行級”到對應的層級時,相應的指令碼就被觸發,切換運行級可以通過執行init [層級號]完成。(比如,在Linux中,run level 6代表reboot,所以執行init 6就會引起系統重新啟動)運行層級的定義每種System V都不完全一樣,只能通過直接讀/etc/inittab來確定,下面是一個標準的Linux的/etc/inittab,注意這裡解釋的內容來自redhat,但是其他的版本也大同小異。我們將它分成若干段來解釋,如同一般情況那樣,用#開始的行是注釋,而非注釋行的文法是:標號:運行層級:操作方式:命令 標號是這一行的標籤,運行層級用於定義這一行應該用於那些層級,如果為空白就定義為所有層級,操作方式可以是一些確定的字串,代表如何執行後面的命令,而命令則給處在進入這一層級時執行的程式。下面是它的內容:# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)# 上面的幾行解釋了預設的運行層級定義:停機,系統進入這一層級後關機;單一使用者模式,在這個模式中只能從控制台操作電腦,網路和終端不啟動,許多檔案系統也沒有連結;多使用者模式,但關閉了網路服務支援完全的多使用者模式,就是我們一般使用的模式無定義圖形介面模式,系統切入這一運行級後自動啟動X Window系統重新啟動這些層級的定義是任意的,然而你最好不要修改它,尤其是level 0,1和6,因為許多程式都使用init 0之類的方式實現對系統的控制,其他的Linux發行版本可能會更改2-5的定義,你需要參考/etc/inittab才能判斷到底那個層級是什麼意思,不過一般來說0,1和6總是上面的定義。下面開始才是真正的內容,首先系統必須定義預設的運行層級:id:3:initdefault:initdefault關鍵字決定了預設的運行層級,在這裡是3,也就是在執行了公用的系統啟動指令碼之後,系統將會執行與層級3對應的那些行# System initialization.si::sysinit:/etc/rc.d/rc.sysinit這裡的sysinit關鍵字定義了公用的“系統初始化”指令碼,在相應於運行級的地方是空,表示適用於所有運行層級。注意它將在系統進入任何運行層級以前完成,一會我們再研究這個指令碼的內容。l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6這裡開出了六個運行層級的定義,運行級0就去執行命令/etc/rc.d/rc 0,運行級1是/etc/rc.d/rc 1,.....諸如此類。wait關鍵字表示系統必須等待此命令執行完才能開始下一步工作。# Things to run in every runlevel.ud::once:/sbin/update這又是一個適用於所有層級的命令。update命令實際是去啟動updated守護進程,以便定期重新整理記憶體中的超級塊表。Once關鍵字說明這個項只被執行一次。# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r nowctrlaltdel定義當暖開機按鍵組合被觸發時系統的行為,這裡定義所有的運行層級對它的響應都是重新啟動shutdown –r)pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"這兩行定義如何響應ups資訊,如果系統掉電(powerfail),執行兩分鐘後關機的指令;如果關機之前電源恢複,取消關機操作。# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6 2,3,4,5都是多使用者層級,為系統開出6個虛擬螢幕就是用Alt+Fn即獲得虛擬螢幕),respawn關鍵字表示這個動作在每次進入相應運行層級時都會執行。# Run xdm in runlevel 5# xdm is now a separate servicex:5:respawn:/etc/X11/prefdm -nodaemon對於層級5,啟動圖形介面。歸納一下,系統在讀入inittab以後要做什嗎?設定Ctrl+Alt+Del響應,設定好對UPS的支援,然後應該執行/etc/rc.d/rc.sysinit,然後是/etc/rc.d/rc 3,最後是update和啟動虛擬螢幕。顯然,系統的主要初始化命令應該在/etc/rc.d/rc.sysinit和/etc/rc.d/rc 3中完成。rc.d下的基本指令碼下面我們來研究啟動指令碼,這裡的指令碼來自redhat 6.1,因為這是個最為廣泛使用的版本,其他的版本的特有問題將在下一節討論。首先,系統將執行/etc/rc.d/rc.sysinit,這是個shell指令碼,你可以用普通的文本編輯工具對它進行處理,為了簡便,我們只研究其中較為重要的部分或者較為典型的段落:#!/bin/sh## /etc/rc.d/rc.sysinit - run once at boot time## Taken in part from Miquel van Smoorenburg's bcheckrc.## Rerun ourselves through initlogif [ -z "$IN_INITLOG" ]; then [ -f /sbin/initlog ] && exec /sbin/initlog $INITLOG_ARGS -r /etc/rc.d/rc.sysinitfi首先,確定系統中是否存在/sbin/initlog檔案,如果存在,那麼需要記錄初始化資訊。# Set the pathPATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH設定預設路徑。# Read in config data.if [ -f /etc/sysconfig/network ]; then. /etc/sysconfig/networkelseNETWORKING=noHOSTNAME=localhostfi這一段是網路的參數設定,/etc/sysconfig/network的內容是這樣:NETWORKING=yesFORWARD_IPV4="yes"HOSTNAME="openlab.asnc.edu.cn"GATEWAY=""GATEWAYDEV=""顯然,如果這個檔案存在,那麼設定網路的運行參數,如網域名稱,網關等等,這個檔案中可以包含很多的東西。詳細的內容我們在設定網路的部分介紹# Source functions. /etc/rc.d/init.d/functions/etc/rc.d/init.d是所有的服務指令碼存放的地方,而functions是各種服務指令碼需要的一些參數的設定。有興趣的話你可以看一看,不看也不影響什麼。以下有一段是設定一些顯示資訊,接下來是這樣的內容:# Mount /proc (done here so volume labels can work with fsck)action "Mounting proc filesystem" mount -n -t proc /proc /proc連結/proc檔案系統,應該記得/proc是用來顯示系統狀態的虛擬檔案系統,注意action命令的文法,它顯示一段提示資訊,然後去執行相應的命令。然後的段落有一點意思:# Turn off sysrq#if [ "$MAGIC_SYSRQ" = "no" ]; then# echo "0" > /proc/sys/kernel/sysrq#fi$MAGIC_SYSRQ=no意味著你決定不使用核心調試,指令碼必須把系統的核心調試功能關閉,注意接下來的處理方法,在/proc/sys/kernel下建立一個名叫sysrq的檔案,並且設定其內容為"0",就關閉了這項功能,這也是在運行中開啟或者關閉核心的某個功能的標準方法,以後我們會經常看到這樣的例子。接下來要設定時鐘和鍵盤對應表,裝入系統字型,又是一段冗長的代碼,這裡將它省略,反正你總可以在自己的系統上看到他們。# Start up swapping.action "Activating swap partitions" swapon -aswapon –a 將讀/etc/fstab檔案,這個檔案中包含有系統中存在的應該自動掛接的各種檔案系統的列表,同時也包含了關於交換分區的知識,swapon –a將啟動其中標註的所有交換分區。# Set the hostname.action "Setting hostname ${HOSTNAME}" hostname ${HOSTNAME}# Set the NIS domain nameif [ -n "$NISDOMAIN" ]; thenaction "Setting NIS domain name $NISDOMAIN" domainname $NISDOMAINelsedomainname ""fi這兩段設定系統名字,我們應該記得$HOSTNAME已經在/etc/sysconfig/network檔案中設定過,所以這裡的action被執行,而$NISDOMAIN現在是Null 字元串,所以執行後hostname被設定而NIS網域名稱不存在。if [ -f /fsckoptions ]; then fsckoptions=`cat /fsckoptions`else fsckoptions=fiif [ -f /forcefsck ]; then fsckoptions="-f $fsckoptions"fi這裡是與管理員相關的行了。如果系統的/下將存在/forcefsck檔案,於是系統自動啟動fsck程式去檢查檔案系統是否有錯誤。接下來是一段關於是否存在/fastboot檔案的判斷,與其大同小異,然後系統將會決定是否啟用PNP,方法和處理MAGIC_SYSRQ是類似的,這兩段我們不討論了,你可以自己看一下。# Remount the root filesystem read-write.action "Remounting root filesystem in read-write mode" mount -n -o remount,rw /# Add /proc to /etc/mtabmount -f -t proc /proc /proc檢測根檔案系統完畢後,系統重新將/連結成讀寫方式,並且將/proc加入到/etc/mtab中。下面是非常重要的一步,如果系統核心支援可裝載模組,需要把$USEMODULES變數設定成"y"並且設定模組的預設路徑,參數等等,然後,系統開始裝入模組:# load sound modulesif [ -n "$USEMODULES" ]; then if grep -s -q "^alias sound " /etc/conf.modules ; thenaction "Loading sound module" modprobe sound fi .........fi...........當這些直接裝入的模組結束後,為了和以前的方式相容,也為了管理員的方便,這個指令碼試圖去尋找/etc/rc.d/rc.modules,如果存在就執行它:# Load modules (for backward compatibility with VARs)if [ -f /etc/rc.d/rc.modules ]; then /etc/rc.d/rc.modulesfi顯然,你可以將自己的模組初始化命令加入/etc/rc.d/rc.modules使它在啟動時得到運行。完成主要模組的裝入後,系統將開始一系列日常工作,如檢測有問題的檔案系統,連結所有本地檔案系統,啟動磁碟限額等等,如果系統還沒有被配置,那麼將啟動配置指令碼,設定網路,超級使用者口令等等,否則,對於已經配置好的系統,清理記賬檔案,準備進行系統工作。當一切都完成之後,系統按照inittab的設定,進入運行級3,執行/etc/rc.d/rc 3。/etc/rc.d/rc是一個很有意思的程式,它是一個shell指令碼,其行為是這樣:根據提供給它的參數,它去尋找相應的目錄rc${arg1}.d,例如,在/etc/rc.d/rc 3執行時,它去查詢/etc/rc.d/rc3.d下的所有檔案,試圖執行那些所有用S或K打頭的指令碼,凡是用S開頭的指令碼,它給加上一個start參數,凡是用K打頭的指令碼,加上一個stop參數。執行次序是按照S或K後跟的數值順序。例如,在現在的例子中,/etc/rc.d/rc 3下存在一個S50inet的指令碼,於是 rc 指令碼去執行S50inet start。而S50inet其實是到/etc/rc.d/init.d/inet的一個符號連結,其內容是(這裡只給出了部分內容):. /etc/rc.d/init.d/functions. /etc/sysconfig/networkif [ ${NETWORKING} = "no" ]then exit 0fi[ -f /usr/sbin/inetd ] || exit 0RETVAL=0# See how we were called.case "$1" instart) echo -n "Starting INET services: " daemon inetd RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/inet ;;stop) echo -n "Stopping INET services: " killproc inetd RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/inet ;;*) echo "Usage: inet {start|stop|status|restart|reload}" exit 1esacexit $REVALdaemon和killproc是在/etc/rc.d/init.d/functions裡面定義的函數,daemon將命令當成守護進程執行,killproc則殺掉對應進程。顯然,S50inet start的結果是inetd程式被啟動為一個守護進程。這裡的方法是啟動服務進程的標準模式,例如你要設定某個服務在runlevel 3被啟動,那麼你可以自己寫一個指令碼,比如說mydaemon,讓mydaemon start啟動服務,mydaemon stop停止服務,然後將這個指令碼複製到/etc/rc.d/init.d中,接著在/etc/rc.d/rc?.d中建立串連,在rc3.d中連結為S65mydaemon,而在其他目錄中為K65mydaemon,這樣你的指令碼就會在進入和退出運行級3時自動處理了。除此與run level相關的啟動指令之外,Linux還從BSD中引入了另外一些設定檔,其中最重要的是/etc/rc.d/rc.local,通常它在執行了全部運行級指令碼以後運行,你可以在這裡定製自己的設定,如歡迎資訊等等。 版本之間的區別如同我們看到的那樣,Redhat的啟動指令碼看上去井井有條,要尋找某個功能很容易,但是要尋找某個命令在何處啟動就顯得比較困難,經常需要從/etc/inittab開始。Turbo Linux和Red-Flag的指令碼和Redhat頗為相似,尤其是紅旗幾乎就是RedHat的中文版,它們的配置也相當近似。Slackware的啟動指令碼使用另外一種風格,實際上,看上去很象BSD系列。啟動指令碼也在/etc/rc.d下面,但是它把一些在大部分運行層級必須使用的指令碼做在了一起,冠以rc.modules,rc.inet1,rc.inet2等等的名字,這樣對於手工配置系統確實簡單的多,不過這些檔案都相當大,看起來需要耐心。對於這個系統,你只要看一遍/etc/inittab就能掌握它的設定檔位置了。Debian/Corel使用一種有趣的方式,看上去頗像Sun的Solaris。實際上,它和RedHat的方式幾乎是一樣的,但是啟動指令碼不是在/etc/rc.d,而是直接位於/etc下,例如/etc/rc1.d,/etc/rc2.d等等,知道了這一點之後,配置debian就不會感到困難了。關於Corel Linux我們應該特別地說一句,它的設定檔群組織看起來要比RedHat簡單一些,但是它沒有類似於rc.modules的設定,等價於rc.sysinit的檔案是/etc/init.d/rcS。它的運行層級定義也比較怪異,好像Run Level 2是正常的圖形模式,要配置Corel,最好是從/etc/inittab直接開始。無論如何,我們不會建議一個新手使用corel Linux。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.