linux sis启动命令,Linux系统开机过程详细分析
Linux系統(tǒng)開機(jī)過(guò)程詳細(xì)分析
各位是否曾經(jīng)對(duì)電腦整個(gè)開機(jī)的流程感到好奇呢???這一次?,?我們所要討論的
主題?,?就是?Linux?從開機(jī)的一瞬間到?login?為止?,?到底發(fā)生了什么事情??
想必各位都知道?,?在剛開機(jī)時(shí)?,?由于?80x86?的特性?,?CS?(?Code?Segment?)
這個(gè)寄存器中全部都放著?1?,?而?IP?(?Instruction?Pointer?)?這個(gè)寄存器
中全部都放著?0?,?換句話說(shuō)?,?CS=FFFF?而?IP=0000?,?此時(shí)?,?CPU?就依據(jù)
CS?及?IP?的值?,?到?FFFF0H?去執(zhí)行那個(gè)地方所放的指令?.?這時(shí)候?,?由于
FFFF0H?已經(jīng)到了高位址的頂端?,?所以?,?FFFF0H?這個(gè)地方?,?總是會(huì)放一個(gè)
JMP?指令?,?跳到比較低的位址?.?接著?,?ROM?BIOS?就會(huì)作一些檢查的動(dòng)作
像內(nèi)存?,?鍵盤?等......?并在我們俗稱的?UMB?(?Upper?Memory?Block?)
之中掃描?,?看看是否有合法的?ROM?存在?(?比如?SCSI?卡上的?ROM?)?.
假如有?,?就到里面去執(zhí)行一些東西?,?執(zhí)行完之后再繼續(xù)剛才的行程?.?到了
最后?,?讀取硬盤上的第一個(gè)?sector?.?在這里?,?我假設(shè)各位由硬盤啟動(dòng)
因此?,?就硬盤的構(gòu)造而言?,?它的第一個(gè)?sector?稱為?MBR?(?Master?Boot
Record?)?.?因?yàn)橐粋€(gè)?sector?是?512?bytes?,?而?MBR?這?512?bytes?可分
為兩個(gè)部份?,?第一個(gè)部份為?Pre-Boot?區(qū)?,?占了?446?bytes?;?第二部份
是?Partition?Table?,?占了?66?bytes?.?Pre-Boot?區(qū)的作用之一?,?就是
去看看那個(gè)?Partition?被標(biāo)成?Active?,?然後去讀那個(gè)?Partition?的?Boot
區(qū)?.
在?Linux?的啟動(dòng)方面?,?一般人最常把?LILO?放在?MBR?或?Superblock
假如你把?LILO?放在?MBR?,?那很明顯的?,?當(dāng)讀取到?MBR?的時(shí)候?,?LILO
就被執(zhí)行?,?此時(shí)?,?你的屏幕上會(huì)出現(xiàn)?boot:?接著?,?就進(jìn)行?Load?Kernel
的動(dòng)作?.?在另一方面來(lái)說(shuō)?,?假如你把?LILO?安裝在?Superblock?,?通常你
還會(huì)有一個(gè)管理開機(jī)的程序?,?也許是放在?MBR?(?像?OSBS?)?或者是放在一
個(gè)單獨(dú)的?Partition?(?像?OS/2?的?Boot?Manager?)?.?再由這個(gè)管理開機(jī)
的程式去讀取?LILO?,?進(jìn)而做?Load?Kernel?的動(dòng)作?.
好了?,?到了目前為止?,?我們已經(jīng)講到?Load?Kernel?的動(dòng)作?.?Kernel?被
load?到?memory?中之后?,?接著進(jìn)行一連串?probe?周邊的動(dòng)作?,?像串口
并口?,?軟盤?,?聲卡?,?硬盤?,?光驅(qū)?等?......?接著?mount?root
partition?.?在這之后?,?kernel?會(huì)起動(dòng)?init?這個(gè)?process?.?init?這
個(gè)?process?的?PID?為?1?,?它是所有?process?的祖先?.
接下來(lái)呢???系統(tǒng)就開始執(zhí)行?/rc.d/rc.S?,?在這里?,?我們暫時(shí)打住?,
先對(duì)大概的?initialization?script?執(zhí)行的順序作一個(gè)瀏覽?,?請(qǐng)看下面
的流程?:
init[1]
rc.S?begin?
rc.serial?begin
rc.serial?end
rc.S?end
init[1]?enter?runlevel?5
rc.M?begin
rc.inet1?begin
rc.inet1?end
rc.inet2?begin
rc.inet2?end
rc.font?begin
rc.font?end
rc.local?begin
rc.local?end
rc.M?end
login
上面的流程清楚的指出?,?在?rc.S?這個(gè)?shell?script?中?,?會(huì)去執(zhí)行?rc.serial
接著再執(zhí)行?rc.M?,?rc.M?中又包含了?rc.inet1?,?rc.inet2?,?rc.font?,?rc.local
最后執(zhí)行?login?.?在下面的內(nèi)容中?,?將為各位介紹這幾個(gè)?shell?script
從下面開始?,?凡是每一列之前有一個(gè)?#?的?,?為原來(lái)?shell?script?中的注釋
有兩個(gè)?#?的?,?為筆者加上的注釋?,?當(dāng)然啦?,?沒(méi)有任何?#?的為?shell?script
的內(nèi)容?,?而對(duì)命令或內(nèi)容的解釋?,?一律都寫在命令或內(nèi)容的前面?.
首先由?rc.S?開始?:
*****************************?rc.S?**********************************
#!/bin/sh
#
#?/etc/rc
#
#?These?commands?are?executed?at?boot?time?by?init(8).
#?User?customization?should?go?in?/etc/rc.local.
echo?'========?rc.S?is?running?!?System?Initializing?Now?!!!?========'
PATH=/sbin:/usr/sbin:/bin:/usr/bin
##?打開所有?swap?!?下面?/sbin/swapon?-a?的意思是?:?使得?/etc/fstab?中被記錄
##?成?swap?的?device?全部啟動(dòng)?.
/sbin/swapon?-a
?
##?喔?!?下面這個(gè)指令?update?就很重要了?,?它負(fù)責(zé)每隔一段固定的時(shí)間?,?就將
##?buffer?中的資料?,?利用?sync?寫回磁盤上?,?并將?superblock?做?update
##?的動(dòng)作?.?使用?ps?這個(gè)指令看看有那些?process?,?就可看到?update?還有一個(gè)
##?bdflush?,?這兩個(gè)?process?都是必然要存在的?,?可不要隨便砍掉?,?要不然?,
##?萬(wàn)一系統(tǒng)?crash?了?,?那磁盤里面的資料就不是最新的了?......
/sbin/update?&
?
##?利用?echo?-n?>;>;?制造一個(gè)文件?,?并用?rm?-f?這個(gè)檔案來(lái)測(cè)試?root?partition
##?是不是?read-only?或者是可讀寫
READWRITE=no
if?echo?-n?>;>;?"Testing?filesystem?status";?then
rm?-f?"Testing?filesystem?status"
READWRITE=yes
fi
?
##?假如?root?partition?是?read-only?就作?fsck?的動(dòng)作?,?假如不是?read-only
##?而是?read-write?的話?,?就做下面?else?之后的動(dòng)作
if?[?!?$READWRITE?=?yes?];?then
##?利用?fsck?做檢查及修復(fù)文件系統(tǒng)的工作?,?后面接的兩個(gè)參數(shù)?-A?,?-a?.
##?-A?的意思是?:?fsck?會(huì)依據(jù)?/etc/fstab?中的記錄?,?去檢查所有的文件
##?系統(tǒng)?;?而?-a?就是?auto?的意思?,?當(dāng)?fsck?有修復(fù)的動(dòng)作時(shí)?,?它不會(huì)問(wèn)
##?你問(wèn)題?,?而直接修復(fù)?.
/sbin/fsck?-A?-a
?
##?假如?fsck?有?error?,?[?$??-gt?1?]?括號(hào)里面的意思是?:?若上個(gè)命令的
##?傳回值大于?1?,?而上個(gè)命令就是?fsck?.?讓我們看看?fsck?的傳回值?:
##?0?-?No?errors
##?1?-?File?system?errors?corrected
##?2?-?File?system?errors?corrected,?system?should
##?be?rebooted?if?file?system?was?mounted
##?4?-?File?system?errors?left?uncorrected
##?8?-?Operational?error
##?16?-?Usage?or?syntax?error
##?128?-?Shared?library?error
##?很明顯的?,?若有任何錯(cuò)誤產(chǎn)生的話?,?那?fsck?的傳回值都大于?1?.?其實(shí)
##?就我的觀點(diǎn)認(rèn)為?,?應(yīng)該寫成?if?[?$??-ge?1?]?比較好?.?既然有錯(cuò)呢?,?系統(tǒng)
##?應(yīng)該就要跳至單用戶模式?,?在單用戶模式中主要就是?/etc/rc.d/rc.K
##?中的兩件事?:?關(guān)掉?swap?及?卸下所有的文件系統(tǒng)?,?而最后重新?login?.
##?一般正常的情況下?,?if?下面這一大段是不會(huì)執(zhí)行的?,?而會(huì)跳至下面
##?標(biāo)有?*************************?Normal?1?*************************?處
if?[?$??-gt?1?]?;?then
echo
echo
echo?"**************************************"
echo?"fsck?returned?error?code?-?REBOOT?NOW!"
echo?"**************************************"
echo
echo
/bin/login
fi
##?******************************?Normal?1?**************************
##?當(dāng)?fsck?檢查沒(méi)有錯(cuò)誤之后?,?就把?root?partition?重新?mount?上來(lái)
##?下面指令的參數(shù)有三個(gè)?,?-w?代表mount?成可讀寫?,?-n?代表把一個(gè)?file-
##?system?mount?上來(lái)?,?但不會(huì)把記錄寫到?/etc/mtab?中?,?在上次對(duì)?/etc/mtab
##?介紹時(shí)有提到?,?當(dāng)我們使用?mount?這個(gè)指令把一個(gè)?filesystem?mount?上來(lái)
##?的時(shí)候?,?/etc/mtab?就會(huì)記錄?!?利用?-n?這個(gè)?option?可使得做?mount?的動(dòng)
##?作?,?卻不會(huì)記錄?.?-o?后面可以接許多的選項(xiàng)?,?在這里?,?我們給它的選項(xiàng)是
##?remount?.?remount?的意思是?:?重新?mount?一個(gè)已經(jīng)被?mount?的?filesystem
##?這個(gè)選項(xiàng)通常被用來(lái)改變?cè)?filesystem?的讀寫標(biāo)志?,尤其是把?filesystem
##?從?read-only?的狀態(tài)?,?改變成?read-write?的狀態(tài)?.
echo?"Remounting?root?device?with?read-write?enabled."
/sbin/mount?-w?-n?-o?remount?/
?
##?在前面的情況中?,?都是?root?partition?為?read-only?的狀態(tài)下?,?所做的一些
##?工作?,?到了最后一個(gè)指令?/sbin/mount?-w?-n?-o?remount?/?,?才把?root
##?partition?mount?成?read-write?.?各位有沒(méi)有看到前面那行?:
##?if?[?!?$READWRITE?=?yes?];?then?.....?下面這個(gè)?else?就是與這個(gè)?if?對(duì)應(yīng)
##?也就是說(shuō)?,?前面那個(gè)?if?的區(qū)塊中?,?所作的工作都是在?root?partition?為
##?read-only?的條件成立下所作的事?,?那很明顯的?,?下面這個(gè)?else?就是?root
##?partition?為?read-write?的條件下所作的工作?.?假如你的?root?partition
##?為?read-writeable?的話?,?那么系統(tǒng)就會(huì)顯示下面的信息?.?cat?<
##?事?,?就是把?EOF?之前的信息全部顯示在屏幕上?:
##?我想?,?下面的信息寫得很明顯了?,?它說(shuō)?:?你的?root?partition?被?mount?成
##?read-write?,?沒(méi)有辦法檢查?,?要使檢查的動(dòng)作能夠順利的進(jìn)行?,?你必須把
##?root?partition?mount?成?read-only?!?那要怎么做呢???很容易?,?只要利用
##?rdev?-R?/?1?就可以了?......
else
cat?<
***?Root?partition?has?already?been?mounted?read-write.?Cannot?check!
For?filesystem?checking?to?work?properly,?your?system?must?initially?mount
the?root?partition?as?read?only.?Please?modify?your?kernel?with?'rdev'?so
that
it?does?this.?If?you're?booting?with?LILO,?type:
rdev?-R?/vmlinuz?1
(^^^^^^^^?...?or?whatever?your?kernel?name?is.)
If?you?boot?from?a?kernel?on?a?floppy?disk,?put?it?in?the?drive?and?type:
rdev?-R?/dev/fd0?1
This?will?fix?the?problem?*AND*?eliminate?this?annoying?message.?:^)
EOF
?
##?下面這個(gè)指令沒(méi)什么好說(shuō)的?,?就是暫停?10?秒鐘?,?讓?user?能夠有充足的
##?時(shí)間看完上面的信息
sleep?10
fi
?
##?刪除?/etc/mtab?/etc/nologin?/etc/utmp
/bin/rm?-f?/etc/mtab*?/etc/nologin?/etc/utmp
?
##?制造?/etc/utmp?,?這是一個(gè)很典型制造空文件的寫法?.?/dev/null?這個(gè)?node
##?蠻有趣的?,?在某一方面來(lái)說(shuō)?,?它有點(diǎn)像是一個(gè)?"?黑洞?"?.?怎么說(shuō)呢??
##?各位可以試試看下面的指令?ls?>;>;?/dev/null?,?當(dāng)你使用這個(gè)指令之后會(huì)
##?發(fā)生什么事呢???什么也沒(méi)發(fā)生?,?而且?ls?的輸出就好像被丟到黑洞里?,?無(wú)
##?影無(wú)蹤了?.?那也許你會(huì)想?:?那這有什么用???我的回答是?:?的確沒(méi)有什么
##?很大的用處?,?但當(dāng)你想抑制輸出的信息時(shí)?,?你就會(huì)用得到了?.
cat?/dev/null?>;>;?/etc/utmp
?
##?依據(jù)?fstab?(?filesystem?table?)?中的描述?,?自動(dòng)的掛上文件系統(tǒng)
##?但此時(shí)因?yàn)?TCP/IP?還沒(méi)有設(shè)定?,?故不用?NFS
echo?'Mount?Filesystem?!!!'
/sbin/mount?-avt?nonfs
?
##?設(shè)定系統(tǒng)的時(shí)鐘?.?下面這幾行所做的事就是?:?看看?/sbin/clock?這個(gè)文件是
##?不是可執(zhí)行的?,?假如可以執(zhí)行?,?就把?CMOS?中的時(shí)間設(shè)定為系統(tǒng)的時(shí)間?.
if?[?-x?/sbin/clock?];?then
echo?'Set?System?Clock'
/sbin/clock?-s
fi
?
##?下面的四行若沒(méi)有?mark?,?則每次開機(jī)?issue?及?motd?都會(huì)被改變?,?這應(yīng)該
##?可算是?FAQ?級(jí)的問(wèn)題了?......?因?yàn)槲矣凶约涸O(shè)計(jì)的?issue?及?motd?,?所以
##?下面的四行前面都有?#?,?被注釋掉?.
##?假如你要有自己的設(shè)定?,?下面一定都要?mark?起來(lái)
#echo?>;?/etc/issue
#echo?Welcome?to?Linux?/bin/uname?-a?|?/bin/cut?-d\?-f3.?>;>;?/etc/issue
#echo?>;>;?/etc/issue
#echo?"/bin/uname?-a?|?/bin/cut?-d\?-f1,3.?(Posix)."?>;?/etc/motd
?
##?接下來(lái)?,?將執(zhí)行?rc.serial?,?顧名思義?,?rc.serial?是作串口設(shè)定的工作
##?在?rc.serial?中?,?內(nèi)容雖然也是很簡(jiǎn)單?,?但并不像?rc.S?那樣直接?.?換句話
##?說(shuō)?,?讀者至少要?"?稍微?"?懂一點(diǎn)?shell?programming?,?所以說(shuō)呢?,?假如
##?還不會(huì)?shell?programming?的讀者呢?,?都應(yīng)該趕快去找一本書來(lái)看一下?,?在
##?這篇文章的結(jié)尾?,?我會(huì)提出一些書單?,?各位可以去找找這幾本書?......
/bin/sh?/etc/rc.d/rc.serial
echo?'=================?rc.S?is?finish?NOW?!!!?========================='
?
?
到了這里?,?rc.S?的最後一步?,?是去執(zhí)行?rc.serial?.?大家可以看一看
/rc.d/rc.serial?.?好像很長(zhǎng)的樣子?,?但實(shí)際上呢?,?各位必然發(fā)現(xiàn)到了?,?這個(gè)
shell?script?大部份指令的前面都有一個(gè)?'#'?號(hào)?,?這代表著?,?這些指令完全
不會(huì)被執(zhí)行?.?所以呢?,?真正有用的只不過(guò)寥寥十幾行吧?!?在另一方面來(lái)說(shuō)?,
假如你是用網(wǎng)卡連上網(wǎng)絡(luò)?,?那?rc.serial?對(duì)你并沒(méi)有什么大用處?.
?
****************************?rc.serial?******************************
#!/bin/sh
#
#?/etc/rc.serial
#?Initializes?the?serial?ports?on?your?system
#
#?Version?2.01
echo?'=======================?rc.serial?is?begin?!!!?====================='
cd?/dev
##?下面三行中的前兩行是設(shè)定一些變量?,?由于在這個(gè)?shell?script?中?,?需要
##?用到?/bin/setserial?-b?這個(gè)指令?,?或是需要用到所有以?cua?開頭的?node
##?的次數(shù)太多了?,?因此?,?把它們?cè)O(shè)定為一個(gè)變量?,?是一個(gè)不錯(cuò)的方法?.?尤其
##?PORTS=`echo?cua??cua??`?這是一個(gè)聰明的寫法?,?那為什么不寫成?PORT=
##?`echo?cua*`?呢???各位可以在?/dev?下分別使用這兩個(gè)指令?,?觀察輸出到底
##?有什么不同?......
SETSERIAL="/bin/setserial?-b"
PORTS=`echo?cua??cua??`
echo?-n?"Configuring?serial?ports...."
?
##?下面這行?,?沒(méi)有學(xué)過(guò)?shell?programming?的人很可能會(huì)看不懂?,?不過(guò)沒(méi)有
##?關(guān)系?,?這行中的?${SETSERIAL}?會(huì)被換成?/bin/setserial?-b?,?而?${PORTS}
##?會(huì)被換成?cua0?cua1?cua2?.......?cua31?,?所以整句翻譯就是?:
##?/bin/setserial?-b?-W?cua0?cua1?cua2?cua3?cua4?cua5?cua6?......?cua31
##?那這行指令到底在做什么呢???其實(shí)只是在做中斷偵測(cè)的工作?.
${SETSERIAL}?-W?${PORTS}
?
##?各位看到下面原來(lái)的注釋了吧?.?當(dāng)你有一些特殊的卡時(shí)?,?你可以把相對(duì)應(yīng)部
##?份前面的?'#'?去掉?,?以便能做自動(dòng)設(shè)定的工作?.?其實(shí)呢?,?這種情況實(shí)在
##?不多?,?大部份人的設(shè)備都差不了多少?,?說(shuō)到關(guān)于串口?,?差異就更少了?.
#
#?AUTOMATIC?CONFIGURATION
#
#?Uncomment?the?appropriate?lines?below?to?enable?auto-configuration
#?of?a?particular?board.?Or?comment?them?out?to?disable?them....
#
?
##?好了?,?這下我們又多了一個(gè)變量?:?AUTO_IRQ?,?這在下面會(huì)用到?.
AUTO_IRQ=auto_irq
?
##?下面幾行非常整齊?,?它們可以分別被換成?:
##?/bin/setserial?-b?/dev/cua??auto_irq?skip_test?autoconfig
##?setserial?說(shuō)穿了也沒(méi)什么?,?這個(gè)指令可以讓你對(duì)?serial?port?做設(shè)定及回報(bào)
##?的動(dòng)作?,?像?IRQ?,?I/O?port?啦等等的事情?.?一般的情況下?,?大家的電腦中
##?通常只有?COM1-COM4?,?但假如你想增加新的?port?,?那?setserial?就派上用
##?場(chǎng)了?.
#?These?are?the?standard?COM1?through?COM4?devices
#
#?If?you?have?an?internal?modeme?with?a?Rockwell?Chipset,?add?a?"skip_test"
#?to?the?/dev/cua3?line?below.?(It's?not?added?by?default?because?it?will
#?screw?up?people?with?8514?displays).
#
${SETSERIAL}?/dev/cua0?${AUTO_IRQ}?skip_test?autoconfig
${SETSERIAL}?/dev/cua1?${AUTO_IRQ}?skip_test?autoconfig
${SETSERIAL}?/dev/cua2?${AUTO_IRQ}?skip_test?autoconfig
${SETSERIAL}?/dev/cua3?${AUTO_IRQ}?autoconfig
#?These?are?for?the?first?AST?Fourport?board?(base?address?0x1A0)
#
${SETSERIAL}?/dev/cua4?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua5?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua6?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua7?${AUTO_IRQ}?autoconfig
#?These?are?for?the?second?AST?Fourport?board?(base?address?0x2A0)
#
${SETSERIAL}?/dev/cua8?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua9?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua10?${AUTO_IRQ}?autoconfig
${SETSERIAL}?/dev/cua11?${AUTO_IRQ}?autoconfig
?
##?從這里以下?,?我省略了一大段?,?因?yàn)檫@一大段都是支持特殊的卡
#?These?are?the?3rd?and?4th?ports?on?the?Accent?Async?board.
#
#${SETSERIAL}?/dev/cua12?${AUTO_IRQ}?autoconfig
#${SETSERIAL}?/dev/cua13?${AUTO_IRQ}?autoconfig
#
?
.
.
.
.
.
.
.
?
##?好了?,?我們跳掉了一大段?,?直到這里?.?各位看到下面的注解了?.
##?假如你想用手動(dòng)的方法指定?IRQ?,?I/O?port?,?及指定?chip?的型號(hào)
##?那你可以拿掉下面對(duì)應(yīng)那行前面的?'#'?并作適當(dāng)?shù)男薷?,?比如說(shuō)
##?你用的是比較新的?16550?或?16550A?,?而不是?16450?,?那你就可以
##?在下面用手動(dòng)的方法指定?.?實(shí)際上?,?用?autoconfig?及?autoirq
##?的選項(xiàng)就可以了?,?沒(méi)有必要用手動(dòng)的方式?.?除非偵測(cè)不到?.
###############################################################
#
#?MANUAL?CONFIGURATION
#
#?If?you?want?to?do?manual?configuration?of?one?or?more?of?your
#?serial?ports,?uncomment?and?modify?the?relevant?lines.
#
###############################################################
#?These?are?the?standard?COM1?through?COM4?devices
#
#${SETSERIAL}?/dev/cua0?uart?16450?port?0x3F8?irq?4
#${SETSERIAL}?/dev/cua1?uart?16450?port?0x2F8?irq?3
#${SETSERIAL}?/dev/cua2?uart?16450?port?0x3E8?irq?4
#${SETSERIAL}?/dev/cua3?uart?16450?port?0x2E8?irq?3
.
.
.
.
.
.
.
.
##?Ok?,?到此?,?rc.S?及?rc.serial?已經(jīng)結(jié)束?,?因?yàn)榻馗鍟r(shí)間的關(guān)系?,?rc.M
##?rc.inet1?,?rc.inet2?,?rc.font?,?rc.local?將在以后為各位介紹?.
echo?"done."
${SETSERIAL}?-bg?${PORTS}
echo?'?======================?rc.serial?is?complete?!!!?==================='
?
?
*?關(guān)于?Shell?Programming?的書單?:
Title:?The?Unix?C?Shell?Field?Guide
Authors:?Gail?Anderson?and?Paul?Anderson
Publisher:?Prentice?Hall
Edition:?1986
ISBN:?0-13-937468-X
這本是?C-Shell?的?Bible?,?想學(xué)?C-Shell?的人?,?可以去看這本書?.
?
Title:?Unix?Shell?Programming
Authors:?Stephen?Kochan?and?Patrick?Wood
Publisher:?Hayden
Edition:?1990
ISBN:?0-672-48448-X
喔?!?這本書以?Bourne?Shell?為主?,?內(nèi)容深入淺出?,?讀者很容易就可以了解
這本書的內(nèi)容?,?進(jìn)而掌握?Bourne?Shell?的精髓?.?此外?,?這本書也有提到
Korn?Shell?,?大體上來(lái)說(shuō)?,?是一本值得看的好書?.
?
*如何聯(lián)系作者?:
E-Mail?Address?:?[email]jhhsu@csie.nctu.edu.tw[/email]
[email]u8217017@cc.nctu.edu.tw[/email]
Dormitory?:?交通大學(xué)十舍?317R
..
?
?
Linux?開機(jī)程序之研討
CCCA?資工86?許景華
在上次的介紹中?,?我們已經(jīng)看完了?rc.S?及?rc.serial?這兩個(gè)?shell?script?.
現(xiàn)在?,?我們將把剩下的?shell?script?再作一個(gè)介紹?.
首先還是看看全部的流程?:
?
init[1]
rc.S?begin
rc.serial?begin
rc.serial?end
rc.S?end?
init[1]?enter?runlevel?5
rc.M?begin
rc.inet1?begin
rc.inet1?end
rc.inet2?begin
rc.inet2?end
rc.font?begin
rc.font?end
rc.local?begin
rc.local?end
rc.M?end
login
?
這次主要的部份可分為兩項(xiàng)?:?因?yàn)?init?將會(huì)去讀取?inittab?,?所以?inittab
將被列為第一部份的重點(diǎn)?,?而第二部份就是?rc.M?,?rc.font?,?rc.local
這幾個(gè)?shell?script?的說(shuō)明?.?(?rc.inet1?,?rc.inet2?這兩個(gè)關(guān)于網(wǎng)絡(luò)的
shell?script?將在以后單獨(dú)說(shuō)明?)
好了?,?我們先從?inittab?看起吧?!?看看上面的流程?,?在第一行?:?init[1]
也就是?init?這個(gè)?process?被啟動(dòng)之后?,?它會(huì)去讀取?/etc/inittab?這個(gè)文件
以完成系統(tǒng)的啟動(dòng)?.?從這里?,?我們看到了?LINUX?的確融合了?SVR4?及?SunOS
的一些特性?,?inittab?這個(gè)文件?,?在?SunOS?系統(tǒng)中是不存在的?,?但是它卻是
SVR4?典型的文件?.?init?這個(gè)?process?會(huì)依據(jù)?/etc/inittab?中所記載的內(nèi)容
進(jìn)入不同的?run-level?并啟動(dòng)不同的?process?.?所以?inittab?的重要性
可見一斑?.?那什么叫?run-level?呢???所謂?run-level?就是系統(tǒng)中定義了許多
不同的?level?,?而系統(tǒng)會(huì)隨著?level?的不同而去啟動(dòng)不同的資源?.
現(xiàn)在就讓我們來(lái)看一下?/etc/inittab?中的內(nèi)容?:
在?/etc/inittab?這個(gè)文件中?,?每一列是一個(gè)進(jìn)入點(diǎn)?,?假如我們仔細(xì)觀察每一列
的話?,?那我們就會(huì)很容易的發(fā)現(xiàn)?,?/etc/inittab?的每一列可以被?"?:?"?這個(gè)
字符分成好幾個(gè)欄位?.?這幾個(gè)欄位的格式如下?:
id:runlevels:action:process
而它們代表的意義分別如下?:
id?:?由兩個(gè)獨(dú)特的字符所組成的辨示符號(hào)?,?在比較新的?UNIX?系統(tǒng)中?,?已不
受只能有兩個(gè)字符的限制?.
runlevels?:?指出下面一個(gè)欄位中的?action?以及?下下個(gè)欄位中的?process
會(huì)在那些?runlevel?中被執(zhí)行?.?這一欄的合法值有?0,1,2...6
s?以及?S?.?而在正常的啟動(dòng)程序之后?,?Superuser?可以使用
telinit?這個(gè)指令來(lái)改變系統(tǒng)的?runlevel?.?又因?yàn)樵?LINUX?中
,?runlevel?的預(yù)設(shè)值是?5?(?等一下就會(huì)看到?)?所以?,?只有
那些每一列中?runlevel?那欄有?5?這個(gè)值的?,?后面的?process
才會(huì)被啟動(dòng)?.?所以?,?我們就可以想像的到?:?"?由于系統(tǒng)的
runlevel?不同?,?所起動(dòng)的?process?也不盡相同?,?所以系統(tǒng)
起動(dòng)的資源在每個(gè)不同的?runlevel?就會(huì)有差異存在?.
action?:?這個(gè)欄位有一點(diǎn)復(fù)雜?,?在這個(gè)欄位中記錄著?init?在啟動(dòng)相對(duì)應(yīng)的
process?時(shí)?,?對(duì)?process?所采取的動(dòng)作?,?而合法的動(dòng)作有下面幾項(xiàng):
initdefault?:?指出系統(tǒng)在啟動(dòng)時(shí)?,?預(yù)設(shè)進(jìn)入的?run-level?值?,
比如說(shuō)?,?我們可以在?/etc/inittab?中找到下面這
一列?:?id:3:initdefault:
很明顯的?,?系統(tǒng)將在啟動(dòng)時(shí)?,?進(jìn)入?runlevel?為?3
的模式?.?當(dāng)然?,?你可以把?3?改成?4?試試看?,?如
果你改成了?4?,?那將會(huì)執(zhí)行?/etc/rc.d/rc.4?,?也
就是?run?xdm?.?xdm?在以后有機(jī)會(huì)的話?,?將為各
位介紹?......
sysinit?:?在系統(tǒng)起動(dòng)時(shí)?,?這個(gè)?process?會(huì)被執(zhí)行?.?而所有?process
前的?action?中有?boot?及?bootwait?的?process?,?必
須等到這些?action?為?sysinit?的?process?執(zhí)行完之后
它們才能夠執(zhí)行?.
wait?:?在起動(dòng)一個(gè)?process?之后?,?若要再起動(dòng)另一個(gè)?process?,?則
必需等到這個(gè)?process?結(jié)束之后才能繼續(xù)?.
respawn?:?代表這個(gè)?process?即使在結(jié)束之后?,?也會(huì)重新被啟動(dòng)?,
最典型的例子就是?getty?(?在?LINUX?中為?agetty?)?.
看看下面的循環(huán)?:
--?getty?-->;?login?-->;?shell?-->;?logout?--
^?|????????????????????????????????????????|
??|
即使在?getty?結(jié)束之后?,?它也會(huì)重新被啟動(dòng)?.
ctrlaltdel?:?想必有人會(huì)以鍵盤上的?Ctrl?,?Alt?,?及?Del?這三個(gè)
鍵來(lái)達(dá)到使系統(tǒng)?shutdown?的目的?,?現(xiàn)在我們果然在
/etc/inittab?中看到了這一列?:
ca::ctrlaltdel:/sbin/shutdown?-t3?-rf?now
所以說(shuō)?,?當(dāng)我們按下這三個(gè)鍵的時(shí)候?,?init?會(huì)收到
SIGINT?這個(gè)?signal?,?接著就執(zhí)行?shutdown?的動(dòng)作
不過(guò)?,?我們最好不要養(yǎng)成按?Ctrl-Alt-Del?來(lái)使系統(tǒng)
shutdown?的習(xí)慣?,?尤其在單用戶多任務(wù)的操作系統(tǒng)?,?像
OS/2?,?甚至?Windows?95?,?shutdown?幾乎都是標(biāo)準(zhǔn)
的關(guān)機(jī)程序了?,?更何況是多用戶多任務(wù)的?LINUX?,?所以?,
shutdown?這個(gè)指令是一定要熟悉的?.
除了上面的幾個(gè)?action?之外?,?另外還有一些合法的?action?,?但這
些?action?并不需要太注意?,?要用的時(shí)候再利用?man?init?去查詢就
可以了?.
process?:?這一欄中可以是?shell?script?或是可執(zhí)行的程序?.
好了?,?當(dāng)我們了解?/etc/inittab?中每一欄的意義之后?,?要看懂?/etc/inittab
就是一件輕松愉快的工作了?.?在?/etc/inittab?檔中?,?我們可以看到下面這一段
c1:12345:respawn:/sbin/agetty?38400?tty1
c2:12345:respawn:/sbin/agetty?38400?tty2
c3:45:respawn:/sbin/agetty?38400?tty3
c4:45:respawn:/sbin/agetty?38400?tty4
c5:45:respawn:/sbin/agetty?38400?tty5
c6:456:respawn:/sbin/agetty?38400?tty6
簡(jiǎn)單來(lái)說(shuō)?,?系統(tǒng)在起動(dòng)之后會(huì)制造出六個(gè)虛擬的?console?.?我想大家應(yīng)該有試過(guò)
用?Ctrl-Alt?+?F1?-?F6?可在這六個(gè)?console?之間切換?;?若你使用?XWindows?時(shí)
想暫時(shí)回到?console?下時(shí)?,?可用?Ctrl-Alt?+?F1?-?F6?這三個(gè)鍵來(lái)選擇?,?若想
回到?XWindows?下時(shí)?,?只要以?Ctrl-Alt-F7?就可以回到?XWindows?下了?.?基本
上?,?對(duì)於?memory?比較少的人?,?可以不要開那么多的虛擬?console?,?那么就可
以去掉上面的幾列?.?還有?,?在前面我們也提過(guò)?,?可以把預(yù)設(shè)的?runlevel?從?5
改成?6?,?對(duì)於?beginner?來(lái)說(shuō)?,?系統(tǒng)一啟動(dòng)完就直接進(jìn)入?XWindows?也許是一個(gè)
不錯(cuò)的設(shè)定方法?......
介紹完?/etc/inittab?之后?,?我們接著看?rc.M?!?由前面的流程當(dāng)中?,?我們看到
rc.M?中又包含了四個(gè)?shell?script?,?其中?rc.inet1?及?rc.inet2?是有關(guān)于網(wǎng)絡(luò)
的設(shè)定?;?rc.font?是作字體的設(shè)定?,?而?rc.local?中可以放一些想要起動(dòng)的
daemon?.
我們現(xiàn)在就來(lái)看看?rc.M?,?依照往例?,?前面有兩個(gè)?"#"?的為加上去的注釋?.
只有一個(gè)?"#"?的為原來(lái)的注釋?:
#!/bin/sh
#
#?rc.M?This?file?is?executed?by?init(8)?when?the?system?is?being
#?initialized?for?one?of?the?"multi?user"?run?levels?(i.e.
#?levels?1?through?6).?It?usually?does?mounting?of?file
#?systems?et?al.
#
#?Version:?@(#)/etc/rc.d/rc.M?2.02?02/26/93
#
#?Author:?Fred?N.?van?Kempen,
#?Heavily?modified?by?Patrick?Volkerding
#
##?顯示進(jìn)入多用戶模式
echo?"Going?multiuser..."
?
##?下面一列的意思是?:?假如你在文字模式的?console?下?,?在15分鐘內(nèi)都沒(méi)有動(dòng)作
##?的話?,?屏幕就會(huì)自動(dòng)暗下來(lái)?,?簡(jiǎn)單的說(shuō)?,?就是?screen?saver?的功能?.
/bin/setterm?-blank?15
?
##?執(zhí)行?crond?這個(gè)?daemon?.?不用說(shuō)?,?crond?在系統(tǒng)中扮演了很重要的角色?,
##?它負(fù)責(zé)每過(guò)一段時(shí)間后?,?就去看看?/var/spool/cron/crontabs?中有那些?file
##?要運(yùn)行?,?這些?file?往往有一個(gè)固定的時(shí)間?,?比如說(shuō)?:?每個(gè)月的?1?號(hào)?,?每
##?天凌晨等?......?我們可以用平常的編輯器編好一個(gè)文件?,?里面的格式如下?:
##
##?分?時(shí)?日?月?星期?命令
##
##?舉例來(lái)說(shuō)?,?59?23?31?12?*?/etc/wall?happy_new_year
##?在每年的?12?月?31?號(hào)晚上?11?點(diǎn)?59?分?會(huì)對(duì)每個(gè)系統(tǒng)上的?user?送出
##?happy_new_year?中的內(nèi)容
##
##?接著我們可以利用?crontab?;?這個(gè)指令來(lái)把此文件放到
##?/var/spool/cron/crontabs中.?我們可以看看?/var/spool/cron/crontab?下
##?有一個(gè)?root?的文件?,?看看里面的內(nèi)容?:
##
##?0,5,10,15,20,25,30,35,40,45,50,55?*?*?*?*?/usr/lib/atrun
##
##?所以各位看到了?,?在前兩期提到的?at?命令是五分鐘才被?run?一次的
##
##?再舉一個(gè)簡(jiǎn)單的例子好了?:?我們先用一般的文本編輯器造出一個(gè)名為?crontest
##?的檔案?,?內(nèi)容如下?:
##
##?5?*?*?*?*?ls?-la?~/?>;>;?~/hehehaha
##
##?接著?,?我們鍵入下面的命令?:?crontab?crontest
##?此時(shí)?,?從內(nèi)容得知?,?每五分鐘?crond?就會(huì)執(zhí)行?ls?-la?,?把你?home?directory
##?的內(nèi)容加入?hehehaha?這個(gè)文件中?.
##
##?當(dāng)然啦?!?這個(gè)例子簡(jiǎn)直是毫無(wú)意義可言?:)?但是?,?大家既然知道了基本原理?,
##?利用?crontab?,?at?這些指令?,?就可以簡(jiǎn)化一些系統(tǒng)管理的動(dòng)作?,?同時(shí)在執(zhí)行
##?一些工作時(shí)?,?也會(huì)比較有彈性?.
/usr/sbin/crond?-l10?>;>;/var/adm/cron?2>;&1
?
##?假如?/etc/HOSTNAME?不能讀取的話?,?就把?darkstar.frop.org?當(dāng)成?HOSTNAME
##?中的內(nèi)容?.?老實(shí)說(shuō)?,?下面這三列去掉也不打緊?......
if?[?!?-r?/etc/HOSTNAME?];?then
echo?"darkstar.frop.org"?>;?/etc/HOSTNAME
fi
?
##?下面從?if?到?fi?夾起來(lái)的部份?,?主要就是在執(zhí)行?rc.inet1?,?rc.inet2?.?這
##?些都是網(wǎng)絡(luò)設(shè)定的工作?,?尤其是?rc.inet2?,?啟動(dòng)了一大堆?daemon?,?這部份
##?要牽扯到的東西太多了?.?像?subnet?與?netmask?等?......?類似這種觀念?,
##?都不是三言兩語(yǔ)就可以玩完的?,?所以就留待以后再說(shuō)?.
if?[?-x?/etc/rc.d/rc.inet1?];
then
/bin/hostname?`cat?/etc/HOSTNAME?|?cut?-f1?-d?.`
/bin/sh?/etc/rc.d/rc.inet1
/bin/sh?/etc/rc.d/rc.inet2
else
/sbin/hostname_notcp?`cat?/etc/HOSTNAME?|?cut?-f1?-d?.`
/usr/sbin/syslogd
/usr/sbin/klogd
/usr/sbin/lpd
fi
?
##?在某些資源獨(dú)占的情況下?,?一些應(yīng)用程序往往會(huì)制造出?lock?文件?.?假如這些
##?lock?文件在重新開機(jī)以后還是存在的話?,?那就很不好了?.?所以?,?下面就是在
##?作這些刪除?lock?文件的動(dòng)作?,?并把一些輸出的信息丟到?/dev/null?去?.
##?在上一期的內(nèi)容中?,?我們就有提到?/dev/null?了?,?也有提到抑制信息輸出的
##?方法?.?現(xiàn)在我們果然看到了一個(gè)實(shí)例?......
/bin/rm?-f?/var/spool/locks/*?/var/spool/uucp/LCK..*?/tmp/.X*lock?1>;?/dev/null?2>;?/dev/null
?
##?假如你有玩?hunt?這個(gè)?game?的話?,?那在?/tmp?下會(huì)有一個(gè)?socket?類型的文件
##?我們要把它刪除之后才能開始另一個(gè)?game?......
if?[?-r?/tmp/hunt?-o?-r?/tmp/hunt.stats?];?then
echo?"Removing?your?stale?hunt?sockets?from?/tmp..."
/bin/rm?-f?/tmp/hunt*
fi
?
##?設(shè)定?share?library?的?link?及?cache?.?這個(gè)指令只有?Superuser?才能使用
##?的?,?它也相當(dāng)?shù)闹匾?.?萬(wàn)一你的?/etc/ld.so.cache?很不幸的?corrupt?了?,
##?那我們也可以利用這個(gè)指令來(lái)讓它重新?link?,?先刪除?/etc/ld.so.cache?,
##?再以?ldconfig?-v?重新制造就可以了?.
/sbin/ldconfig
?
##?起動(dòng)?sendmail?daemon?,?并且讓它?15?分鐘就去看一看?spool?,?處理收發(fā)信件
if?[?-x?/usr/sbin/sendmail?];?then
echo?"Starting?sendmail?daemon?(/usr/sbin/sendmail?-bd?-q?15m)..."
/usr/sbin/sendmail?-bd?-q?15m
fi
?
##?假如?/etc/rc.d/rc.font?是可讀的話?,?就執(zhí)行?rc.font?這個(gè)?shell?script?,
##?而這個(gè)?shell?script?主要是設(shè)定?text?mode?下屏幕的字體
if?[?-r?/etc/rc.d/rc.font?];?then
/etc/rc.d/rc.font
fi
?
##?在系統(tǒng)管理中?,?我們常常把一些?local?的東西另外放在一個(gè)地方?,?這樣才不
##?會(huì)與原來(lái)的東西混淆?.?同時(shí)?,?因?yàn)?local?的東西更新版本的速度總是也比較
##?快?,?在這種情況下?,?常常會(huì)變動(dòng)的東西也可以放在?local?的區(qū)域中?,?這樣
##?管理起來(lái)比較方便?.?也許各位也注意到了?:?為什么會(huì)有?/usr/bin?及
##?/usr/local/bin?之分?.?就個(gè)人認(rèn)為?,?像自己?compile?出來(lái)的東西?,?假如
##?覺(jué)得還不錯(cuò)?,?就可以把它放在?/usr/local/bin?,?因?yàn)樗切略龅?,?所以我
##?把它放在?/usr/local/bin?.?當(dāng)然啦?,?這只是個(gè)人喜好罷了?,?你要放那里
##?都是可以的?,?只要找得到?,?易于使用及管理就好?.
##?同樣的?,?若我們要起動(dòng)一些新增的?daemon?或?shell?script?,?那放在
##?是不錯(cuò)的選擇?.
##?下面一列就是去執(zhí)行?rc.local?中的設(shè)定?,?通常是一些?daemon?或是?shell
##?script
/etc/rc.d/rc.local
?
#?All?done.
?
到這里?,?rc.M?已經(jīng)結(jié)束了?,?我們來(lái)看看從?rc.M?之中執(zhí)行的?rc.font?及
rc.local?......
下面是?rc.font?的內(nèi)容?:
#!/bin/sh
#
#?This?selects?your?default?screen?font?from?among?the?ones?in
#?/usr/lib/kbd/consolefonts.
#
##?我想下面這一列的命令非常明顯了?,?就是設(shè)定?console?中的字體?,?你可以
##?改成自己喜歡的字體?.?或者你也可以利用?fontconfig?這個(gè)指令來(lái)改變?.
setfont?/usr/lib/kbd/consolefonts/default8x16
?
?
看完了?rc.font?后?,?我們來(lái)看看?rc.local?的內(nèi)容?.?我所要說(shuō)的是?:?rc.local
畢竟是自己設(shè)定的區(qū)域?,?所以每個(gè)人的可能都不一樣?,?就我而言?,?因?yàn)槲叶?run
了一些?daemon?,?所以與大家的可能不太相同?.?所以?,?rc.local?作參考就可以了.
下面是我的?rc.local?:
#!?/bin/sh
#?Put?any?local?setup?commands?in?here
#?Running?selection
?
##?lpd?是控制打印機(jī)的?daemon?,?要想在?LINUX?下用打印機(jī)?,?這個(gè)?daemon?必需
##?要被起動(dòng)?,?此外還要修改?/etc/printcap?.?詳細(xì)的情況要去看?PRINT-HOWTO
echo?-n?"lpd"
/etc/lpd
?
##?httpd?就是?WWW?server?的?daemon?.?想必大家都用過(guò)?Mosaic?,?Netscape?等
##?的瀏覽器?.?但假如我們想建立自己的?WWW?server?,?httpd?必須要執(zhí)行?.
echo?-n?"?httpd"
/usr/local/etc/httpd/src/httpd
?
##?在?WWW?的時(shí)代還沒(méi)來(lái)臨以前?,?gopher?可說(shuō)是具有最方便的信息索引功能?,?即使
##?到了現(xiàn)在?,?gopher?仍然占有一席之地?,?在這里?,?因?yàn)槲矣薪⒆约旱?gopher
##?server?,?所以?gopherd?必需被起動(dòng)?.
echo?-n?"?gopherd"
/usr/local/sbin/gopherd?-u?nobody
?
##?下面這個(gè)指令是?mouse?在?console?下做?cut?&?paste
echo?-n?"Running?selection..."
selection?-t?ms?&
echo?'?'
總結(jié)
以上是生活随笔為你收集整理的linux sis启动命令,Linux系统开机过程详细分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中的乘方_python乘方_
- 下一篇: c# 使用谷歌身份验证GoogleAut