linux系统的运行定义在,Linux系统运行级管理
運(yùn)行級(jí)的概念來(lái)自SystemV運(yùn)行級(jí)別將啟動(dòng)過(guò)程分成不同的集合每個(gè)集合包含一
組腳本當(dāng)init程序切換運(yùn)行級(jí)到對(duì)應(yīng)的級(jí)別時(shí)相應(yīng)的腳本就被觸發(fā)切換運(yùn)行
級(jí)可以通過(guò)執(zhí)行init[級(jí)別號(hào)]完成(比如在Linux中runlevel代表reboot所
以執(zhí)行init就會(huì)引起系統(tǒng)重新啟動(dòng))
下面是一個(gè)標(biāo)準(zhǔn)的Linux的/etc/inittab注意這里解釋的內(nèi)容來(lái)自redhat但是其他的
版本也大同小異我們將它分成若干段來(lái)解釋如同一般情況那樣用#開(kāi)始的行是注釋
而非注釋行的語(yǔ)法是
標(biāo)號(hào)運(yùn)行級(jí)別操作方式命令
標(biāo)號(hào)是這一行的標(biāo)簽運(yùn)行級(jí)別用于定義這一行應(yīng)該用于那些級(jí)別如果為空就定義
為所有級(jí)別操作方式可以是一些確定的字符串代表如何執(zhí)行后面的命令而命令則
給處在進(jìn)入這一級(jí)別時(shí)執(zhí)行的程序
下面是它的內(nèi)容
#DefaultrunlevelTherunlevelsusedbyRHSare:
#halt(DoNOTsetinitdefaulttothis)
#Singleusermode
#MultiuserwithoutNFS(Thesameasifyoudonothavenetworking)
#Fullmultiusermode
#unused
#X
#reboot(DoNOTsetinitdefaulttothis)
#
上面的幾行解釋了缺省的運(yùn)行級(jí)別定義
停機(jī)系統(tǒng)進(jìn)入這一級(jí)別后關(guān)機(jī)
單用戶模式在這個(gè)模式中只能從控制臺(tái)操作計(jì)算機(jī)網(wǎng)絡(luò)和終端不啟動(dòng)許多文件
系統(tǒng)也沒(méi)有連結(jié)
多用戶模式但關(guān)閉了網(wǎng)絡(luò)服務(wù)支持
完全的多用戶模式就是我們一般使用的模式
無(wú)定義
圖形界面模式系統(tǒng)切入這一運(yùn)行級(jí)后自動(dòng)啟動(dòng)XWindow系統(tǒng)
重新啟動(dòng)
這些級(jí)別的定義是任意的然而你最好不要修改它尤其是level和因?yàn)樵S多
程序都使用init之類的方式實(shí)現(xiàn)對(duì)系統(tǒng)的控制其他的Linux發(fā)行版本可能會(huì)更改
的定義你需要參考/etc/inittab才能判斷到底那個(gè)級(jí)別是什么意思不過(guò)一般來(lái)說(shuō)
和6總是上面的定義
下面開(kāi)始才是真正的內(nèi)容首先系統(tǒng)必須定義缺省的運(yùn)行級(jí)別
id::initdefault:
initdefault關(guān)鍵字決定了缺省的運(yùn)行級(jí)別在這里是也就是在執(zhí)行了公共的系統(tǒng)
啟動(dòng)腳本之后系統(tǒng)將會(huì)執(zhí)行與級(jí)別對(duì)應(yīng)的那些行
#Systeminitialization
si::sysinit:/etc/rcd/rcsysinit
這里的sysinit關(guān)鍵字定義了公共的系統(tǒng)初始化腳本在相應(yīng)于運(yùn)行級(jí)的地方是空
表示適用于所有運(yùn)行級(jí)別注意它將在系統(tǒng)進(jìn)入任何運(yùn)行級(jí)別以前完成一會(huì)我們?cè)?/p>
研究這個(gè)腳本的內(nèi)容
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
l::wait:/etc/rcd/rc
這里開(kāi)出了六個(gè)運(yùn)行級(jí)別的定義運(yùn)行級(jí)就去執(zhí)行命令/etc/rcd/rc運(yùn)行級(jí)是
/etc/rcd/rc諸如此類wait關(guān)鍵字表示系統(tǒng)必須等待此命令執(zhí)行完才能開(kāi)始
下一步工作
#Thingstorunineveryrunlevel
ud::once:/sbin/update
這又是一個(gè)適用于所有級(jí)別的命令update命令實(shí)際是去啟動(dòng)updated守護(hù)進(jìn)程以便
定期刷新內(nèi)存中的超級(jí)塊表Once關(guān)鍵字說(shuō)明這個(gè)項(xiàng)只被執(zhí)行一次
#TrapCTRLALTDELETE
ca::ctrlaltdel:/sbin/shutdowntrnow
ctrlaltdel定義當(dāng)熱啟動(dòng)組合鍵被觸發(fā)時(shí)系統(tǒng)的行為這里定義所有的運(yùn)行級(jí)別對(duì)它
的響應(yīng)都是重新啟動(dòng)(shutdown–r)
pf::powerfail:/sbin/shutdownfh+"PowerFailure;SystemShuttingDown
"
pr::powerokwait:/sbin/shutdownc"PowerRestored;ShutdownCancelled
"
這兩行定義如何響應(yīng)ups信息如果系統(tǒng)掉電(powerfail)執(zhí)行兩分鐘后關(guān)機(jī)的指令
如果關(guān)機(jī)之前電源恢復(fù)取消關(guān)機(jī)操作
#Rungettysinstandardrunlevels
::respawn:/sbin/mingettytty
::respawn:/sbin/mingettytty
::respawn:/sbin/mingettytty
::respawn:/sbin/mingettytty
::respawn:/sbin/mingettytty
::respawn:/sbin/mingettytty
都是多用戶級(jí)別為系統(tǒng)開(kāi)出個(gè)虛擬屏幕(就是用Alt+Fn即獲得虛擬屏幕)
respawn關(guān)鍵字表示這個(gè)動(dòng)作在每次進(jìn)入相應(yīng)運(yùn)行級(jí)別時(shí)都會(huì)執(zhí)行
#Runxdminrunlevel
#xdmisnowaseparateservice
x::respawn:/etc/X/prefdmnodaemon
對(duì)于級(jí)別啟動(dòng)圖形界面
歸納一下系統(tǒng)在讀入inittab以后要做什么?設(shè)置Ctrl+Alt+Del響應(yīng)設(shè)置好對(duì)UPS
的支持然后應(yīng)該執(zhí)行/etc/rcd/rcsysinit然后是/etc/rcd/rc最后是update
和啟動(dòng)虛擬屏幕顯然系統(tǒng)的主要初始化命令應(yīng)該在/etc/rcd/rcsysinit和/etc/r
cd/rc中完成
rcd下的基本腳本
下面我們來(lái)研究啟動(dòng)腳本這里的腳本來(lái)自redhat因?yàn)檫@是個(gè)最為廣泛使用的
版本其他的版本的特有問(wèn)題將在下一節(jié)討論
首先系統(tǒng)將執(zhí)行/etc/rcd/rcsysinit這是個(gè)shell腳本你可以用普通的文本編
輯工具對(duì)它進(jìn)行處理為了簡(jiǎn)便我們只研究其中較為重要的部分或者較為典型的段落
#!/bin/sh
#
#/etc/rcd/rcsysinitrunonceatboottime
#
#TakeninpartfromMiquelvanSmoorenburgsbcheckrc
#
#Rerunourselvesthroughinitlog
if[z"$IN_INITLOG"];then
[f/sbin/initlog]&&exec/sbin/initlog$INITLOG_ARGSr/etc/rcd/rc
sysinit
fi
首先確定系統(tǒng)中是否存在/sbin/initlog文件如果存在那么需要記錄初始化信息
#Setthepath
PATH=/bin:/sbin:/usr/bin:/usr/sbin
exportPATH
設(shè)置缺省路徑
#Readinconfigdata
if[f/etc/sysconfig/network];then
/etc/sysconfig/network
else
NETWORKING=no
HOSTNAME=localhost
fi
這一段是網(wǎng)絡(luò)的參數(shù)設(shè)置/etc/sysconfig/network的內(nèi)容是這樣
NETWORKING=yes
FORWARD_IPV="yes"
HOSTNAME="openlabasnceducn"
GATEWAY=""
GATEWAYDEV=""
顯然如果這個(gè)文件存在那么設(shè)置網(wǎng)絡(luò)的運(yùn)行參數(shù)如域名網(wǎng)關(guān)等等這個(gè)文件
中可以包含很多的東西詳細(xì)的內(nèi)容我們?cè)谠O(shè)置網(wǎng)絡(luò)的部分介紹
#Sourcefunctions
/etc/rcd/initd/functions
/etc/rcd/initd是所有的服務(wù)腳本存放的地方而functions是各種服務(wù)腳本需要的
一些參數(shù)的設(shè)置有興趣的話你可以看一看不看也不影響什么
以下有一段是設(shè)置一些顯示信息接下來(lái)是這樣的內(nèi)容
#Mount/proc(doneheresovolumelabelscanworkwithfsck)
action"Mountingprocfilesystem"mountntproc/proc/proc
連結(jié)/proc文件系統(tǒng)應(yīng)該記得/proc是用來(lái)顯示系統(tǒng)狀態(tài)的虛擬文件系統(tǒng)注意acti
on命令的語(yǔ)法它顯示一段提示信息然后去執(zhí)行相應(yīng)的命令
然后的段落有一點(diǎn)意思
#Turnoffsysrq
#if["$MAGIC_SYSRQ"="no"];then
#echo"">/proc/sys/kernel/sysrq
#fi
$MAGIC_SYSRQ=no意味著你決定不使用內(nèi)核調(diào)試腳本必須把系統(tǒng)的內(nèi)核調(diào)試功能關(guān)閉
注意接下來(lái)的處理方法在/proc/sys/kernel下建立一個(gè)名叫sysrq的文件并且設(shè)置
其內(nèi)容為""就關(guān)閉了這項(xiàng)功能這也是在運(yùn)行中打開(kāi)或者關(guān)閉內(nèi)核的某個(gè)功能的標(biāo)準(zhǔn)
方法以后我們會(huì)經(jīng)常看到這樣的例子
接下來(lái)要設(shè)置時(shí)鐘和鍵盤映射表裝入系統(tǒng)字體又是一段冗長(zhǎng)的代碼這里將它省
略反正你總可以在自己的系統(tǒng)上看到他們
#Startupswapping
action"Activatingswappartitions"swapona
swapon–a將讀/etc/fstab文件這個(gè)文件中包含有系統(tǒng)中存在的應(yīng)該自動(dòng)掛接的各
種文件系統(tǒng)的列表同時(shí)也包含了關(guān)于交換分區(qū)的知識(shí)swapon–a將啟動(dòng)其中標(biāo)注的
所有交換分區(qū)
#Setthehostname
action"Settinghostname${HOSTNAME}"hostname${HOSTNAME}
#SettheNISdomainname
if[n"$NISDOMAIN"];then
action"SettingNISdomainname$NISDOMAIN"domainname$NISDOMAIN
else
domainname""
fi
這兩段設(shè)置系統(tǒng)名字我們應(yīng)該記得$HOSTNAME已經(jīng)在/etc/sysconfig/network文件中
設(shè)置過(guò)所以這里的action被執(zhí)行而$NISDOMAIN現(xiàn)在是空字符串所以執(zhí)行后hostna
me被設(shè)置而NIS域名不存在
if[f/fsckoptions];then
fsckoptions=`cat/fsckoptions`
else
fsckoptions=
fi
if[f/forcefsck];then
fsckoptions="f$fsckoptions"
fi
這里是與管理員相關(guān)的行了如果系統(tǒng)的/下將存在/forcefsck文件于是系統(tǒng)自動(dòng)啟
動(dòng)fsck程序去檢查文件系統(tǒng)是否有錯(cuò)誤接下來(lái)是一段關(guān)于是否存在/fastboot文件的判
斷與其大同小異然后系統(tǒng)將會(huì)決定是否啟用PNP方法和處理MAGIC_SYSRQ是類似的
這兩段我們不討論了你可以自己看一下
#Remounttherootfilesystemreadwrite
action"Remountingrootfilesysteminreadwritemode"mountnoremount
rw/
#Add/procto/etc/mtab
mountftproc/proc/proc
檢測(cè)根文件系統(tǒng)完畢后系統(tǒng)重新將/連結(jié)成讀寫方式并且將/proc加入到/etc/mta
b中下面是非常重要的一步如果系統(tǒng)內(nèi)核支持可裝載模塊需要把$USEMODULES變量
設(shè)置成"y"并且設(shè)置模塊的缺省路徑參數(shù)等等然后系統(tǒng)開(kāi)始裝入模塊
#loadsoundmodules
if[n"$USEMODULES"];then
ifgrepsq"^aliassound"/etc/confmodules;then
action"Loadingsoundmodule"modprobesound
fi
fi
當(dāng)這些直接裝入的模塊結(jié)束后為了和以前的方式兼容也為了管理員的方便這個(gè)
腳本試圖去尋找/etc/rcd/rcmodules如果存在就執(zhí)行它
#Loadmodules(forbackwardcompatibilitywithVARs)
if[f/etc/rcd/rcmodules];then
/etc/rcd/rcmodules
fi
顯然你可以將自己的模塊初始化命令加入/etc/rcd/rcmodules使它在啟動(dòng)時(shí)得到
運(yùn)行
完成主要模塊的裝入后系統(tǒng)將開(kāi)始一系列日常工作如檢測(cè)有問(wèn)題的文件系統(tǒng)連
結(jié)所有本地文件系統(tǒng)啟動(dòng)磁盤限額等等如果系統(tǒng)還沒(méi)有被配置那么將啟動(dòng)配置腳
本設(shè)置網(wǎng)絡(luò)超級(jí)用戶口令等等否則對(duì)于已經(jīng)配置好的系統(tǒng)清理記賬文件準(zhǔn)
備進(jìn)行系統(tǒng)工作
當(dāng)一切都完成之后系統(tǒng)按照inittab的設(shè)定進(jìn)入運(yùn)行級(jí)執(zhí)行/etc/rcd/rc
/etc/rcd/rc是一個(gè)很有意思的程序它是一個(gè)shell腳本其行為是這樣根據(jù)提供
給它的參數(shù)它去尋找相應(yīng)的目錄rc${arg}d例如在/etc/rcd/rc執(zhí)行時(shí)它去
查詢/etc/rcd/rcd下的所有文件試圖執(zhí)行那些所有用S或K打頭的腳本凡是用S開(kāi)
頭的腳本它給加上一個(gè)start參數(shù)凡是用K打頭的腳本加上一個(gè)stop參數(shù)執(zhí)行次
序是按照S或K后跟的數(shù)值順序
例如在現(xiàn)在的例子中/etc/rcd/rc下存在一個(gè)Sinet的腳本于是rc腳本去
執(zhí)行Sinetstart而Sinet其實(shí)是到/etc/rcd/initd/inet的一個(gè)符號(hào)連結(jié)其內(nèi)
容是(這里只給出了部分內(nèi)容)
/etc/rcd/initd/functions
/etc/sysconfig/network
if[${NETWORKING}="no"]
then
exit
fi
[f/usr/sbin/inetd]||exit
RETVAL=
#Seehowwewerecalled
case"$"in
start)
echon"StartingINETservices:"
daemoninetd
RETVAL=$?
echo
[$RETVALeq]&&touch/var/lock/subsys/inet
;;
stop)
echon"StoppingINETservices:"
killprocinetd
RETVAL=$?
echo
[$RETVALeq]&&rmf/var/lock/subsys/inet
;;
*)
echo"Usage:inet{start|stop|status|restart|reload}"
exit
esac
exit$REVAL
daemon和killproc是在/etc/rcd/initd/functions里面定義的函數(shù)daemon將命令
當(dāng)成守護(hù)進(jìn)程執(zhí)行killproc則殺掉對(duì)應(yīng)進(jìn)程顯然Sinetstart的結(jié)果是inetd程
序被啟動(dòng)為一個(gè)守護(hù)進(jìn)程
這里的方法是啟動(dòng)服務(wù)進(jìn)程的標(biāo)準(zhǔn)模式例如你要設(shè)置某個(gè)服務(wù)在runlevel被啟動(dòng)
那么你可以自己寫一個(gè)腳本比如說(shuō)mydaemon讓mydaemonstart啟動(dòng)服務(wù)mydaem
onstop停止服務(wù)然后將這個(gè)腳本復(fù)制到/etc/rcd/initd中接著在/etc/rcd/rc?
d中建立連接在rcd中連結(jié)為Smydaemon而在其他目錄中為Kmydaemon這樣你
的腳本就會(huì)在進(jìn)入和退出運(yùn)行級(jí)時(shí)自動(dòng)處理了
除此與runlevel相關(guān)的啟動(dòng)指令之外Linux還從BSD中引入了另外一些配置文件其
中最重要的是/etc/rcd/rclocal通常它在執(zhí)行了全部運(yùn)行級(jí)腳本以后運(yùn)行你可以
在這里定制自己的設(shè)置如歡迎信息等等
版本之間的區(qū)別
如同我們看到的那樣Redhat的啟動(dòng)腳本看上去井井有條要尋找某個(gè)功能很容易
但是要尋找某個(gè)命令在何處啟動(dòng)就顯得比較困難經(jīng)常需要從/etc/inittab開(kāi)始
TurboLinux和RedFlag的腳本和Redhat頗為相似尤其是紅旗幾乎就是RedHat的中文
版它們的配置也相當(dāng)近似
Slackware的啟動(dòng)腳本使用另外一種風(fēng)格實(shí)際上看上去很象BSD系列啟動(dòng)腳本也
在/etc/rcd下面但是它把一些在大部分運(yùn)行級(jí)別必須使用的腳本做在了一起冠以r
cmodulesrcinetrcinet等等的名字這樣對(duì)于手工配置系統(tǒng)確實(shí)簡(jiǎn)單的多不
過(guò)這些文件都相當(dāng)大看起來(lái)需要耐心對(duì)于這個(gè)系統(tǒng)你只要看一遍/etc/inittab就
能掌握它的配置文件位置了
Debian/Corel使用一種有趣的方式看上去頗像Sun的Solaris實(shí)際上它和RedHat
的方式幾乎是一樣的但是啟動(dòng)腳本不是在/etc/rcd而是直接位于/etc下例如/et
c/rcd/etc/rcd等等知道了這一點(diǎn)之后配置debian就不會(huì)感到困難了
總結(jié)
以上是生活随笔為你收集整理的linux系统的运行定义在,Linux系统运行级管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三阶魔方CFOP cross总结
- 下一篇: linux常用高级命令,Linux常用高