Linux啟動過程探索

2021-04-18 02:31:31 字數 3570 閱讀 8259

參閱cu上的很多關於rc的帖子,於是非常想弄清楚linux/unix到底是如何啟動的?rc指令碼有是如何起作用的?

羅列一篇,方便類我等菜鳥來溫習和查閱,以solaris為例

按下電源,首先是bios取得系統控制權,bios進行最初的引導工作,然後交控制權交給引導分割槽,由引導分割槽載入核心並呼叫start_kernel函式。

核心首先引導核心資料結構的初始化,在start_kernel函式中完成如下工作:

至此start_kernel()結束,基本的核心環境已經建立起來了。

start_kernel最後一項是啟動了init函式,接著由它來完成外設的初始化

這些步驟結束後,init()搜尋檔案系統中的init程式,並建立它,也就是我們通常所說的init程序,它是系統所有程序的起點,程序id=1。

在啟動了的solaris下,利用 "$ps -p 1" 可以檢視該程序,輸出如下:

pid tty time cmd

1 ? 0:01 init

接下來init程序讀取/etc/inittab檔案,來決定下一步如何做。

inittab是以行為單位的描述性(非執行性)文字,每乙個指令行都具有以下格式:

id:runlevel:action:process其中id為入口識別符號,runlevel為執行級別,action為動作代號,process為具體的執行程式。

id一般要求4個字元以內,runlevelinit所處於的執行級別的標識,一般使用0-6以及s或s(s或s表示單使用者模式)。

action欄位則告訴init程序,如何對待process欄位指定的程序:當inittab中各行的runlevel值與當前執行級別匹配時,指定的action才被執行。

但有幾個特殊的action:

initdefault是乙個特殊的action值,用於標識預設的啟動級別;當init由核心啟用以後,它將首先讀取inittab中的initdefault項,取得其中的runlevel,並作為當前的執行級別。

sysinit、boot、bootwait等action將在系統啟動時無條件執行,而忽略其中的runlevel,即不管當前執行級別是什麼,它都執行,並且是優先執行。其餘的action(不含initdefault)都與某個runlevel相關。

我的solaris9中的/etc/inittab如下

ap::sysinit:/sbin/autopush -f /etc/iu.ap #action=sysinit, 該行不管在什麼執行級別下,都執行

ap::sysinit:/sbin/soconfig -f /etc/sock2path #同上

fs::sysinit:/sbin/rcs sysinit >/dev/msglog 2<>/dev/msglog

is:3:initdefault: #該行action=initdefault,表明系統的預設執行級別是3

p3:s1234:powe***il:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/msglog

ss:s:wait:/sbin/rcs >/dev/msglog 2<>/dev/msglog

s0:0:wait:/sbin/rc0 >/dev/msglog 2<>/dev/msglog

s1:1:respawn:/sbin/rc1 >/dev/msglog 2<>/dev/msglog

s2:23:wait:/sbin/rc2 >/dev/msglog 2<>/dev/msglog

s3:3:wait:/sbin/rc3 >/dev/msglog 2<>/dev/msglog

s5:5:wait:/sbin/rc5 >/dev/msglog 2<>/dev/msglog

s6:6:wait:/sbin/rc6 >/dev/msglog 2<>/dev/msglog

fw:0:wait:/sbin/uadmin 2 0 >/dev/msglog 2<>/dev/msglog

of:5:wait:/sbin/uadmin 2 6 >/dev/msglog 2<>/dev/msglog

rb:6:wait:/sbin/uadmin 2 1 >/dev/msglog 2<>/dev/msglog

sc:234:respawn:/usr/lib/saf/sac -t 300 #在2,3,4執行級別下都執行

co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -t sun -d /dev/console -l console -m ldterm,ttcompat

去man inittab吧,什麼都講了 :)

接 著看我的inittab檔案,當action=sysinit的行執行完之後(前三行),將執行runlevel=3的行,即「 s3:3:wait:/sbin/rc3 」。查詢了一下,/sbin/rc3是乙個shell指令碼,用於初始化在執行級別3的系統。因此/etc/inittab中已經定義好了在執行級別x下, 就執行 /sbin/rcx,那/sbin/rcx到底是什麼?

cat一下/sbin/rc3,看看,重要的幾行**如下:

[ $_init_prev_level = 2 -o $_init_prev_level = 4 ] && /

echo 'changing to state 3.' #如果以前執行級別是2或4,則列印資訊「切換到狀態三」

#如果執行級別!=4而且存在/etc/rc3.d這個目錄,則停掉所有以k開始的指令碼中的服務或程式,啟動所有以s開始的指令碼中的服務或程式

if [ $_init_prev_level != 4 -a -d /etc/rc3.d ]; then

for f in /etc/rc3.d/k*; do

if [ -s $f ]; then

case $f in

*.sh) . $f ;;

*) /sbin/sh $f stop ;;

esac

fidone

for f in /etc/rc3.d/s*; do

if [ -s $f ]; then

case $f in

*.sh) . $f ;;

*) /sbin/sh $f start ;;

esac

fidonefi

那就再追蹤到/etc/rc3.d下面去,好累啊 :(

#cd /etc/rc3.d

哦,都是些程式或程序的啟動指令碼,s開頭是啟動指令碼 k開頭是停止指令碼。這正是/sbin/rc3這個shell指令碼中設定的執行方式。

例如:s90samba 代表乙個啟動samba服務的指令碼,90表示啟動順序編號。

k42amserver代表結束服務的指令碼。

rc程式執行完畢後,系統環境已經設定好了,下面就該使用者登入系統了,終於結束了。

最後看張圖,畫的很清楚

Linux啟動過程

1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...

Linux 啟動過程

fae 將porting 好的linux 提供,幾乎都在寫應用 空閒時間整理一下 b1202 系統啟動的過程 通過 boot vm 進行啟動 vmlinuz init 程序會讀取 etc inittab etc inittab 先 etc rc.d rc.sysinit 再 etc rc.d rc3...

Linux啟動過程

1.加電時由硬體將bios載入到記憶體末尾.這時是實模式,定址空間為1m.2.由硬體將cs段暫存器強制設定為0xffff,ip指令暫存器設定為0x0000.這樣cs ip指向了oxffff0的位址位置.這個位置就是bios程式的入口位址.3.執行bios程式.在記憶體起始位址0x00000設定1k大...