Debian啓動過程簡介

http://www.ringkee.com/note/opensource/debian/ch09s03.html

Debian與其它的Linux發行版一樣,系統啓動主要分三個階段,第一個階段是BIOS啓動階段,第二個階段是kernel啓動階段,第三個階段是init初始化系統階段。當電腦加電啓動時會首先運行主板flash Memory中的程序,主要任務是檢測電腦的基礎組件,如主板、內存和硬盤等。當基礎組件檢測完成後,找到引導設備後,電腦就會進入kernel啓動階段。kernel啓動階段通過MBR中的引導程序(LILO or GRUB)把內核映像裝入內存運行。Kernel啓動階段完成後,就開始啓動系統的第一個進程init,它完成一系統初始化工作,使Linux系統可以正常使用。init進程是Linux系統所有進程的父進程。本節重點介紹init初始化程序。

init程序的配置文件是/etc/inittab 。內容如下:

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:5:initdefault:    #默認的啓動級別爲5

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS    #第一個執行的初始化腳本

# What to do in single-user mode.
~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
#ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

在這個配置文件中,以“#”號開頭的內容是註釋信息。第一個執行的腳本是/etc/init.d/rcS,它會執行/etc /rcS.d目錄下的所有腳本。/etc/rcS.d目錄下的腳本名都以大寫字母“S”和一個順序號開頭,它們在系統初始化時都要被執行。如果某個腳本你不想執行,則改成以大寫字母“K”開頭即可。以”K“開頭的腳本會先被執行,它調用了腳本的stop參數,用來關閉一些進程,接着再執行以”S“開頭的腳本,它調用了腳本的start參數,用以啓動進程。其實/etc/rcS.d目錄下的所有腳本都是符號鏈接,真正執行的腳本存放在/etc/init.d 目錄下。腳本會按從小到大的順序執行,以S40開頭的腳本執行之後,本地文件系統已加載,網絡已啓動,所有的驅動程序完成初始化。S60的腳本執行之後,系統時鐘已設置,NFS文件系統已加載,文件系統已可用。

執行完系統級的初始化腳本後,init程序會繼續執行默認運行級別指定的啓動腳本。如指定的默認運行級別是5則會執行/etc/rc5.d目錄下的腳本,如果是1則會執行/etc/rc1.d目錄下的腳本。/etc/rc5.d目錄下的腳本名的命名格式和rcS.d目錄下的腳本一樣,也是一些以“S”或“K”開頭的符號鏈接。以“S”開頭表示啓動,以“K”開頭的表示禁止。 Debian系統定義了從0到6共7個運行級別。每個級別代表意義如下:

  • Runlevel 0:關機操作,關閉所有程序,如果內核支持APM,還可以自動關閉主機電源。

  • Runlevel 1:單用戶模式,提供一個root shell和只讀的文件系統,該級別用於進行系統恢復。

  • Runlevel 2,3,4,5:多用戶模式,由用戶自由設定。

  • Runlevel 6:與級別0類似,但它不關閉電腦,而是重啓電腦。

update-rc.d命令用以維護不同級別下的啓動腳本,它會自動在rc?.d目錄下創建到/etc/init.d目錄中腳本的鏈接。在運行該命令前,請確保你要添加的啓動腳本已位於/etc/init.d目錄下。下面是一個update-rc.d命令示例:

debian:/etc# update-rc.d foo start 99 2 3 4 5 . stop 01 0 1 6 .
 Adding system startup for /etc/init.d/foo ...
   /etc/rc0.d/K01foo -> ../init.d/foo
   /etc/rc1.d/K01foo -> ../init.d/foo
   /etc/rc6.d/K01foo -> ../init.d/foo
   /etc/rc2.d/S99foo -> ../init.d/foo
   /etc/rc3.d/S99foo -> ../init.d/foo
   /etc/rc4.d/S99foo -> ../init.d/foo
   /etc/rc5.d/S99foo -> ../init.d/foo

/etc/inittab配置文件有專門的指令控制init進程的運行,指令格式如下:

id:runlevels:action:command

id是指令標識,runlevels表示運行級別,action表示執行的時機,command表示執行的命令。如:

l5:5:wait:/etc/init.d/rc 5

其中15是指令標識符,5是運行級別,wait表示進入運行級別時就開始執行”/etc/init.d/rc 5“命令,在執行命令期間,init程序會停下來,直到命令執行完成後init才繼續往下執行。action有很多種,下面分別介紹:

  • respawn,啓動命令並監視命令的執行,當進程退出時,會再次執行該命令。

  • wait,進行指定運行級別時,執行指定的命令,並且init進程會暫停,直到命令執行完成再繼續。

  • once,進行指定運行級別時,執行一次指定命令。

  • boot,命令在系統引導時就被執行,不受運行級別約束。

  • bootwait,同上,但init進程會停下來等命令執行完才繼續往下執行。

  • off,禁用所有運行級別下的某個命令。

  • initdefault,指定在系統引導時進入哪個運行級別。

  • powerwait,在電源不足時需要運行的命令,init進程會暫停,直到指定的命令完成。

  • powerfailnow,同上,但init進程不會暫停。

  • powerokwork,電源恢復正常後需運行的命令,init進程暫停,直到命令執行完成。

  • ctrlaltdel,在捕獲到Ctrl+Alt+Del組合鍵時執行的命令。

  • kbdrequest,把特殊的動作映射到特定的按鍵上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章