linux啟動流程
linux的啟動流程是運維所必須非常理解的東西,因為它將會是我們在發生服務器開不起機等情況的主要排錯手段,充分理解了liunx的啟動流程能夠助力我們對此類故障的快速定位和處理,
廢話少說,全是干貨,
首先直接將linux啟動的幾個重點步驟給大家列出來方便大家記憶,然后再逐一詳細分析,
liunx啟動流程分為以下幾個步驟
BIOS加電自檢—MBR引導—加載grub界面—加載liunx內核引數及檔案系統—運行init行程—系統初始化—用戶登錄系統
其中前四個步驟都屬于引導內核,
一、BIOS加點自檢詳解
1. BIOS是什么?
它是一組固化到計算機內主板上一個ROM芯片上的程式,它保存著計算機最重要的基本輸入輸出的程式、系統設定資訊、開機后自檢程式和系統自啟動程式, 其主要功能是為計算機提供最底層的、最直接的硬體設定和控制,
相關介紹可以參考另一位博主寫的檔案bios詳細解讀
重點要知道BIOS是主板上的一個rom芯片上的程式,以及他的作用,
2. BIOS在啟動流程中的作用?
上面簡單的提到了BIOS的作用,是最重要的基本輸入輸出的程式、系統設定資訊、開機后自檢程式和系統自啟動程式,主要功能是為計算機提供最底層的、最直接的硬體設定和控制,
當計算機打開電源后,首先是BIOS開機自檢,按照BIOS中設定的啟動設備(通常是硬碟)來啟動,
BIOS 的作業
- 檢測連接硬體檢測的目的是以后把這些設備資訊提供給作業系統,
微機接通電源后,系統將有一個對內部各個設備進行檢查的程序,這是由一個通常稱之為POST(Power On Self Test,上電自檢)的程式來完成的,這也是BIOS的一個功能,完整的POST自檢將包括CPU、640K基本記憶體、1M以上的擴展記憶體、ROM、主板、 CMOS存貯器、串并口、顯示卡、軟硬碟子系統及鍵盤測驗,自檢中若發現問題,系統將給出提示資訊或鳴笛警告, - 尋找啟動磁盤,每一種BIOS都會有開機啟動選單,可以在選單里設定以哪個設備啟動系統,比如:光驅,硬碟,網路等等,這個選單可以設定多個選項,依照設定次序在設備上尋找啟動資訊
在完成POST自檢后,ROM BIOS將按照系統CMOS設定中的啟動順序搜尋軟硬碟驅動器及CDROM、網路服務器等有效的啟動驅動器 ,讀入作業系統引導記錄,然后將系統控制權交給引導記錄,由引導記錄完成系統的啟動,
1)先試著尋找第一個扇區,也就是主引導記錄MBR(Master Boot Record)
2)如果第一個扇區上沒有沒有存在作業系統,再去尋找標記為BOOT的磁區.
不論是MBR還是BOOT磁區,存盤作業系統的空間都只有446位元組;
如果沒有在上面提到的位置找到作業系統的內核,那么BIOS就無法繼續啟動作業.
而我們的內核往往會大于446個位元組,存放在磁盤的其他位置上,既然446裝不下內核,又為了能順利的找到放在其他位置上的內核,人們想出了一個辦法就在446位元組里寫了一個小程式,當BIOS試著啟動作業系統時就會執行這個小程式,然后再由小程式來載入其他位置的內核.這個小程式就是啟動載入器(boot loader) grub
linux的boot loader(上文提到的小程式) 常見的有兩種:lilo grub
因為lilo存在著一個1024柱面的限制,并且更改了磁盤上的啟動資訊檔案后需要重新啟動系統才能同步446位元組的內容,因為lilo的缺陷,已經被grub所取代.現在的絕大多數類linux系統都采用grub做boot loader;
grub則沒有了lilo各種限制,而且方便到能修改系統檔案的啟動內容就可以立刻與446內容同步.
3.BIOS常見問題
1.)無法進入BIOS
一、原因分析
1、用戶在安裝的時候沒有弄清楚自己的主板品牌,把啟動鍵按錯了,
2、開機時記憶體檢測很長時間,
二、解決方案
1、安裝系統之前最主要的是先要弄清楚主板的是什么品牌的,因為不同品牌,進入BIOS界面的啟動鍵不一樣,
2、U盤啟動時,不同品牌的電腦主板BIOS啟動的快捷方法也有很多不同的,(比如華碩主板就是F8)
3、記憶體檢測是電腦啟動的必須程序,
如果在BIOS設定中沒有把“Quick Power On Self Test”項設定成“Enabled”,那么記憶體就會自檢3次,故要將這個選項設定為“Enabled”后按F10保存即可,[3]
bios恢復出廠設定步驟
1、開機不停按Delete鍵(筆記本一般是F2鍵)進入BIOS設定界面,
2、選擇“Exit”選單下面的“Load Setup Defaults”并按回車,選擇“Yes”之后,再次回車,
3、按“F10”鍵,選擇“Yes”之后回車,此時系統會重啟,BIOS主板成功恢復出廠設定,
2.) 開機時BIOS不能設定了怎么辦?
BIOS只有在開機時才能設定故障現象:電腦開機后進入BIOS設定程式,除了可以設定“用戶口令”、“保存修 改退出”和“不保存退出”3項外,其他都不能進入,
解決方法:通常出現這種情況是因為CMOS被破壞了,執行放電處理試試,如果CMOS放電后故障依然存在,還可以嘗試升級BIOS的方法,如果故障還是無法解決,那可能是CMOS存盤器有問題,只要更換一下存盤器就可以了,
3.)BIOS升級后不能用U盤裝系統的解決方法
1、將BIOS恢復為默認狀況:進入BIOS設定界面,在“EXIT”欄目下選擇“Load Setup Defaults”,
2、在“Main”欄目下,找到并修改“F12 Boot Menu”為“Enable”,按F10鍵保存,
3、重新啟動系統,按F12選擇U盤啟動,一般就能正常使用U盤安裝系統了,
4、如果問題仍舊,那可能是由于U盤啟動制作工具的問題了,可嘗試更換一個制作工具試試,
4.)bios密碼設定:
1、首先我們要啟動電腦,接著要按下“Del”的鍵進到BIOS設定的主界面,
2、接著要在BIOS主選單中,有兩樣設定密碼的選項,它們就是“Set Supervisor Password”(設定超級用戶的密碼)和“Set User Password”(設定用戶的密碼),
3、按照需求選中其中的一個,接著要按下回車鍵,就能夠出現Enter Password的對話框,鍵入密碼,要是你是首次進行這項的設定,鍵入口令別超過8個字符,在鍵入的時候,螢屏不能夠顯示鍵入的口令,注意這個密碼是有大小寫的區別的,鍵入好了之后要按下回車鍵,
4、然后就能夠出現Confirm Password的對話框進行密碼的校驗,再一次鍵入一樣的密碼(提醒下:要是兩次鍵入的密碼是不一樣的,那么就要求你重新鍵入),
5、最后要在BIOS主選單中,選中“Advanced BIOS Features”(高級BIOS功能的設定)的項,使用游標鍵選中“Security Option”的項之后,使用鍵盤上的“Page Up或Page Down”的鍵將選項改成System,
BIOS小結
BIOS的主要作用是檢測連接硬體提供給作業系統和尋找啟動(設備)硬碟并找到主引導記錄MBR移交控制權使其完成接下來的加載grub界面以此來找到并加載內核…
這里提到了MBR和grub正是接下來要詳解的步驟
二、MBR與GPT詳解
上文對MBR已經有了簡單的介紹,MBR是主引導記錄,其引導代碼儲存在第一塊磁盤的第一個扇區中,容量為512位元組,它負責磁盤作業系統(DOS)對磁盤進行讀寫時磁區合法性的判別、磁區引導資訊的定位,它由磁盤作業系統(DOS)在對硬碟進行初始化時產生的,BIOS在啟動檢測讀入作業系統引導記錄,然后將系統控制權交給了主引導記錄也就是MBR,
那么MBR詳細來說是什么呢?GPT又是什么呢?
1. MBR與GPT詳解
在Linux中對磁盤磁區有兩個方案,分別就是MBR與GPT,
對于Legacy BIOS+MBR和UEFI BIOS+GPT這倆種技術而言,后者雖然使用人群不大,但是更先進,GPT是一個正逐漸取代MBR的新標準,
1.)MBR磁區
MBR的意思是“主引導記錄”,是IBM公司早年間提出的,它是存在于磁盤驅動器開始部分的一個特殊的啟動扇區,**這個扇區包含了已安裝的作業系統系統資訊,并用一小段代碼來啟動系統,
**如果你安裝了Windows,其啟動資訊就放在這一段代碼中——如果MBR的資訊損壞或誤刪就不能正常啟動Windows,這時候你就需要找一個引導修復軟體工具來修復它就可以了,Linux系統中MBR通常會是GRUB加載器,
2.)GPT磁區
GPT的意思是GUID Partition Table,即“全域唯一標識磁盤磁區表”,它是另外一種更加先進新穎的磁盤組織方式,一種使用UEFI啟動的磁盤組織方式,最開始是為了更好的兼容性,后來因為其更大的支持記憶體(mbr磁區最多支持2T的磁盤,GPT支持2T以上的),更多的兼容而被廣泛使用,特別是蘋果的MAC系統全部使用gpt磁區,gtp不再有磁區的概念,所有CDEF盤都在一段資訊中存盤,可以簡單的理解為更先進但是使用不夠廣泛的技術,因為兼容問題,gpt其實在引導的最開始部分也有一段mbr引導,也叫做“保護引導”,為了防止設備不支持UEFI
3.)MBR磁區方案特點:
1、最多支持四個主磁區,后續為拓展磁區,
2、在Linux上使用擴展磁區和邏輯磁區最多可以創建15個磁區,
3、由于磁區中的資料以32位存盤,使用MBR磁區是最大支持2T空間,
4、fdisk管理工具只能創建MBR磁區
5、MBR有自己啟動代碼,一旦啟動代碼被破壞,系統就沒法啟動,只有通過修復才能啟動系統,
6、在MBR硬碟中,磁區資訊直接存盤于主引導記錄(MBR)中,
4.)GPT磁區方案特點
1、是UEFI標準的一部分,主板必須要支持UEFI標準
2、GPT磁區串列支持最大18EB(1EB=1024PB)
3、GPT磁區表型別的硬碟不受磁區個數的限制,
4、沒有主磁區,擴展磁區和邏輯磁區的概念,所有磁區都能格式化
5、gdisk管理工具可以創建GPT磁區
6、GPT減少了磁區表損壞的風險,GPT在硬碟最后保存了一份磁區表的副本,
7、在GPT硬碟中,磁區表的位置資訊儲存在GPT頭中,
5.)選擇方案
如果你的硬碟超過2T,那么你必須選擇GPT+UEFI,2t以下就無所謂了;
如果你對電腦不太懂,那么我建議你使用MBR,因為大多數電腦默認都是MBR bios啟動,如果你選擇了gpt那么你必須在bios下設定啟動項,對于一個新人來說比較復雜,每家電腦的主板還有不同無疑增加了難度,
如果你比較精通,建議gpt,畢竟gpt代表了未來,可以預見早晚uefi會會替代掉bios,
從系統多方面來說,win7用戶建議mbr簡單易操作,8和10的用戶還是花點力氣學習一下gpt吧畢竟是一種趨勢,蘋果用戶就不用說了,gpt沒得選,
2.MBR在啟動流程中的作用
mbr是主引導記錄的主要作用就是存盤啟動引導程式,啟動引導程式最主要的作用就是加載作業系統的內核,簡單來說就是由MBR加載grub然后找到liunx內核,
- 加載作業系統的內核,這是啟動引導程式最主要的功能,
- 擁有一個可以讓用戶選擇的選單,來選擇到底啟動哪個系統, 大家如果在服務器上安裝過雙 Windows 系統,就應該見過類似的選擇選單,不過這個選擇選單是由 Windows 的啟動引導程式提供的,而不是 GRUB,
- 可以呼叫其他的啟動引導程式,這是多系統啟動的關鍵,(grub) 不過需要注意的是,Windows 的啟動引導程式不能呼叫 Linux 的啟動引導程式,所以我們一般建議先安裝 Windows,后安裝 Linux,是為了將 Linux 的啟動引導程式安裝到 MBR 中,覆寫 Windows 的啟動引導程式,
3. MBR常見問題
1.)MBR扇區故障
MBR引導扇區記錄位于物理硬碟的第一個扇區(512B),該扇區又稱為主引導扇區,除了包含系統引導程式的部分資料以外,還包含了整個硬碟的磁區記錄,主引導扇區發生故障時,將可能無法進入引導選單,或者因無法找到正確的磁區位置而無法加載系統,通過該硬碟引導主機時很可能進入黑屏狀態,
故障原因
病毒、木馬等造成的破壞
不正確的磁區操作、磁盤讀寫誤操作
故障現象
找不到引導程式,啟動中斷
無法加載作業系統,開機后黑屏
解決思路
提前做好備份檔案
以安裝光碟引導進入急救模式
從備份檔案中恢復
MBR小結
MBR是主引導扇區,是物理磁盤的第一個扇區,主要作用就是存盤啟動引導程式,啟動引導程式最主要的作用就是加載作業系統的內核,簡單來說就是由MBR加載grub然后一起引導啟動liunx內核,
三、GRUB詳解
GRUB2 全稱是 GRand Unified BootLoader,Version 2(第二版大一統引導裝載程式),它是目前流行的大部分 Linux 發行版本的主要引導加載程式,GRUB2 是一個用于計算機尋找作業系統內核并加載其到記憶體的智能程式,
? GRUB通過/boot/grub/grub.conf進行配置,而/boot/grub2/grub.cfg配置GRUB2
兩個GRUB的最主要作用都是把內核加載到記憶體運行,基本作業方式也一致,主要階段也保持相同,都可分為三個階段
GRUB有幾個重要的檔案,STAGE1、STAGE1.5、STAGE2
STAGE1: 它只有512位元組,通常放在MBR中,它的作用很簡單,就是在系統啟動時用于裝載STAGE2并將控制權交給它,
STAGE2: GRUB的核心,所有的功能都是由它實作,
STAGE1.5: 介于STAGE1和STAGE2之間,是它們的橋梁,因為STAGE2較大,通常都是放在一個檔案系統當中的,但是STAGE1并不能識別檔案系統格式,
所以才需要STAGE1.5來引導位于某個檔案系統當中的STAGE2,根據檔案系統格式的不同,STAGE1.5也需要相應的檔案,如:e2fs_stage1_5,fat_stage1_5,分別用于識別ext和fat的檔案系統格式,它存放于1-63的柱面之間.
引導順序如下:STAGE1->;STAGE1.5->;STAGE2,
主要的組態檔時 grub.conf
里面選項含義:
title:一個作業系統引動的標頭,可以使多個
root :指明所需檔案存在于哪個磁盤哪個磁區上 (hd0,0)表示第一個硬碟,第一個磁區,可參考/boot/grub/device.map
kernel:內核檔案的名字,并且會有一些加載內核時的引數 or代表以只讀方式加載
initrd:包含一些附加的驅動程式
階段1
? 如上文 POST(上電自檢)階段提到的,在 POST 階段結束時,BIOS 將查找在接入的磁盤中查找引導記錄,其通常位于 MBR(主引導記錄Master Boot Record),它加載它找到的第一個引導記錄中到記憶體中,并開始執行此代碼,引導代碼(及階段 1 代碼)必須非常小,因為它必須連同磁區表放到硬碟的第一個 512 位元組的扇區中, 在傳統的常規 MBR 中,引導代碼實際所占用的空間大小為 446 位元組,這個階段 1 的 446 位元組的檔案通常被叫做引導鏡像(boot.img),其中不包含設備的磁區資訊,磁區是一般單獨添加到引導記錄中,
? ·由于引導記錄必須非常的小,它不可能非常智能,且不能理解檔案系統結構,因此階段 1 的唯一功能就是定位并加載階段 1.5 的代碼,為了完成此任務,階段 1.5 的代碼必須位于引導記錄與設備第一個磁區之間的位置,在加載階段 1.5 代碼進入記憶體后,控制權將由階段 1 轉移到階段 1.5,
階段1.5
? 如上所述,階段 1.5 的代碼必須位于引導記錄與設備第一個磁區之間的位置,該空間由于歷史上的技術原因而空閑,第一個磁區的開始位置在扇區 63 和 MBR(扇區 0)之間遺留下 62 個 512 位元組的扇區(共 31744 位元組),該區域用于存盤階段 1.5 的代碼鏡像 core.img 檔案,該檔案大小為 25389 位元組,故此區域有足夠大小的空間用來存盤 core.img,
? 因為有更大的存盤空間用于階段 1.5,且該空間足夠容納一些通用的檔案系統驅動程式,如標準的 EXT 和其它的 Linux 檔案系統,如 FAT 和 NTFS 等,GRUB2 的 core.img 遠比更老的 GRUB1 階段 1.5 更復雜且更強大,這意味著 GRUB2 的階段 2 能夠放在標準的 EXT 檔案系統內,但是不能放在邏輯卷內,故階段 2 的檔案可以存放于 /boot 檔案系統中,一般在 /boot/grub2 目錄下,
? 注意 /boot 目錄必須放在一個 GRUB 所支持的檔案系統(并不是所有的檔案系統均可),階段 1.5 的功能是開始執行存放階段 2 檔案的 /boot 檔案系統的驅動程式,并加載相關的驅動程式,
階段2
? GRUB 階段 2 所有的檔案都已存放于 /boot/grub2 目錄及其幾個子目錄之下,該階段沒有一個類似于階段 1 與階段 1.5 的鏡像檔案,相應地,該階段主要需要從 /boot/grub2/i386-pc 目錄下加載一些內核運行時模塊,
? GRUB 階段 2 的**主要功能是定位和加載 Linux 內核到記憶體中,并轉移控制權到內核,**內核的相關檔案位于 /boot 目錄下,這些內核檔案可以通過其檔案名進行識別,其檔案名均帶有前綴 vmlinuz,你可以列出 /boot 目錄中的內容來查看作業系統中當前已經安裝的內核,
? GRUB2 跟 GRUB1 類似,支持從 Linux 內核選擇之一引導啟動,Red Hat 包管理器(DNF)支持保留多個內核版本,以防最新版本內核發生問題而無法啟動時,可以恢復老版本的內核,默認情況下,GRUB 提供了一個已安裝內核的預引導選單,其中包括問題診斷選單(recuse)以及恢復選單(如果配置已經設定恢復鏡像),
階段 2 加載選定的內核到記憶體中,并轉移控制權到內核代碼,
grub常見問題
grub常見問題
這個博主寫的問題很全,可以多參考參考
grub的安裝與修復
grub的安裝有兩種方式,分別適應兩鐘不同的情況,
1、 mbr損壞,但是/boot/grub下所有檔案都正常,我們只需要修復mbr,
進入救援模式之后,啟動grub shell
grub> root (hd0,0) //根據個人啟動磁區的不同進行設定,
root(hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup(hd0)
Checking if "/boot/grub/stage1"exists... no
Checking if "/grub/stage1" exists...yes
Checking if "/grub/stage2" exists...yes
Checking if "/grub/e2fs_stage1_5"exists... yes
Running "embed /grub/e2fs_stage1_5(hd0)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0)(hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
2、 替換引導,比如,linux在安裝時就沒有安裝引導,或者以前用的是lilo,而現在想用grub,
使用grub-install命令即可,
grub-install /dev/sda //選定你要安裝bootloader的磁盤或者磁區,
這個命令會自動創建/boot/grub目錄,并自動生成stage1 stage1.5和stage2,然后將stage1寫入mbr,
grub小結
grub作為啟動引導程式,是多系統啟動的關鍵,由MBR加載出來之后去尋找放在磁盤其他位置上的內核檔案,找到后將控制權移交給內核,
四、內核及加載檔案系統
讀入 /boot 目錄下的內核檔案
內核啟動后會向bios查詢電腦的所有硬體資訊,然后自己接手下來管理這些設備,以便提供給linux使用
內核會試著驅動這些設備,這些設備的驅動一部分包含在內核中,叫做靜態驅動,一部分以模塊的方式(動態)存放檔案系統中,由于此時還未掛載任何檔案系統,因此還不能使用檔案系統中的模塊,這里只能驅動在內核中存在的硬體驅動程式的對應設備.想驅動內核中未包含的硬體驅動就需要加載檔案系統.
加載檔案系統
內核會嘗試掛載根檔案系統,根檔案系統至少包含 /etc /bin /sbin /lib /dev 這5大目錄
他們5個缺一不可.都會導致系統無法啟動
根檔案系統掛載是以只讀方式掛載的,因為這時linux還在啟動階段,并不穩定,避免破壞系統資料,
五、運行init進行系統初始化
init是什么?
init是Linux系統操作中不可缺少的程式之一,所謂的init行程,它是一個由內核啟動的用戶級行程,Linux使用了init行程來對組成Linux的服務和應用程式進行初始化,
掛載了根檔案系統后,就會啟動init服務
內核會按 /sbin/init /etc/init /bin/init 順序尋找init程式,
init程式的型別:
SysV: init, CentOS 5之前, 組態檔: /etc/inittab,
Upstart: init,CentOS 6, 組態檔: /etc/inittab, /etc/init/*.conf,
Systemd: systemd, CentOS 7,組態檔: /usr/lib/systemd/system、 /etc/systemd/system,
init 行程是系統所有行程的起點,你可以把它比擬成系統所有行程的老祖宗,沒有這個行程,系統中任何行程都不會啟動,
啟動init的目的就是為了初始化系統環境,啟動了init就證明了內核已經順利啟動,接下來就由init服務來建立linux使用環境
系統初始化
init 程式首先是需要讀取組態檔 /etc/inittab(組態檔),,根據這個檔案的資訊來進行初始化作業.,
運行級別
在 init 加載 /etc/inittab 之后,就會將系統切換到 initdefault 操作所定義的運行級別,
- 運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動
- 運行級別1:單用戶作業狀態,root權限,用于系統維護,禁止遠程登陸
- 運行級別2:多用戶狀態(沒有NFS)
- 運行級別3:完全的多用戶狀態(有NFS),登陸后進入控制臺命令列模式
- 運行級別4:系統未使用,保留
- 運行級別5:X11控制臺,登陸后進入圖形GUI模式
- 運行級別6:系統正常關閉并重啟,默認運行級別不能設為6,否則不能正常啟動
init運行全流程流程
init行程是由內核啟動的第一個也是惟一的一個用戶行程,它是后續所有行程的發起者,比如init行程啟動/bin/sh程式后,才能夠在控制臺上輸入各種命令,
**init執行的基本流程如下:**
(1)決議/etc/inittab:執行sysinit命令指定的行程,以前通常是/etc/init.d/rcS,在新版本的init程式中則通常是/etc/rc.d/rc.sysinit腳本,
(2)執行/etc/rc.d/rc.sysinit:這是由init執行的第一個腳本,此步進行的作業包括配置網路、配置內核引數、掛載root檔案系統、檢查檔案系統、設定系統時鐘、配置機器、開啟交換空間等,
(3)執行/etc/rc.d/rcX.d/[K…][S…]:根據定義的initdefault運行級別,執行對應wait命令指定的程式,這會運行對應目錄下的各個程式,并等待它們運行完,
(4)執行/etc/rc.d/rc.local:Redhat中運行模式2,3,5都把/etc/rc.d/rc.local作為初始化腳本中的最后一個檔案,所以用戶可以自己在這個檔案中添加一些需要在其他初始化作業之后,登陸之前執行的命令,
(5)執行getty程式:為每個聯機終端使用fork()創建一個子行程,并在子行程中運行getty程式,init行程則呼叫wait(),進入等待子行程結束狀態,getty程式設定終端型別、屬性、速度和線路規程等,對于字符界面的運行級別(如級別2和3),它會打開并初始化一個tty埠,顯示提示資訊,通常,若/etc/issue文本檔案存在,則getty會首先顯示其中的文本資訊,然后顯示登錄提示資訊(例如“plinux login:” ),出現字符登錄界面,并等待用戶鍵入用戶名和口令,可以在inittab檔案中配置使用哪一種getty程式(在“id:runlevels:action:process”的process部分指定,并可以傳遞相應的getty引數),如agetty, getty, mgetty, uugetty, mingetty,fbgetty等,getty程式只能由超級用戶執行,
注意如果第1步中的inittab檔案指定的默認運行級別是圖形用戶界面形式(如級別5),則init程式會轉向去執行/etc/X11/prefdm腳本,它會執行/usr/sbin/gdm,啟動圖形登錄界面,GDM管理的不只是X的啟動,還有登錄,注銷,掛起等一系列操作,
啟動登錄界面(圖形或字符界面),并輸入完用戶名后,getty會呼叫login程式,
(6)執行login程式:getty呼叫exec()執行login程式,以核對輸入的用戶名和口令,由于呼叫了exec(而不是fork),login的執行環境會覆寫getty的執行環境,login行程會讀取/etc/passwd,以用戶名和口令,login根據用戶輸入的用戶名,從口令檔案passwd中取得對應用戶的登錄項,然后呼叫getpass()以顯示”password:”提示資訊,讀取用戶鍵入的密碼,然后使用加密演算法對鍵入的密碼進行加密處理,并與口令檔案中該用戶項中pw_passwd欄位作比較,如果用戶幾次鍵入的密碼均無效,則login程式會以出錯碼1退出執行,表示此次登錄程序失敗,此時父行程(行程init)的wait()會回傳該退出行程的pid,因此會根據記錄下來的資訊再次創建一個子行程,并在該子行程中針對該終端設備再次執行getty程式,重復上述程序,
如果用戶鍵入的密碼正確,則login就會把當前作業目錄(Currend Work Directory)修改成口令檔案中指定的起始作業目錄,并把對該終端設備的訪問權限修改成用戶讀/寫和組寫,設定行程的組ID,然后利用所得到的資訊初始化環境變數資訊,例如起始目錄(HOME=)、使用的shell程式(SHELL=)、用戶名(USER=和LOGNAME=)和系統執行程式的默認路徑序列(PATH=),接著顯示/etc/motd檔案(message-of-the-day)中的文本資訊,并檢查并顯示該用戶是否有郵件的資訊,最后login程式改變成登錄用戶的用戶ID,并執行口令檔案中該用戶項中指定的shell程式,如/bin/bash或/bin/csh等,有關login程式的一些執行選項和特殊訪問限制的說明,可參見Linux系統中的在線手冊頁(man -8 login),
(7)執行shell程式或x-windows:如果用戶名和口令正確,login呼叫exec執行shell命令列解釋程式(當然,也可以執行X-windows的圖形界面,如果用戶設定了的話),登錄shell會首先從/etc/profile檔案以及
H
O
M
E
/
.
b
a
s
h
p
r
o
f
i
l
e
文
件
(
或
.
b
a
s
h
r
c
文
件
,
若
存
在
的
話
)
讀
取
命
令
并
執
行
,
因
此
用
戶
可
以
把
每
次
登
錄
時
都
要
執
行
的
命
令
放
在
.
b
a
s
h
p
r
o
f
i
l
e
文
件
中
,
如
果
在
進
入
s
h
e
l
l
時
設
置
了
E
N
V
環
境
變
量
(
或
者
在
.
b
a
s
h
p
r
o
f
i
l
e
文
件
中
設
置
了
該
變
量
)
,
則
s
h
e
l
l
還
會
從
HOME/.bash_profile檔案(或.bashrc檔案,若存在的話)讀取命令并執行,因此用戶可以把每次登錄時都要執行的命令放在.bash_profile檔案中,如果在進入shell時設定了ENV環境變數(或者在.bash_profile檔案中設定了該變數),則shell還會從
HOME/.bashp?rofile文件(或.bashrc文件,若存在的話)讀取命令并執行,因此用戶可以把每次登錄時都要執行的命令放在.bashp?rofile文件中,如果在進入shell時設置了ENV環境變量(或者在.bashp?rofile文件中設置了該變量),則shell還會從ENV指定的檔案中讀去命令并執行,因此我們也可以把每次運行shell都要執行的命令放在ENV變數指定的檔案中,設定ENV環境變數的方法是把下列陳述句放在你起始目錄的.bash_profile檔案中: ENV=$HOME/.anyfilename; export ENV,
運行shell時,原來的getty行程最終被替換成了bash行程,對應的getty,login,bash這三個程式也就具有相同的行程ID,在成功登錄到Linux系統后,你會發現(使用”top”或”ps –ax”命令)自己終端原來的getty行程已經找不到了,因為getty行程執行了login程式,被替換成了login行程,并且最后被替換成你的登錄shell行程,對于圖形用戶界面,login程式最后會被替換成圖形界面行程(如gnome-session程式),
(8)Linux運行時:init行程會負責收取孤兒行程,如果某個行程創建子行程之后,在子行程終止之前終止,則子行程成為孤兒行程,在Linux中所有的行程必須屬于單棵行程樹,所以孤立行程必須被收取,一旦行程成為孤兒,它會立即成為init行程的子行程,這是為了保持行程樹的完整性,
(9)用戶注銷:當某個終端或虛擬控制臺上的用戶注銷之后,該終端上的所有行程都會被終止(killed),包括bash,然后,init行程就會呼叫fork為該終端或虛擬控制臺重新創建一個getty行程,以便能夠讓其他用戶登錄,這是為什么呢?你應該發現,當用戶登錄時,“getty”用的是“exec”而不是“fork”系統呼叫來執行“login”,這樣,“login”在執行的時候會覆寫“getty”的執行環境(同理,用戶注冊成功后,“login”的執行環境也會被shell占用),所以,如果想再次使用同一終端,必須再啟動一個“getty”,對于圖形界面,用戶注銷后會回到圖形登錄界面,
(10)系統關閉:init負責殺死所有其它的行程,卸載所有的檔案系統并停止處理器的作業,以及任何其它被配置成要做的作業,
以Fedora 14桌面系統中為例(它使用新的upstart init程式,不過它兼容sysvinit),/etc/inittab檔案內容如下:
六、liunx啟動流程總結
BIOS加電自檢—MBR引導—加載grub界面—加載liunx內核引數及檔案系統—運行init行程—系統初始化—用戶登錄系統
-
BIOS的主要作用是檢測連接硬體提供給作業系統和尋找啟動(設備)硬碟并找到主引導記錄MBR移交控制權,
-
MBR作為主引導記錄負責加載grub并一起定位和加載 Linux 內核到記憶體中,grub轉移控制權到內核,
-
內核啟動后會向bios查詢電腦的所有硬體資訊,內核會試著驅動這些設備,
-
內核會嘗試掛載根檔案系統,根檔案系統至少包含 /etc /bin /sbin /lib /dev 這5大目錄
-
掛載了根檔案系統后,就會啟動init服務,
-
init 程式首先是需要讀取組態檔 /etc/inittab(組態檔),根據這個檔案的資訊來進行初始化作業.,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345645.html
標籤:其他
上一篇:內網win7滲透(初級)
