1. 程式人生 > >Linux的啟動流程

Linux的啟動流程

啟動流程

前言:當我們了解了系統的啟動過程,那麽系統啟動出問題時,我們就能知道什麽地方出錯了,就能哪裏出錯修哪裏,不需要重裝系統。

CentOS6和CentOS7啟動流程類似,不過CentOS6和7在啟動後期不一樣,CentOS6後期是init,CentOS7是systemd,那麽細節之處呢,跟著我一塊看看吧!


linux啟動流程(如下圖)


技術分享

上圖大概介紹了過程,現在來讓我詳細介紹一下:

Centos6啟動流程

一、POST加電自檢

按下電源鍵首先要檢測硬件設備是否能正常運行,如:cpu、內存、硬盤等硬件設備。當然POST不是由硬件去檢測(因為硬件也不會啊!),而是依靠一個軟件來完成的,這個軟件就是BIOS(Basic Input Output System)基本輸入輸出系統,它安裝在CMOS芯片上,上電就是給CMOS加電,然後啟動BIOS程序,BIOS會根據CMOS上記錄的硬件信息去讀取硬件並檢測是否能正常運行,之後初始化硬件設備。

二、MBR引導

MBR是存儲在硬盤上的0磁道第一扇區中,其大小為512字節;自檢硬件沒有問題時候,這裏以BIOS為例,BIOS將會直接去找硬盤的第一個扇區,找到前446字節,將MBR加載到內存中,MBR將告訴程序下一階段去哪裏找系統grub引導。此階段屬於grub的第一階段。grub還有1_5階段和2階段。

技術分享

1、stage 1階段

上圖中從地址0000000到000001b0標記的內容便是BootLoader所在的位置,共446字節,即stage1階段,這一階段的任務比較簡單,就是初始化環境,為後面的階段做準備,存放在MBR上。

2、stage1_5階段

由於stage1階段並不加載文件系統的驅動,所以stage1_5的作用主要是加載/boot所在分區文件系統類型的驅動,使系統能夠找到/boot。這些數據最後以*stage1_5這種格式的文件存放在/boot/grub目錄下。

技術分享

3、stage2階段

有了stage1_5階段的引導,系統臨時以/boot為根,此時系統將去找/boot/grub/grub.conf(針對CentOS 7之前的系統,CentOS 7采用的grub2),這個文件在系統的啟動流程中占據這重要的作用;而且在這個文件中定義了系統的內核文件,以及虛擬根文件系統文件。

技術分享

補充:grub.conf文件:使用vim打開grub.conf文件。另外grub也有自己的配置文件:/boot/grub/grub.conf且通常有個符號鏈接文件:/etc/grub.conf

[ [email protected] boot ]#vim grub/grub.conf

default=0

timeout=5

hiddenmenu

title linux

root (hd0,0)

kernel /vmlinuz root=/dev/sda2 init=/sbin/init

initrd /initramfs-2.6.32-696.el6.x86_64.img

default=0:表示默認以哪個內核啟動

timeout=N:表示默認啟動倒計時,如果你不選擇啟動項,倒計時N秒將以默認內核啟動

hiddenmenu:表示顯示菜單,如果你不寫這一項,啟動時將隱藏菜單

root (hd0,0):指定根所在的分區

kernel:指定啟動的內核文件;root所在的分區,以及初始化第一個進程等信息

initrd :指定initramfs文件,即虛擬根文件系統

註意:上述kernel和initrd的順數是不能交換的。如果順序顛倒,系統將不能啟動。

三、加載Kernel(初始化)

/boot目錄下包含vmlinuz,initramfs等內核相關的文件,Boot Loader讀取/boot目錄下所有文件、配置文件與環境參數信息後,會把內核解壓加載到內存中,根據內核提供的功能開始檢測,加載各個設備,此次檢測與BIOS自檢不同,執行到此,後續工作都由內核來完成(因為Boot Loader已把vmlinuz,initramfs加載到內存中),此時的內核還沒有加載磁盤,因為還沒有磁盤驅動程序,內核需要通過/boot目錄下的虛擬文件系統,也就是initramfs,模擬一個rootfs(根文件系統),然後加載啟動過程中所需要的核心模塊,加載後釋放rootfs(根文件系統),然後進行根掛載,在掛載根文件系統時為了避免內核中有bug或操作過程中有bug導致根文件系統被損壞,先只讀掛載根文件系統,加載完成後才讀寫掛載,完成整個掛載根文件系統後,直接去找/sbin/init程序,即開始運行用戶空間的第一個程序。

