更重要的是啟動之后依次執行了哪些程序(文件)??
cgweb 回復于:2003-09-03 10:39:34 |
[size=18:f99ca3b6da][color=red:f99ca3b6da][b:f99ca3b6da]Linux開機啟動程序詳解[/b:f99ca3b6da][/color:f99ca3b6da][/size:f99ca3b6da] 由于操作系統正在變得越來越復雜,所以開機引導和關機下電的過程也越來越智能化。從簡單的DOS系統轉移到Windows NT系統,人們已經親身感受到了這些變化——這已不僅僅是核心操作系統的啟動引導和關閉了,還包括必須要同時啟動或者關閉相當數量的服務項目。類似于Windows NT,Linux系統啟動過程需要打開的服務項目也是數量極大的。 這里,我們假設大家已經熟悉其它操作系統的引導過程,了解硬件的自檢引導步驟,就只從Linux操作系統的引導加載程序(對個人電腦而言通常是LILO)開始,介紹Linux開機引導的步驟。 加載內核 LILO啟動之后,如果你選擇了Linux作為準備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC(因為它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。為了實現這個目的,內核是被壓縮了的。這個文件的頭部包含著必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩余部分進行解壓縮。 執行內核 內核在內存中解壓縮之后,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯為模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啟動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這里開始,內核就能夠掛裝根文件系統(這個過程類似于Windows識別并存取C盤的過程)。內核掛裝了根文件系統之后,將啟動并運行一個叫做init的程序。 注意:在這里我們故意略去了Linux內核啟動的許多細節,這些細節只有內核開發人員才感興趣。如果你好奇的話,可以訪問http://www.redhat.com:8080地址處的 “Kernel Hackers Guide”。 init進程 init進程是非內核進程中第一個被啟動運行的,因此它的進程編號PID的值總是1。init讀它的配置文件/etc/inittab,決定需要啟動的運行級別(Runlevel)。從根本上說,運行級別規定了整個系統的行為,每個級別(分別由0到6的整數表示)滿足特定的目的。如果定義了initdefault級別,這個值就直接被選中,否則需要由用戶輸入一個代表運行級別的數值。 輸入代表運行級別的數字之后,init根據/etc/inittab文件中的定義執行一個命令腳本程序。缺省的運行級別取決于安裝階段對登錄程序的選擇:是使用基于文本的,還是使用基于X-Window的登錄程序。 rc命令腳本程序 我們已經知道,當運行級別發生改變時,將由/etc/inittab文件定義需要運行哪一個命令腳本程序。這些命令腳本程序負責啟動或者停止該運行級別特定的各種服務。由于需要管理的服務數量很多,因此需要使用rc命令腳本程序。其中,最主要的一個是/etc/rc.d/rc,它負責為每一個運行級別按照正確的順序調用相應的命令腳本程序。我們可以想象,這樣一個命令腳本程序很容易變得難以控制!為了防止這類事件的發生,需要使用精心設計的方案。 對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法是rcX.d,其中的X就是代表運行級別的數字。比如說,運行級別3的全部命令腳本程序都保存在/etc/rc.d/rc3.d子目錄中。 在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接并不使用命令腳本程序在/etc/rc.d/init.d子目錄中原來的名字。如果命令腳本程序是用來啟動一個服務的,其符號鏈接的名字就以字母S打頭;如果命令腳本程序是用來關閉一個服務的,其符號鏈接的名字就以字母K打頭。 許多情況下,這些命令腳本程序的執行順序都很重要。如果沒有先配置網絡接口,就沒有辦法使用DNS服務解析主機名!為了安排它們的執行順序,在字母S或者K的后面緊跟著一個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會在/etc/rc.d/rc3.d/S55named之前執行(S50inet配置網絡設置,S55named啟動DNS服務器)。 存放在/etc/rc.d/init.d子目錄中的、被符號鏈接上的命令腳本程序是真正的實干家,是它們完成了啟動或者停止各種服務的操作過程。當/etc/rc.d/rc運行通過每個特定的運行級別子目錄的時候,它會根據數字的順序依次調用各個命令腳本程序執行。它先運行以字母K打頭的命令腳本程序,然后再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來說,會傳遞Stop參數;類似地對以字母S打頭的命令腳本程序來說,會傳遞Start參數。 編寫自己的rc命令腳本 在維護Linux系統運轉的日子里,肯定會遇到需要系統管理員對開機或者關機命令腳本進行修改的情況。有兩種方法可以用來實現修改的目的: ● 如果所做的修改只在引導開機的時候起作用,并且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最后一步被執行的。 ● 如果所做的修改比較細致,或者還要求關閉進程使之明確地停止運行,則需要在/etc/rc.d/init.d子目錄中添加一個命令腳本程序。這個命令腳本程序必須可以接受Start和Stop參數并完成相應的操作。 第一種方法,編輯/etc/rc.d/rc.local腳本,當然是兩種方法中比較簡單的。如果想在這個命令腳本程序中添加內容,只需要使用喜歡的編輯器程序打開它,再把打算執行的命令附加到文件的末尾就可以了。這對一兩行的修改來說的確很便利。 如果確實需要使用一個命令腳本程序,這時必須選擇第二個方法。編寫一個rc命令腳本程序的過程并不像想象中那么困難。我們下面就給出一個例子,看看它是怎樣實現的(順便說一句,你可以把我們的例子當作范本,按照自己的需要進行修改和添加)。 假設你打算每隔60分鐘調用一個特殊的程序來彈出一條消息,提醒自己需要從鍵盤前面離開休息一會兒,命令腳本程序將包括下面幾個部分: ● 關于這個命令腳本程序功能的說明(這樣就不會在一年之后忘記它); ● 在試圖運行它之前驗證這個命令腳本程序確實存在; ● 接受start和stop參數并執行要求的動作。 參數給定后,我們就可以編寫命令的腳本程序。這個程序很簡單,大家可以自己編寫一下,我在這里就不給出了。 編寫好新的命令腳本程序之后,再從相關的運行級別子目錄中加上必要的符號鏈接,來控制這個命令腳本程序的啟動或者停止。在我的印象中,只想讓它在運行級別3或者運行級別5中啟動,原因是我認為只有這兩個運行級別才是日常工作的地方。最后,希望這個命令腳本程序在進入運行級別6(重啟動)的時候被關閉。 激活或者禁止服務項目 有的時候會發現,在引導的時候并不需要某個特定的服務被啟動。如果你正在考慮使用Linux替換Windows NT的文件和打印服務器,就更是如此。 我們已經知道,在特定的運行級別子目錄中給符號鏈接改個名稱,就可以讓該服務不被啟動,如把其名稱的第一個字母由S改為K。一旦熟練掌握了命令行和符號鏈接,就會發現這是激活或者禁止服務的最快辦法。 在學習這個改名方法的時候,可能會覺得圖形化的操作界面ksysv比較容易掌握。雖然它原來是設計使用在KDE環境里的,但在Red Hat Linux 7.2下缺省安裝的GNOME環境里也運行得很好。如果想啟動它,只需簡單地打開一個xterm窗口,并輸入ksysv命令就可以了。屏幕上會出現一個窗口,其中列出了能夠修改的全部參數,需要時還包括在線幫助。 警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試著對啟動腳本程序進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法采用重啟動的方法恢復。不要在正常運轉的系統上實驗新的設置,對你準備修改的文件要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不測。 |
colourp 回復于:2003-09-03 10:49:28 |
多謝了.....這個文章真好~~!!! |
cgweb 回復于:2003-09-03 10:54:02 |
別客氣, 以前,前輩也是這樣幫我的. |
itjane 回復于:2003-12-26 16:42:35 |
這是優先級別吧,比哪說如果local和init中同時都有的 |
magyma 回復于:2005-04-01 21:39:52 |
very good! I like!! |
JohnBull 回復于:2005-04-01 21:56:47 |
init會先調用rc.sysinit(初始化主機名、時區、鍵盤、console字體、....) 然后切換運行級,運行級切換的最后運行rc.local。 然后fork出getty(顯示出“Login:”) ... |
寂寞烈火 回復于:2005-04-01 22:17:43 |
[img:e2fe25c754]http://blog.chinaunix.net/resserver.php?blogId=126&resource=1365-boot.jpg[/img:e2fe25c754] |
JohnBull 回復于:2005-04-01 22:59:07 |
[quote:a427dff0ac="寂寞烈火"][/quote:a427dff0ac] 此圖有誤。 應該是 [code:1:a427dff0ac] mingetty ----(exec)-----> login ------(exec)------> shell [/code:1:a427dff0ac] 并沒有login回到mingetty這個過程。 |
wangyih 回復于:2005-04-01 23:07:46 |
應該有login回到mingetty這個過程 |
JohnBull 回復于:2005-04-01 23:25:44 |
[quote:7aa01ed375="wangyih"]應該有login回到mingetty這個過程[/quote:7aa01ed375] 看我的圖! mingetty已經exec成login了,login又exec成shell了。 沒有返回的過程。 不信ps axf看看 |
wangyih 回復于:2005-04-01 23:32:08 |
[quote:6422c30274="JohnBull"] 看我的圖! mingetty已經exec成login了,login又exec成shell了。 沒有返回的過程。 不信ps axf看看[/quote:6422c30274] LOGIN不成功會回到tty |
JohnBull 回復于:2005-04-01 23:36:03 |
[quote:468ce5d543="wangyih"] LOGIN不成功會回到tty[/quote:468ce5d543] 謬誤! 1. 不成功會出來shell嗎? 2. 不成功的話login會exit,然后init會根據inittab的respawn屬性重新再生出另一個getty來。 不信自己ps ax看看前后兩個getty的pid是不是不一樣。 |
wangyih 回復于:2005-04-01 23:57:53 |
[quote:7ee1b58848="JohnBull"] 謬誤! 1. 不成功會出來shell嗎? 2. 不成功的話login會exit,然后init會根據inittab的respawn屬性重新再生出另一個getty來。 不信自己ps ax看看前后兩個getty的pid是不是不一樣。[/quote:7ee1b58848] 我倒是真那不準了。 不過如果login都已經exit了,象您說的mingetty ----(exec)-----> login ------(exec)------> shell ,整個進程(這些連續的exec下來的)都結束了。 整個客戶端與服務器都斷了,就算init再搞出tty來客戶端那還看的到 |
JohnBull 回復于:2005-04-02 00:19:26 |
[quote:2b276c64b5="wangyih"] 不過如果login都已經exit了,象您說的mingetty ----(exec)-----> login ------(exec)------> shell ,整個進程(這些連續的exec下來的)都結束了。 整個客戶端與服務器都斷了,就算init再搞出tty來客戶端那還看的到[/quote:2b276c64b5] 首先,在終端這里不存在客戶機/服務器的概念。終端不過是一個設備而已,open()一下就能用了。 看看inittab [code:1:2b276c64b5] ... 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 ... [/code:1:2b276c64b5] 意思是:“在第2,3,4,5運行級下,再生式保持mingetty進程” 后面的參數tty?就是要打開的虛終端設備。 respawn就是說如果發現退出了就再fork+exec一個新的出來。 |
wangyih 回復于:2005-04-02 00:35:53 |
[quote:cfb20c33ba="JohnBull"]意思是:“在第2,3,4,5運行級下,再生式保持mingetty進程” 后面的參數tty?就是要打開的虛終端設備。 respawn就是說如果發現退出了就再fork+exec一個新的出來。[/quote:cfb20c33ba] 本機登陸只是一種。還有 運行級別為5的圖形方式登陸 單用戶模式,不用inittab文件。 以及遠程登陸 |
JohnBull 回復于:2005-04-02 00:56:44 |
[quote:4c1fc7f243="wangyih"] 本機登陸只是一種。還有 運行級別為5的圖形方式登陸 單用戶模式,不用inittab文件。 以及遠程登陸[/quote:4c1fc7f243] 這是誰教你的?把他拖出去斃了! 想繼續學UNIX/Linux操作系統就聽我的,不想學隨便。 |
wangyih 回復于:2005-04-02 00:59:06 |
[quote:a66345d34e="JohnBull"] 這是誰教你的?把他拖出去斃了! 想繼續學UNIX/Linux操作系統就聽我的,不想學隨便。[/quote:a66345d34e] 無論怎么學都沒必要聽你的 |
JohnBull 回復于:2005-04-02 01:02:32 |
[quote:dd7cacdd53="wangyih"] 無論怎么學都沒必要聽你的[/quote:dd7cacdd53] 你看看這個同學,賭氣就不好了嘛! 不管誰說的,正確的意見還是要聽的! |
wangyih 回復于:2005-04-02 01:04:50 |
[quote:b4c8c193d8="JohnBull"] 你看看這個同學,賭氣就不好了嘛! 不管誰說的,正確的意見還是要聽的![/quote:b4c8c193d8] 那你說客戶機遠程登陸失敗之后那個 login: 怎么出來的 |
JohnBull 回復于:2005-04-02 01:06:57 |
[quote:17445d58c1="wangyih"] 那你說客戶機遠程登陸失敗之后那個 login: 怎么出來的[/quote:17445d58c1] init派生出來的另一個getty進程 |
wangyih 回復于:2005-04-02 01:28:17 |
[quote:3103c844f8="JohnBull"] init派生出來的另一個getty進程[/quote:3103c844f8] 和你沒學出好。 login都exit,init派生出來的另一個getty進程還和客戶端有什么關系 |
JohnBull 回復于:2005-04-02 01:34:36 |
[quote:527115a694="wangyih"] 和你沒學出好。 login都exit,init派生出來的另一個getty進程還和客戶端有什么關系[/quote:527115a694] 跟客戶機扯什么關系? 買一本《UNIX環境高級編程》,看第9章 錢不夠就找你娘要! |
wangyih 回復于:2005-04-02 01:36:55 |
[quote:87efd3ed3b="JohnBull"] 跟客戶機扯什么關系? 買一本《UNIX環境高級編程》,看第9章 錢不夠就找你娘要![/quote:87efd3ed3b] 你娘說過,不給你零花錢的,我知道 |
JohnBull 回復于:2005-04-02 01:41:15 |
[quote:c495aec5c0="wangyih"] 你娘說過,不給你零花錢的,我知道[/quote:c495aec5c0] 又學我!我想不教你都不行了 沒看過不懂就別放炮 :em07: |
wangyih 回復于:2005-04-02 02:17:12 |
你還是沒有說出 login都調用exit,連接都斷了。init派生出來的另一個getty進程還和客戶端有什么關系 客戶端顯示的login:是怎么出來的? 還是睡覺好。這么水平真是浪費我時間 |
wangyih 回復于:2005-04-02 02:49:05 |
看看你奉若神明的unix環境編程是怎么說的 9.2.1 4.3+BSD終端登錄 login 能處理多項工作。因為它得到了用戶名,所以能調用getpwnam 取得相應用戶的口令文件登錄項。然后調用g e t p a ss(3)以顯示提示“ P a s s w o r d:”接著讀用戶鍵入的口令(自然,禁止回送用戶鍵入的口令)。它調用c r y pt(3)將用戶鍵入的口令加密,并與該用戶 口令文件中登錄項的p w _ p a s s w d字段相比較。 如果用戶幾次鍵入的口令都無效,則login 以 參數1調用exit 表示登錄過程失敗。父進程( i n i t)了解到子進程的終止情況后,將再次調 用f o r k,其后又跟隨著執行g e t t y,對此終端重復上述過程 [quote:c774480fb1]就是說幾次失敗以后才login才exit ,然后i n i t再搞一個getty。之前失敗是繼續讓用戶輸入[/quote:c774480fb1] |
ctqucl 回復于:2005-04-02 03:03:45 |
圖形方式出現了登錄框后登錄失敗會返回到命令行方式的 “login:”而不是圖形的登錄框。 可見這個login是重新生成的而不是返回的。 至于網絡鏈接,在前面 rc 時就已經鏈接,我想這才能體現出linux的穩定性及微內核優勢,此時已建立了穩定的連接,終端不過是一個設備而已了,它的崩潰與否不會影響到直接的連接了。 我是這么理解的,請高手多講點吧。 本人水平不行,不要斃了我啊。 |
Vogel 回復于:2005-04-02 04:02:09 |
[quote:fcfc5f3f3e="wangyih"]你還是沒有說出 login都調用exit,連接都斷了。init派生出來的另一個getty進程還和客戶端有什么關系 客戶端顯示的login:是怎么出來的? 還是睡覺好。這么水平真是浪費我時間[/quote:fcfc5f3f3e] 簡直就是豬! :shock: :shock: |
ctqucl 回復于:2005-04-02 08:58:25 |
[quote:9d33d64b99="wangyih"][/quote:9d33d64b99]login 能處理多項工作。因為它得到了用戶名,所以能調用getpwnam 取得相應用戶的口令文件登錄項。然后調用g e t p a ss(3)以顯示提示“ P a s s w o r d:”接著讀用戶鍵入的口令(自然,禁止回送用戶鍵入的口令)。它調用c r y pt(3)將用戶鍵入的口令加密,并與該用戶 口令文件中登錄項的p w _ p a s s w d字段相比較。 如果用戶幾次鍵入的口令都無效,則login 以 參數1調用exit 表示登錄過程失敗。父進程( i n i t)了解到子進程的終止情況后,將再次調 用f o r k,其后又跟隨著執行g e t t y,對此終端重復上述過程 跟我預想的差不多 :shock: |
惠繪洋 回復于:2005-04-02 09:46:20 |
各位好, 很高興在討論這一個問題, 小弟也有這個問題想討論一下. 小弟做了一個很菜的linux小系統, 能啟動到 login 畫面, 我已經在 /etc/passwd 及 /etc/shadow 下把root的password關掉, Shadow-HOWTO都是這樣教的. 這樣root就可以不使用密碼登入系統, 但現在當我輸入"root"後, 系統仍是顯示password,需要我輸入password, 但按Shadow HOWTO方法, 這是不會再顯示password提示而登入系統中,想請教各位在輸入"root"後, 系統會調用那個參數來做user的驗証呢. 以我估計應該我是少了驗証的那部份, 請問這個問題應該如何解決呢, 請指教. [code:1:512f681b9c] /etc/passwd root::0:0:root:/root:/bin/bash /etc/shadow root::11715:0::::: [/code:1:512f681b9c] |
wangyih 回復于:2005-04-02 11:44:35 |
[quote:577877d663="Vogel"] 簡直就是豬! :shock: :shock:[/quote:577877d663] 說你自己嘛? |
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/