一、Linux內核的組成

相關概念:

? ?Linux系統的組成部分:內核+根文件系統

? ?內核:進程管理、內存管理、網絡協議棧、文件系統、驅動程序。

? ?IPC(Inter-Process Communication進程間通信):就是指多個進程之間相互通信,交換信息的方法。Linux IPC基本上都是從Unix平臺上繼承而來的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。

? ?運行中的系統環境可分為兩層:內核空間、用戶空間;

? ? ? 內核空間:內核代碼(系統調用)

? ? ? 用戶空間:應用程序(進程或線程)

? ?內核設計流派:

? ? ? 單內核設計:把所有的功能集成于同一個程序;(Linux)

? ? ? 微內核設計:每種功能都使用一個單獨的子系統實現;(Windows solarls)

? ?Linux內核特點:

? ? ?(1)支持模塊化:.KO(kernel object)

? ? ?(2)支持模塊運動時動態裝載或卸載

? ?組成部分:

? ? ? 核心文件:/boot/Vmliuz-VERSION-release? ? ??

?ramdirk:

? ? CentOS5:/boot/initrd-VERSION-release.img

? ? CentOS6,7:/boot/initramfs-VERSION-release.img


二、CentOS系統啟動流程

總體啟動順序:

POST(加點自檢)-->Boot Sequence(BIOS:基本輸入輸出系統)-->Boot Loader(MBR:主引導記錄)-->Kernel(ramdisk)-->rootfs(根文件系統)-->switchchroot-->/sbin/init/(/etc/inittab /etc/init/*.conf)-->設定運行級別-->系統初始化腳本-->關閉啟動相應服務-->啟動終端?


總流程圖:



wKioL1f7WUOjyOZLAAF4YrmzKcY245.png

各流程細化說明:?

1、POST加電自檢 ?

主要是檢測硬件設別是否能正常的運行,然而實現自檢功能主要是由鑲嵌在主板芯片(CMOS)上的BIOS(basic input output system)程序,檢測沒問題之后進行硬件設備的初始化。 ??


2、Boot Sequence(啟動管理程序):選擇啟動順序加載MBR

Boot Sequence是一個程序,它依賴于某個硬盤硬件,準確的說是第一個硬盤扇區的MBR,從而按次序查找各引導設備。


3、MBR引導,bootloader引導加載器,啟動程序 ??

MBR(Master Boot Record):此記錄在0磁道1扇區,總共為512字節,前446字節為bootloder,后64字節為分區表信息,主分區加上擴展分區不能大于四個,最后2個字節為校驗信息,為55AA。提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核。


4、kernel內核實現 ?

kernel自身初始化,實現功能,借助ramdisk探測可識別的程序,以自讀方式掛載根文件系統,運行應用程序:/sbin/init

? ??

5、/sbin/init/管理用戶空間服務進程 ? ??

設定運行級別,進行初始化腳本,關閉或啟動相應的程序,啟動終端。 ?

? ? ?

GRUB(GRand Unified Bootloader)加載內核,就是MBR中的前 446 個字節,是BooTLoader的一種,它的作用是要選擇要啟動的內核。 ?

GRUB相關說明:?

演示:

………………………………………………………………………………………………………………………

wKiom1fBSmDiNqIKAACmJQfPUoI324.png



主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。

device.map:存放的是內核文件的根分區

menu.lis:為菜單列表,里面為可選擇的菜單列表,存放于stage2中。

stage:用于grub引導程序過大,所以分2段引導,第一段存放在MBR中,第二段存放于內核文件系統中,第一段引導完成后可以找到第二段。 但是,第二段是存放于內核文件系統中的,此時還沒有格式化文件系統,如何可以訪問到第二段的menu.lst,就需要借助于中間層 stage1_5,有它來協助 stage1 段來訪問stage2階段。stage1_5通常位于stage1 字段后的 63 個扇區。 由于stage2 在內存中存放可以使用的文件系統不確定,所以這就是有多個stage1_5 的原因。

Grub Legacy:分三階段

stage1:存放在MBR上

stage1_5:存放在MBR之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;

stage2:磁盤分區(/boot/grub/)

? ?引導加載程序先讀取MBR上的gurb第一階段,由于MBR很小只有512字節采用grub這種方式引導程序,隨后讀取扇區中的stage1.5階段,讀取1.5階段以后從而就能驅動第二階段stage2所在的磁盤分區,stage2是存放在磁盤分區上的還包括了內核文件及ramdisk等都在這個分區上存放的;這就是為什么通過Bootloader之grub就能夠加載內核文件的原因。

? 注意:當前硬件平臺,主板BIOS必須能識別硬盤,然后BIOS才能加載硬盤中的Bootloader,磁盤中的Bootloader自身加載完以后,就能夠識別當前主機上的硬盤設備了。

但硬盤設備能識別,并不代表硬盤上的文件系統能識別,因為文件系統是額外附加的一層軟件組織的文件結構,所以要能夠對接一種文件系統,必須要用到文件系統驅動;對應的應用程序必須能識別和理解這樣的文件系統才可以,這種程序就稱為文件系統驅動;grub的1.5階段就是給gurb提供了文件系統驅動的,從而就能夠訪問對應的第二階段和內核所在的分區了,這通常是一個基本磁盤分區;所以grub第二階段以及內核和ramdisk文件通常都會放在一個基本磁盤分區上;因為grub驅動不了邏輯卷這種高級接口。

?stage2一般是掛載至/boot/grub/目錄下;grub也有自己的配置文件:/boot/grub/grub.conf且通常有個符號鏈接文件:/etc/grub.conf;

?stage2的功用:

?(1)提供菜單或交互式接口;

?(2)能加載用戶選擇的內核或操作系統;

?(3)為菜單通過了保護機制。


/boot/grub/grub.conf配置文件詳解:


[root@centos6?grub]#?ll?/etc/grub.conf?#/etc/grub.conf?/boot/grub/grub.conf為連接文件
lrwxrwxrwx.?1?root?root?22?8月??11?03:29?/etc/grub.conf?->?../boot/grub/grub.conf
[root@centos6?grub]#?cat?/boot/grub/grub.conf
#?grub.conf?generated?by?anaconda
#
#?Note?that?you?do?not?have?to?rerun?grub?after?making?changes?to?this?file
#?NOTICE:??You?have?a?/boot?partition.??This?means?that
#??????????all?kernel?and?initrd?paths?are?relative?to?/boot/,?eg.
#??????????root?(hd0,0)
#??????????kernel?/vmlinuz-version?ro?root=/dev/sda2
#??????????initrd?/initrd-[generic-]version.img
#boot=/dev/sda
default=0?#設定默認啟動菜單項,默認為0開始
timeout=5?#指定菜單等待選擇的時長?
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz?#指定菜單的背景圖片的路徑,為xpm格式,采用gzip壓縮
hiddenmenu?#是否影藏菜單
password?[--md5]?$1$JO0kw$z.qtBMH.KL4A6qZ7dK4N30?#菜單編輯認證
title?CentOS?6?(2.6.32-642.el6.x86_64)?#定義菜單項
root?(hd0,0)?#本次grub查找stage2及其kernel文件所在設備分區,指定grub的根
kernel?/vmlinuz-2.6.32-642.el6.x86_64?ro?root=UUID=240533cf-b37f-4460-974f-702bab867da5?nomodeset?rd_NO_LUKS??KEYBOARDTYPE=pc?KEYTABLE=us?rd_NO_MD?crashkernel=auto?LANG=zh_CN.UTF-8?rd_NO_LVM?rd_NO_DM?rhgb?quiet?#需要啟動的內核?
initrd?/initramfs-2.6.32-642.el6.x86_64.img?#內核匹配的ramfs文件?
password?[--md5]?STRING?#啟動內核選定的內核或操作系統是進行的認證?
[root@centos6?grub]#


進入單用戶模式:?

1)編輯grub菜單,選定要編輯的title,而后使用e命令 ?

2)在選定的kernel后附加1 ,s 或single ?

3)在kernel所在的行,鍵入b鍵 ? ? ?


演示:


啟動時按e鍵:

wKiom1fBU9KhOcy-AAAVA9be50E567.png

上下選擇到kernel后按e編輯輸入1或s、S、single,再次按b鍵重啟

wKiom1fBU-XyJI1IAAAbQFijglU724.png




6、根切換

? 在掛載根文件系統時為了避免內核中有bug或操作過程中有bug導致根文件系統被損壞,先只讀掛載根文件系統,加載完成后才讀寫掛載,完成整個掛載根文件系統后,直接去找/sbin/init程序,即開始運行用戶空間的第一個程序。


用戶空間啟動流程

7、/sbin/init程序

? init程序主要依賴于配置文件:/etc/inittab,大體分為:設定默認啟動級別 --> 設定系統初始化腳本 --> 啟動對應級別的服務 --> 打印各終端登錄界面(如果級別為3處理提供文本登錄界面,如果級別為5還提供圖形登錄界面)


8、設置默認運行級別

? (1)運行級別:為了系統的運行或維護等目的而設定的機制;

? ? 0-6:共7個級別;

? ? ?0:關機,shutdown

? ? ?1:單用戶模式(single user),root用戶,無須認證,維護模式;

? ? ?2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS,維護模式;

? ? ?3:多用戶模式(multi user),完全功能模式,文本界面;

? ? ?4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;

? ? ?5:多用戶模式(multi user),完全功能模式,圖形界面;

? ? ?6:重啟,reboot

圖示:


讀取配置文件:/etc/inittabwKioL1fBV0uS9KXLAABawExF8-I172.png



? (2)配置文件:/etc/inittab定義了很多功能,每一行定義一種操作(action)以及與之對應的process(僅適用于CentOS 5),一行就定義了init要執行的任務,甚至是一堆任務,每一行的語法格式為: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? id:runlevels:action:process

? id為一個任務的標識符;

? runlevels:在哪些運行級別下啟動此任務;例:3,2345,也可為空表示所有級別;

? action:在什么條件下啟動此任務;

? ? wait:等待切換至此任務所在的級別時執行一次(剛剛切換進來時);

? ? respawn:一旦此任務終止時,就自動重啟;(如:登錄終端執行logout登出后會再次啟動)

? ? initdefault:設定默認允許級別;此時process省略為空;

? ? sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;(CentOS 5,6都用到此腳本,CentOS 7是靠systemd完成的),在CentOS 6中僅保留此配置文件中設定啟動運行級別的功能。

? ? process:具體任務;通常為應用程序,或腳本,或二進制的程序,取決于自定義。


演示:

wKiom1fBWlCAjqwZAAAje_ZtNxM265.png



9、系統初始化腳本

系統初始化腳本:/etc/rc.d/rc.sysinit

(1)設置主機名;

(2)設置歡迎信息;

(3)激活udev和selinux;

(4)掛載/etc/fstab文件中定義的所有文件系統;

(5)檢測根文件系統,并以讀寫方式重新掛載根文件系統;(重新掛載是指根文件檢測完之后)

(6)設置系統時鐘;

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

(8)激活lvm即軟raid設備;

(9)激活swap設備;

(10)加載額外設備的驅動程序;(內核加載驅動只加載根文件系統的)

(11)清理操作;

注意:在init配置文件:/etc/inittab中,有一行內容是定義/etc/rc.d/rc.sysinit,此腳本文件是負責完成系統初始化的腳本文件。


10、關閉/啟動對應級別下的服務

? 腳本文件/etc/rc.d/rc作用為當級別切換時啟動或停止服務;此腳本接受傳遞的參數給腳本中$runlevel變量,然后,讀取/etc/rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,這些文件就是為什么開機啟動后,有些服務會自動啟動,有些服務沒有啟動的原因。

K*:要停止的服務,K##*,優先級,數字越小,越優先關閉,依賴的服務先關閉,然后再關閉被依賴的。

S*:要啟動的服務,S##*,優先級,數字越小,越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動。

/etc/rc.d/init.d目錄還有個鏈接目錄為/etc/init.d目錄,這兩目錄下文件相同。


如上訴定義將會啟動3級別下的以S打頭的進程:

圖示:

wKioL1fBWOTzdvdjAABC2YKwDAQ085.png



11、啟動終端(圖形終端)

?操作系統啟動完成


三、系統啟動流程總結。

內核級別:

1.POST做開機啟動時候的硬件檢測功能

2.BootSequence(BIOS)啟動加載主引導分區MBR中的引導加載器程序BootLoader

?? 在LInux現行的BootLoader是三段劃分(打破446字節限制)的GRUB程序,

????第1段寫在BootLoader中

????第1.5段在其后扇區用于文件系統的引導

????第2段在boot/grub中提供內部接口和調用系統內核kernel

3.Kernel識別硬件、加載驅動、只讀掛載根文件系統、同時交付給用戶空間第一個程序/sbin/init

此處特別要注意,系統發行商為了適應多種硬件接口驅動調用,會在第一次安裝系統時候,自動識別硬件接口,并調用唯一驅動程序來生成ramdisk文件,以內存當磁盤做虛根,驅動接口后會切換到真實的根文件系統上

CentOS 5系列是initrd,當磁盤映像文件會造成二次緩存緩沖

CentOS 6/7系列改進為initramfs,以文件系統形式可以不二次占用緩存和緩沖


用戶空間級別

4./sbin/init接管后更具其配置文件來初始化

5.根據/sbin/init中的配置會設置默認運行級別,以及一些在/etc/init.d/設置的開機服務

6./etc/rc.d/rc.sysinit運行系統初始化腳本,完成系統初始化

7.關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務

8.設置登錄終端



本文出自小耳朵綜合總結,如有相識之處可留言小耳朵管理員:)