四、啟動init進程

grub中默認指定init=/sbin/init程序,可以在grub.conf中kernel行自定義執行程序init=/bin/bash,此時可以繞過下面步驟直接進入bash界面。

(1)讀取/etc/inittab文件

inittab文件裏面定義了系統默認運行級別,這一步做了一些工作如下:

a)初始運行級別(RUN LEVEL)

b)系統初始化腳本

c)對應運行級別的腳本目錄

d)定義UPS電源終端/恢復腳本

e)在虛擬控制臺生成getty,以生成終端

f)在運行級別5初始化X

(2)執行/etc/rc.d/rc.sysinit程序

系統初始化一些腳本,主要完成以下工作:

a)設置主機名

b)設置歡迎信息

c)激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以關閉selinux

d)掛載/etc/fstab文件中定義的文件系統

e)檢測根文件系統,並以讀寫方式重新掛載根文件系統

f)設置系統時鐘

g)激活swap設備

h)根據/etc/sysctl.conf文件來設置內核參數

i)激活lvm及software raid設備

j)加載額外設備的驅動程序

k)執行清理操作

註意:正常級別下,最後啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向 了/etc/rc.d/rc.local腳本。

不便或不需寫為服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中,/etc/rc.d/rc.local在指定運行級別腳本後運行。

(3)執行/etc/rc#.d/文件(各種服務)

裏面定義的是各種服務的啟動腳本,可以ls查看,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個運行級別,共7個運行級別,這裏就不多說了。

centos 6中服務命令:chkconfig --lidt rpcbind

註意:run level 的切換:

與run level有關的啟動是在/etc/rc.d/rc.sysinit執行完畢後。run level的不同僅是/etc/rc[0-6].d裏面啟動服務不同而已。

1,要每次啟動都執行某個默認的 run level ,則需修改/etc/inittab 內的設置選項,即是 "id:5:initdefault:裏面的數字

2,如果僅是暫時更改系統的 run level 時,則使用 inint[0-6] 來進行 run level 的更改,但下次重啟時,依舊會是以 /etc/ininttab 的設置為準

當執行 init3 時,系統會:

1),先比較/etc/rc3.d 及 /etc/rc5.d 內的K與S開頭的文件

2),在新的 run level 即是 /etc/rc3.d 內有多的K開頭的文件,則給予關閉

3),在新的 run level 即是 /etc/rc3.d 內有多的S開頭的文件,則給予開啟

(4)執行/etc/rc.d/rc.local文件

這裏面可以自定義開機啟動的命令,是Linux留給用戶進行個性化的地方。

五、執行/bin/login程序

執行/bin/login程序,等待用戶登錄。

CentOS7啟動流程

CentOS7和CentOS6啟動流程差不多,只不過到init程序時候,改為了systemd,因此詳細解釋一下systemd後的啟動流程

1.uefi或BIOS初始化,開始post開機自檢

2.加載MBR到內存

3.GRUB階段

4.加載內核和inintamfs模塊

5.內核開始初始化,使用systemd來代替centos6以前的init程序

(1)執行initrd.target 包括掛載/etc/fstab文件中的系統,此時掛載後,就可以切換到根目錄了

(2)從initramfs根文件系統切換到磁盤根目錄

(3)systemd執行默認target配置

centos7表面是有“運行級別”這個概念,實際上是為了兼容以前的系統,每個所謂的“運行級別”都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式。

模式:

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

2 ==> runlevel2.target, multi-user.target

3 ==> runlevel3.target, multi-user.target

4 ==> runlevel4.target, multi-user.target

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, reboot.target

(4)systemd執行sysinit.target

有沒有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系統及basic.target準備操作系統,所以他們兩個還是有相似之處。

(5)systemd啟動multi-user.target下的本機與服務器服務

(6)systemd執行multi-user.target下的/etc/rc.d/rc.local

6.systemd執行multi-user.target下的getty.target及登錄服務

getty.target我們也眼熟,它是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程序。

7.systemd執行graphical需要的服務

介紹個chkconfig命令:

查看服務在所有級別的啟動或關閉設定情形:

chkconfig [–list] [name]

例:查看所有服務: chkconfig --list

例:更改服務權限: chkconfig --level 3 network off

添加:chkconfig –add name

刪除:chkconfig –del name

修改指定的鏈接類型:chkconfig [–level levels] name

|off|reset>

–level LLLL:指定要設置的級別;省略時表示2345;

結束:結尾了,我再給大家看一張更加詳細的圖,使你們能更清楚的了解啟動流程。


技術分享

Linux的啟動流程