Debian Linux的init程式初始化工作原理(轉)
Debian Linux的init程式初始化工作原理(轉)[@more@] init和inittab
=============
Linux下為什麼會要有個init?用過windows 9.x的人應該知道有個批處理檔案autoexec.bat,用過windows NT/2000系統的人應該在控制皮膚中見過system service工具,它們的目的是相同的。只是比較起來windows下的這些東西功能太弱(當然用法也更簡單)。
init是Linux啟動的最後一步,它幫助使用者完成每次啟動系統都必須完成的一些重複性任務,如載入檔案系統、各類網路服務等等程式;它還有一個重要用途,讓使用者自定義系統執行環境,只啟動需要的程式,關閉不用的程式,釋放記憶體和處理器資源,讓系統執行得更快更穩。
init會按任務表執行我們下的命令,這個任務表就是/etc/inittab檔案。我們可以為系統制定多個執行環境以滿足不同任務的需要,在 inittab中稱之為執行等級(runlevel)。例如,計算機要用來完成一種聯網編譯任務(與其它系統共享CPU週期,合作編譯軟體),這樣情況需佔用大量CPU能力和記憶體,所以當計算機用作這種用途時,其他程式的執行要儘可能少。可設定一個執行等級(如:runlevel 4),把其它程式包括X Window全關閉,只啟動聯網編譯程式;其他時段,你的計算機要與Windows系統共享檔案,需要啟動Samba,可以再定義一個執行等級(如: runlevel 2)。
現在當你要進行聯網編譯時可執行init 4,而不用手工去關閉每個暫不需要的程式;要與Windows系統共享檔案可執行init 2。
Debian系統對某些執行等級進行了預先配置(而且是無法修改的)
runlevel 0:它的任務就是關閉所有程式,關機。如果計算機及核心支援APM,系統電源可自動切斷。
runlevel 1:為單使用者模式保留的。在這個執行等級下,除了一個root shell外,沒有其它程式執行。除了root檔案系統以只讀方式安裝外,不安裝其它檔案系統。該執行等級通常在恢復系統時用。
runlevel 6:與runlevel 0非常相似,只是它是重啟系統而不是關閉系統。
runlevel 2、3、4、5:Debian系統對它們沒有具體規定,通常可自由進行定製,它們都屬於多使用者模式。其中runlevel 3是Debian使用的預設執行等級。啟動Debian系統時,用的就是這個執行等級。
下面是inittab檔案的例子
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
id:2:initdefault:
# 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
該檔案有一個基本型別的指令,它們指定命令列,命令列所採取的動作,在何種執行等級下啟用命令。這引起命令列的格式大體如下:
id:runlevels:action:command
id是任意一個名稱(具體是什麼並不重要),runlevels是一個數字串(代表執行等級),action描述何時執行命令,command指定執行的實際命令。拿啟動getty的命令列舉例:
1:2345:respawn:/sbin/getty 38400 tty1
該命令告訴init,它應該在引導後以執行等級2-5執行命令/sbin/getty 38400 tty1。動作標記respawn表示命令在退出時重新執行(當使用者在shell輸入exit的時候)。
從方面的檔案中可以看到,執行等級2和3有六個活動的gettys,而等級4和5只有一個。假設執行等級4下有三個shell執行在虛擬控制檯。你在ID為2和3的命令列的執行等級欄位新增了數字4,也就是說你將
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
替換成
2:234:respawn:/sbin/getty 38400 tty2
3:234:respawn:/sbin/getty 38400 tty3
然後重啟或執行以下命令:
telinit q
對inittab進行修改。telinit q命令指示init重新載入它的配置。參閱telinit(8)。
/etc/inittab的其它行看起來比較複雜,我們先看看還有哪些動作標記:
·respawn:啟動命令並監視命令的執行,當程式退出時,再次執行該命令(通常用於虛擬終端裝置上的登入提示)。 ·wait:進入指定執行等級時,啟動程式。init會停下來,直到執行完成。這個標記用於設定特定等級下軟體的啟動。
·once:進入指定的任一執行等級時,啟動一次程式。
·boot:該命令在系統引導時執行。這種型別的指令忽略執行等級。
·bootwait:該命令在系統引導時執行,init等到它退出後才能繼續做別的事。
·off:禁用所有執行等級下的某個命令。
·initdefault:這種型別的項指定在系統引導時進入哪個執行等級。
·powerwait:這類指令給出在電源不足時需要執行的命令。init直到程式完成後才繼續工作。
·powerfail:與powerwait類似,但init不等待程式完成。
·powerworkwait:電源正常後執行。init暫停,直到程式結束。
·powerfailnow:當便攜機電池或外部UPS電池電量不足時執行。
·ctrlaltdel:指定init在捕獲ctrl+alt+del組合鍵時執行的命令。
·kbdrequest:把特殊動作對映到特定的按鍵。Debian中的是alt+UpArrow。
現在再看上面的檔案是不是清楚了許多?
更強大的sysvinit
================
inittab的主要功能是描述引導及正常操作時,應該在何種執行等級下啟動什麼程式,每個執行等級的具體專案完全可以通常/etc/inittab來定義,但Debian有一個更健壯的方案sysvinit,它被認為是init最強大的應用程式之一。Debian組織inittab的方式是把執行等級的大部分定義從inittab中移出來,移到一個指令碼層次中去。惟一直接從inittab啟動的程式只有getty,它用於虛擬裝置上啟動登入提示符,保留它因為它們要求特殊處理,在inittab之外處理要困難得多。
inittab來啟動所有軟體當然是可能的,但將所有配置寫在同一個檔案既不方便檢視也不方便維護,所以檔案裡會加上這許多行:
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
這些行實際決定了系統在各個執行等級下的行為。它們如何做到的也許並不明顯,但至少我們知道主要意思:首先每行都有個符號ID lx,lx表示runlevel x;其次,每行只在一個執行等級下啟用,該執行等級對應著符號ID中的數字x。命令執行時,init停下來,直到程式結束。最後,每個命令列呼叫一個指令碼 /etc/init.d/rc x,這裡x代表當前執行等級的數字。顯然各執行等級的具體任務在/etc/init.d/rc指令碼中安排。
=============
Linux下為什麼會要有個init?用過windows 9.x的人應該知道有個批處理檔案autoexec.bat,用過windows NT/2000系統的人應該在控制皮膚中見過system service工具,它們的目的是相同的。只是比較起來windows下的這些東西功能太弱(當然用法也更簡單)。
init是Linux啟動的最後一步,它幫助使用者完成每次啟動系統都必須完成的一些重複性任務,如載入檔案系統、各類網路服務等等程式;它還有一個重要用途,讓使用者自定義系統執行環境,只啟動需要的程式,關閉不用的程式,釋放記憶體和處理器資源,讓系統執行得更快更穩。
init會按任務表執行我們下的命令,這個任務表就是/etc/inittab檔案。我們可以為系統制定多個執行環境以滿足不同任務的需要,在 inittab中稱之為執行等級(runlevel)。例如,計算機要用來完成一種聯網編譯任務(與其它系統共享CPU週期,合作編譯軟體),這樣情況需佔用大量CPU能力和記憶體,所以當計算機用作這種用途時,其他程式的執行要儘可能少。可設定一個執行等級(如:runlevel 4),把其它程式包括X Window全關閉,只啟動聯網編譯程式;其他時段,你的計算機要與Windows系統共享檔案,需要啟動Samba,可以再定義一個執行等級(如: runlevel 2)。
現在當你要進行聯網編譯時可執行init 4,而不用手工去關閉每個暫不需要的程式;要與Windows系統共享檔案可執行init 2。
Debian系統對某些執行等級進行了預先配置(而且是無法修改的)
runlevel 0:它的任務就是關閉所有程式,關機。如果計算機及核心支援APM,系統電源可自動切斷。
runlevel 1:為單使用者模式保留的。在這個執行等級下,除了一個root shell外,沒有其它程式執行。除了root檔案系統以只讀方式安裝外,不安裝其它檔案系統。該執行等級通常在恢復系統時用。
runlevel 6:與runlevel 0非常相似,只是它是重啟系統而不是關閉系統。
runlevel 2、3、4、5:Debian系統對它們沒有具體規定,通常可自由進行定製,它們都屬於多使用者模式。其中runlevel 3是Debian使用的預設執行等級。啟動Debian系統時,用的就是這個執行等級。
下面是inittab檔案的例子
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
id:2:initdefault:
# 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
該檔案有一個基本型別的指令,它們指定命令列,命令列所採取的動作,在何種執行等級下啟用命令。這引起命令列的格式大體如下:
id:runlevels:action:command
id是任意一個名稱(具體是什麼並不重要),runlevels是一個數字串(代表執行等級),action描述何時執行命令,command指定執行的實際命令。拿啟動getty的命令列舉例:
1:2345:respawn:/sbin/getty 38400 tty1
該命令告訴init,它應該在引導後以執行等級2-5執行命令/sbin/getty 38400 tty1。動作標記respawn表示命令在退出時重新執行(當使用者在shell輸入exit的時候)。
從方面的檔案中可以看到,執行等級2和3有六個活動的gettys,而等級4和5只有一個。假設執行等級4下有三個shell執行在虛擬控制檯。你在ID為2和3的命令列的執行等級欄位新增了數字4,也就是說你將
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
替換成
2:234:respawn:/sbin/getty 38400 tty2
3:234:respawn:/sbin/getty 38400 tty3
然後重啟或執行以下命令:
telinit q
對inittab進行修改。telinit q命令指示init重新載入它的配置。參閱telinit(8)。
/etc/inittab的其它行看起來比較複雜,我們先看看還有哪些動作標記:
·respawn:啟動命令並監視命令的執行,當程式退出時,再次執行該命令(通常用於虛擬終端裝置上的登入提示)。 ·wait:進入指定執行等級時,啟動程式。init會停下來,直到執行完成。這個標記用於設定特定等級下軟體的啟動。
·once:進入指定的任一執行等級時,啟動一次程式。
·boot:該命令在系統引導時執行。這種型別的指令忽略執行等級。
·bootwait:該命令在系統引導時執行,init等到它退出後才能繼續做別的事。
·off:禁用所有執行等級下的某個命令。
·initdefault:這種型別的項指定在系統引導時進入哪個執行等級。
·powerwait:這類指令給出在電源不足時需要執行的命令。init直到程式完成後才繼續工作。
·powerfail:與powerwait類似,但init不等待程式完成。
·powerworkwait:電源正常後執行。init暫停,直到程式結束。
·powerfailnow:當便攜機電池或外部UPS電池電量不足時執行。
·ctrlaltdel:指定init在捕獲ctrl+alt+del組合鍵時執行的命令。
·kbdrequest:把特殊動作對映到特定的按鍵。Debian中的是alt+UpArrow。
現在再看上面的檔案是不是清楚了許多?
更強大的sysvinit
================
inittab的主要功能是描述引導及正常操作時,應該在何種執行等級下啟動什麼程式,每個執行等級的具體專案完全可以通常/etc/inittab來定義,但Debian有一個更健壯的方案sysvinit,它被認為是init最強大的應用程式之一。Debian組織inittab的方式是把執行等級的大部分定義從inittab中移出來,移到一個指令碼層次中去。惟一直接從inittab啟動的程式只有getty,它用於虛擬裝置上啟動登入提示符,保留它因為它們要求特殊處理,在inittab之外處理要困難得多。
inittab來啟動所有軟體當然是可能的,但將所有配置寫在同一個檔案既不方便檢視也不方便維護,所以檔案裡會加上這許多行:
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
這些行實際決定了系統在各個執行等級下的行為。它們如何做到的也許並不明顯,但至少我們知道主要意思:首先每行都有個符號ID lx,lx表示runlevel x;其次,每行只在一個執行等級下啟用,該執行等級對應著符號ID中的數字x。命令執行時,init停下來,直到程式結束。最後,每個命令列呼叫一個指令碼 /etc/init.d/rc x,這裡x代表當前執行等級的數字。顯然各執行等級的具體任務在/etc/init.d/rc指令碼中安排。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950382/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux init程式分析Linux
- Linux基礎命令---init程式Linux
- Linux的啟動過程及init程式Linux
- Linux下init程式原始碼分析Linux原始碼
- golang中的init初始化函式Golang函式
- 00 #### `__init__` ,初始化方法
- spring的延遲初始化bean (default-lazy-init 與 lazy-init )SpringBean
- 如何在Ubuntu/Debian Linux編寫C程式UbuntuLinuxC程式
- Django __init__ 方法用於初始化Django
- 以太坊的工作原理 程式篇
- 轉發代理的工作原理是什麼?
- vue 中引用echarts 初始化init undefind問題(Cannot read property ‘init‘ of undefined)VueEchartsUndefined
- Yii2 init 初始化指令碼分析指令碼
- OpenHarmony的init程式、init配置與啟動項配置
- 在Linux中,Keepalived的工作原理是什麼?Linux
- Linux Debian安裝教程Linux
- Linux基礎命令—initLinux
- composer init 初始化專案8個步驟
- 【Android】【init】解析init程式啟動過程Android
- 【linux】Debian10.0配置vsftpdLinuxFTP
- [轉]IRIG-B碼授時工作原理
- python 詳解類class的繼承、__init__初始化、super方法Python繼承
- Mirror 的工作原理
- LiveData的工作原理LiveData
- OAuth的工作原理OAuth
- Feign的工作原理
- Spark的工作原理Spark
- 修改Debian GNU/Linux的預設等寬字型Linux
- Linux Mint Debian Edition正在測試中,採用全新Debian 12核心Linux
- 【轉】交換機開發(一)—— 交換機的工作原理
- Android程式間通訊,AIDL工作原理AndroidAI
- debian 9.4 安裝教程:linux系統debian9.4圖文安裝教程Linux
- 找工作的程式設計師必懂的Linux程式設計師Linux
- kubernetes實踐之三十九:Pod初始化容器之Init ContainerAI
- k8s中初始化容器(init container)的作用及其使用方法K8SAI
- python的__init__幾種方法總結【轉載】Python
- 子程式、孤兒程式,殭屍程式, init程式
- 在Linux中,TCP/IP協議棧的工作原理是什麼?LinuxTCP協議
- Linux中LVM的工作原理是什麼?優缺點有哪些?LinuxLVM