?? linux啟動分析.txt
字號:
對于I386平臺
基本相同。
對于2.4.x版內核
這一部分的啟動過程在2.4.x內核中簡化了不少,缺省的獨立初始化過程只剩下網絡(sock_init())和創建事件管理核心線程,而其他所需要的初始化都使用__initcall()宏包含在do_initcalls()函數中啟動執行。
五.init進程和inittab引導指令
init進程是系統所有進程的起點,內核在完成核內引導以后,即在本線程(進程)空間內加載init程序,它的進程號是1。
init程序需要讀取/etc/inittab文件作為其行為指針,inittab是以行為單位的描述性(非執行性)文本,每一個指令行都具有以下格式:
id:runlevel:action:process其中id為入口標識符,runlevel為運行級別,action為動作代號,process為具體的執行程序。
id一般要求4個字符以內,對于getty或其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。
runlevel是init所處于的運行級別的標識,一般使用0-6以及S或s。0、1、6運行級別被系統保留,0作為shutdown動作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現,實際上,進入單用戶模式時,init直接在控制臺(/dev/console)上運行/sbin/sulogin。
在一般的系統實現中,都使用了2、3、4、5幾個級別,在Redhat系統中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級別也是可以使用的,傳統的Unix系統沒有定義這幾個級別。runlevel可以是并列的多個值,以匹配多個運行級別,對大多數action來說,僅當runlevel與當前運行級別匹配成功才會執行。
initdefault是一個特殊的action值,用于標識缺省的啟動級別;當init由核心激活以后,它將讀取inittab中的initdefault項,取得其中的runlevel,并作為當前的運行級別。如果沒有inittab文件,或者其中沒有initdefault項,init將在控制臺上請求輸入 runlevel。
sysinit、boot、bootwait等action將在系統啟動時無條件運行,而忽略其中的runlevel,其余的action(不含initdefault)都與某個runlevel相關。各個action的定義在inittab的man手冊中有詳細的描述。
在Redhat系統中,一般情況下inittab都會有如下幾項:
id:3:initdefault:
#表示當前缺省運行級別為3--完全多任務模式;
si::sysinit:/etc/rc.d/rc.sysinit
#啟動時自動執行/etc/rc.d/rc.sysinit腳本
l3:3:wait:/etc/rc.d/rc 3
#當運行級別為3時,以3為參數運行/etc/rc.d/rc腳本,init將等待其返回
0:12345:respawn:/sbin/mingetty tty0
#在1-5各個級別上以tty0為參數執行/sbin/mingetty程序,打開tty0終端用于
#用戶登錄,如果進程退出則再次運行mingetty程序
x:5:respawn:/usr/bin/X11/xdm -nodaemon
#在5級別上運行xdm程序,提供xdm圖形方式登錄界面,并在退出時重新執行
六.rc啟動腳本
上一節已經提到init進程將啟動運行rc腳本,這一節將介紹rc腳本具體的工作。
一般情況下,rc啟動腳本都位于/etc/rc.d目錄下,rc.sysinit中最常見的動作就是激活交換分區,檢查磁盤,加載硬件模塊,這些動作無論哪個運行級別都是需要優先執行的。僅當rc.sysinit執行完以后init才會執行其他的boot或bootwait動作。
如果沒有其他boot、bootwait動作,在運行級別3下,/etc/rc.d/rc將會得到執行,命令行參數為3,即執行/etc/rc.d/rc3.d/目錄下的所有文件。rc3.d下的文件都是指向/etc/rc.d/init.d/目錄下各個Shell腳本的符號連接,而這些腳本一般能接受start、stop、restart、status等參數。rc腳本以start參數啟動所有以S開頭的腳本,在此之前,如果相應的腳本也存在K打頭的鏈接,而且已經處于運行態了(以/var/lock/subsys/下的文件作為標志),則將首先啟動K開頭的腳本,以stop作為參數停止這些已經啟動了的服務,然后再重新運行。顯然,這樣做的直接目的就是當init改變運行級別時,所有相關的服務都將重啟,即使是同一個級別。
rc程序執行完畢后,系統環境已經設置好了,下面就該用戶登錄系統了。
七.getty和login
在rc返回后,init將得到控制,并啟動mingetty(見第五節)。mingetty是getty的簡化,不能處理串口操作。getty的功能一般包括:
打開終端線,并設置模式
輸出登錄界面及提示,接受用戶名的輸入
以該用戶名作為login的參數,加載login程序
缺省的登錄提示記錄在/etc/issue文件中,但每次啟動,一般都會由rc.local腳本根據系統環境重新生成。
注:用于遠程登錄的提示信息位于/etc/issue.net中。
login程序在getty的同一個進程空間中運行,接受getty傳來的用戶名參數作為登錄的用戶名。
如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內容,然后退出。這通常用來系統維護時防止非root用戶登錄。
只有/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個文件,則root可以在任何終端上登錄。/etc/usertty文件用于對用戶作出附加訪問限制,如果不存在這個文件,則沒有其他限制。
當用戶登錄通過了這些檢查后,login將搜索/etc/passwd文件(必要時搜索 /etc/shadow文件)用于匹配密碼、設置主目錄和加載shell。如果沒有指定主目錄,將默認為根目錄;如果沒有指定shell,將默認為/bin/sh。在將控制轉交給shell以前, getty將輸出/var/log/lastlog中記錄的上次登錄系統的信息,然后檢查用戶是否有新郵件(/usr/spool/mail/{username})。在設置好shell的uid、gid,以及TERM,PATH 等環境變量以后,進程加載shell,login的任務也就完成了。
八.bash
運行級別3下的用戶login以后,將啟動一個用戶指定的shell,以下以/bin/bash為例繼續我們的啟動過程。
bash是Bourne Shell的GNU擴展,除了繼承了sh的所有特點以外,還增加了很多特性和功能。由login啟動的bash是作為一個登錄shell啟動的,它繼承了getty設置的TERM、PATH等環境變量,其中PATH對于普通用戶為"/bin:/usr/bin:/usr/local/bin",對于root 為"/sbin:/bin:/usr/sbin:/usr/bin"。作為登錄shell,它將首先尋找/etc/profile 腳本文件,并執行它;然后如果存在~/.bash_profile,則執行它,否則執行 ~/.bash_login,如果該文件也不存在,則執行~/.profile文件。然后bash將作為一個交互式shell執行~/.bashrc文件(如果存在的話),很多系統中,~/.bashrc都將啟動 /etc/bashrc作為系統范圍內的配置文件。
當顯示出命令行提示符的時候,整個啟動過程就結束了。此時的系統,運行著內核,運行著幾個核心線程,運行著init進程,運行著一批由rc啟動腳本激活的守護進程(如 inetd等),運行著一個bash作為用戶的命令解釋器。
附:XDM方式登錄
如果缺省運行級別設為5,則系統中不光有1-6個getty監聽著文本終端,還有啟動了一個XDM的圖形登錄窗口。登錄過程和文本方式差不多,也需要提供用戶名和口令,XDM 的配置文件缺省為/usr/X11R6/lib/X11/xdm/xdm-config文件,其中指定了 /usr/X11R6/lib/X11/xdm/xsession作為XDM的會話描述腳本。登錄成功后,XDM將執行這個腳本以運行一個會話管理器,比如gnome-session等。
除了XDM以外,不同的窗口管理系統(如KDE和GNOME)都提供了一個XDM的替代品,如gdm和kdm,這些程序的功能和XDM都差不多。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -