天天看點

2Linux系統啟動過程

作者:扒卦小君君

Linux系統的啟動過程大體上可分為五部分:核心的引導;運作init;系統初始化;建立終端 ;使用者登入系統

A 核心引導

當計算機打開電源後,首先是BIOS開機自檢,按照BIOS中設定的啟動裝置(通常是硬碟)來啟動。緊接着由啟動裝置上的grub程式開始引導linux,當引導程式成功完成引導任務後,Linux從它們手中接管了CPU的控制權,然後CPU就開始執行Linux的核心映象代碼,開始了Linux啟動過程。也就是所謂的核心引導開始了,在核心引導過程中其實是很複雜的,我們就當它是一個黑匣子,反正是linux核心做了一些列工作,最後核心調用加載了init程式,至此核心引導的工作就完成了。交給了下一個主角init。

B 運作init

init 程序是系統所有程序的起點,你可以把它比拟成系統所有程序的老祖宗,沒有這個程序,系統中任何程序都不會啟動。init 程式首先是需要讀取配置檔案 /etc/inittab。inittab是一個不可執行的文本檔案,它有若幹行指令所組成。具體内容如下:(你可以在你的linux上執行指令 cat /etc/inittab 這樣獲得)

cat /etc/inittab

2Linux系統啟動過程

C 系統初始化

在init的配置檔案中有這麼一行: si::sysinit:/etc/rc.d/rc.sysinit它調用執行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash shell的腳本,它主要是完成一些系統初始化的工作,rc.sysinit是每一個運作級别都要首先運作的重要腳本。它主要完成的工作有:激活交換分區,檢查磁盤,加載硬體子產品以及其它一些需要優先執行任務。

rc.sysinit約有850多行,但是每個單一的功能還是比較簡單,而且帶有注釋,建議有興趣的使用者可以自行閱讀自己機器上的該檔案,以了解系統初始化所詳細情況。由于此檔案較長,是以不在本文中列出來,也不做具體的介紹。當rc.sysinit程式執行完畢後,将傳回init繼續下一步。通常接下來會執行到/etc/rc.d/rc程式。以運作級别3為例,init将執行配置檔案inittab中的以下這行:

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

這一行表示以5為參數運作/etc/rc.d/rc,/etc/rc.d/rc是一個Shell腳本,它接受5作為參數,去執行/etc/rc.d/rc5.d/目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d/目錄中的這些啟動腳本實際上都是一些連接配接檔案,而不是真正的rc啟動腳本,真正的rc啟動腳本實際上都是放在/etc/rc.d/init.d/目錄下。而這些rc啟動腳本有着類似的用法,它們一般能接受start、stop、restart、status等參數。

/etc/rc.d/rc5.d/中的rc啟動腳本通常是K或S開頭的連接配接檔案,對于以以S開頭的啟動腳本,将以start參數來運作。而如果發現存在相應的腳本也存在K打頭的連接配接,而且已經處于運作态了(以/var/lock/subsys/下的檔案作為标志),則将首先以stop為參數停止這些已經啟動了的守護程序,然後再重新運作。這樣做是為了保證是當init改變運作級别時,所有相關的守護程序都将重新開機。

至于在每個運作級中将運作哪些守護程序,使用者可以通過chkconfig或setup中的"System Services"來自行設定。

cd /etc/rc.d/init.d

初始化目錄,裡面包含下面bash

2Linux系統啟動過程

這裡是幾個開機啟動項的啟動腳本

cd /etc/rc.d/rc5.d

2Linux系統啟動過程

這裡是幾個以K (已經處于啟動狀态) S (可以進行start/stop等操作) 開頭的檔案,指向的是 /etc/rc.d/init.d 目錄的

例如上面的K50netconsole 這個是啟動

可以檢視這個檔案

more /etc/rc.d/init.d/netconsole #!/bin/bash # # netconsole This loads the netconsole module with the configured parameters. # # chkconfig: - 50 50 # description: Initializes network console logging # config: /etc/sysconfig/netconsole # ### BEGIN INIT INFO # Provides: netconsole # Required-Start: $network # Short-Description: Initializes network console logging # Description: Initializes network console logging of kernel messages. ### END INIT INFO # Copyright 2002 Red Hat, Inc. # # Based in part on a shell script by # Andreas Dilger <[email protected]> Sep 26, 2001 PATH=/sbin:/usr/sbin:$PATH RETVAL=0 SERVER_ADDRESS_RESOLUTION= # Check that networking is up. . /etc/sysconfig/network # Source function library. . /etc/rc.d/init.d/functions # Default values LOCALPORT=6666 DEV= SYSLOGADDR= SYSLOGPORT=514 SYSLOGMACADDR= kernel=$(uname -r | cut -d. -f1-2) usage () { echo #34;Usage: $0 {start|stop|status|restart|condrestart}" 1>&2 RETVAL=2 } ...這裡省去下面的代碼

D 建立終端

rc執行完畢後,傳回init。這時基本系統環境已經設定好了,各種守護程序也已經啟動了。init接下來會打開6個終端,以便使用者登入系統。在inittab中的以下6行就是定義了6個終端:

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

從上面可以看出在2、3、4、5的運作級别中都将以respawn方式運作mingetty程式,mingetty程式能打開終端、設定模式。同時它會顯示一個文本登入界面,這個界面就是我們經常看到的登入界面,在這個登入界面中會提示使用者輸入使用者名,而使用者輸入的使用者将作為參數傳給login程式來驗

證使用者的身份。

E 使用者登入系統

對于運作級别為5的圖形方式使用者來說,他們的登入是通過一個圖形化的登入界面。登入成功後可以直接進入KDE、Gnome等視窗管理器。而本文主要講的還是文本方式登入的情況:當我們看到mingetty的登入界面時,我們就可以輸入使用者名和密碼來登入系統了。

Linux的賬号驗證程式是login,login會接收mingetty傳來的使用者名作為使用者名參數。然後login會對使用者名進行分析:如果使用者名不是root,且存在/etc/nologin檔案,login将輸出nologin檔案的内容,然後退出。這通常用來系統維護時防止非root使用者登入。隻有/etc/securetty中登記了的終端才允許root使用者登入,如果不存在這個檔案,則root可以在任何終端上登入。/etc/usertty檔案用于對使用者作出附加通路限制,如果不存在這個檔案,則沒有其他限制。

在分析完使用者名後,login将搜尋/etc/passwd以及/etc/shadow來驗證密碼以及設定賬戶的其它資訊,比如:主目錄是什麼、使用何種shell。如果沒有指定主目錄,将預設為根目錄;如果沒有指定shell,将預設為/bin/bash。

login程式成功後,會向對應的終端在輸出最近一次登入的資訊(在/var/log/lastlog中有記錄),并檢查使用者是否有新郵件(在/usr/spool/mail/的對應使用者名目錄下)。然後開始設定各種環境變量:對于bash來說,系統首先尋找/etc/profile腳本檔案,并執行它;然後如果使用者的主目錄中存在.bash_profile檔案,就執行它,在這些檔案中又可能調用了其它配置檔案,所有的配置檔案執行後後,各種環境變量也設好了,這時會出現大家熟悉的指令行提示符,到此整個啟動過程就結束了。

【圖形模式與文字模式的切換方式】

Linux預設提供了六個指令視窗終端機讓我們來登入。預設我們登入的就是第一個視窗,也就是tty1,這個六個視窗分别為tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 來切換它們。如果你安裝了圖形界面,預設情況下是進入圖形界面的,此時你就可以按Ctrl + Alt + F1 ~ F6來進入其中一個指令視窗界面。當你進入指令視窗界面後再傳回圖形界面隻要按下Ctrl + Alt + F7 就回來了。如果你用的vmware 虛拟機,指令視窗切換的快捷鍵為 Alt + Space + F1~F6. 如果你在圖形界面下請按Alt + Shift + Ctrl + F1~F6 切換至指令視窗。

繼續閱讀