1. 程式人生 > >linux系統啟動流程(CentOS5/6/7為例)

linux系統啟動流程(CentOS5/6/7為例)

centos 系統

一個操作系統要完整啟動起來需要哪些步驟呢?今天以CentOS為例探索一下linux的啟動流程;

一、Linux系統的組成--kernel+rootfs(根文件系統)

kernel: 內核,進行進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能等等

rootfs: 根文件系統

1.內核設計流派:

單內核(monolithic kernel): Linux

把所有功能集成於同一個程序

微內核(micro kernel): Windows, Solaris

每種功能使用一個單獨子系統實現

2. Linux內核特點:

支持模塊化: .ko(內核對象)

如:文件系統,硬件驅動,網絡協議等

支持內核模塊的動態裝載和卸載

組成部分:

核心文件:放置在/boot/分區下的vmlinuz-VERSION-release.el[567].X86_64

模塊文件:/lib/modules/VERSION/kernel目錄下

ramdisk:輔助的偽根系統,用於內核不能驅動文件系統時臨時驅動;

5:/boot/initrd-2.6.18-398.el5.img

6/7:

/boot/initramfs-2.16.32-573.el6.x86_64.img

/boot/initramfs-3.10.0-327.el7.x86_64.img

二、啟動流程詳解:

技術分享

第一部分針對的是內核空間的系統初始化:

Step1.POST:Power-On Self Test 加電自檢

那麽誰來執行此次檢測操作--答案是只有cpu可以進行運算當然是由它來進行

由於剛接通電源時,內存是沒有數據的。因此,x86架構的主板上的ROM就可以供應這樣的數據;

主板上的芯片:南橋北橋芯片。就可以把ROM存儲器裏的內容直接映射到內存;從而能夠讓CPU讀取和加載指令和數據;

因此我們可以說,X86架構的CPU可以線性尋址的物理存儲空間:ROM + RAM;

Step2.BootSequence:可以理解為啟動順序;

第一步自檢成功,可以正常運行之後。系統應該去尋找包含操作系統的硬件設備,完成系統啟動;

而BootSequence的作用就是:決定到何種硬件設備上去加載操作系統;是Removable Device?還是 Hard Drive、CD-ROMS?亦或是網絡啟動?

而加載方式是:按照指定的次序查找各個引導設備,第一個被找出具有引導程序的設備即成為本次啟動所用到的設備;

Bootloader:引導加載器,也是一個程序;存在於硬盤的0磁道0扇區共512字節,其中

446B bootloader

64B FAT 分區表

其余2字節 55AA 是結束標記

那麽Bootloader有哪些呢:

在Windows裏是NTLDR,全稱是NT Loader,是系統加載程序;

Linux:

1.LILO(Linux Loader): 早期引導程序,到目前位置也是使用非常廣泛的一種引導程序。但是在我們 計算機裏不常用,因為不支持大硬盤啟動(不超過1024柱面);安卓手機一般用的就是這個;

2.GRUB(GRand Uniform Bootloader): 一般架構在服務器和普通PC上;還可以引導unix甚至是Windows(8之前);


GRUB提供的功能:

1.為用戶提供一個菜單,菜單中列舉的是各個可以啟動的操作系統的內核;

2.可以將用戶選定的內核的核心文件裝載到內存中去,解壓縮並且展開,grub將系統控制權移交給內核;

3.提供一個交互式的命令行接口;

4.提供菜單和內核啟動的安全保障;

Step3.內核自身初始化:

1) 探測能夠識別到的所有的硬件設備

2) 加載硬件的驅動程序;有可能需要用到ramdisk

3) 以只讀的方式掛載根文件系統

4) 運行用戶空間的第一個應用程序 /sbin/init

Step4.init程序的類型

CentOS 5及之前,SysV Init - Classic Init;配置文件:/etc/inittab只有這一個

CentOS 6 :upstart init 配置文件:有/etc/inittab 但幾乎被廢棄!唯一的功能是設置啟動級別,會在後面說到,其余的配置文件都在 /etc/init/*.conf

CentOS 7 : 完全廢棄了inittab文件,但依然存在,只是簡單說明了CentOS 7已經不使用這個文件而是使用全新的Systemd方式;其配置文件/usr/lib/systemd/system/*

/etc/systemd/system/*


第二部分是用戶空間的開啟:

kernel加載了第一個程序Init程序後,轉入後臺,init進程接管進程管理的任務

Step1:設置系統的運行級別--runlevel

表示process的action要在哪個級別下運行,該段中可以定義多個運行級別,

0:表示關機

1:表示單用戶模式,在這個模式中,用戶登錄不需要密碼,默認網卡驅動是不被加載,一些服務不能用2:表示多用戶模式,NFS服務不開啟

3,表示命令行模式

4,這個模式保留未用

5,表示圖形用戶模式

6,表示重啟系統

其中常用的是3和5,0和6慎用,1的單用戶模式是個對系統來說及其危險的模式,所以也只有在像root用戶密碼忘記後使用該模式;


centos 5 –/etc/inittab內容示例:

id:3:initdefault: # 定義默認運行級別

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

l0:0:wait:/etc/rc.d/rc 0 # 對應不同運行級別的啟動腳本

l1:1:wait:/etc/rc.d/rc 1…

l6:6:wait:/etc/rc.d/rc 6

ca::ctrlaltdel:/sbin/shutdown -t3 -r now #定義快捷鍵操作

# 按下快捷鍵3秒後重啟系統

CentOS6中,已經不再定義其他內容,進有默認開機啟動流程,轉用下列腳本來完成原有執行操作

Step2:執行/etc/rc.d/rc.sysinit腳本,實施系統初始化;

/etc/rc.d/rc.sysinit: 在所有運行級別下,init 依賴/rc.sysinit 進行系統初始化

作用:

(1) 設置主機名

(2) 設置歡迎信息

(3) 激活udev和selinux

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

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

(6) 設置系統時鐘

(7) 激活swap設備

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

(9) 激活lvm及software raid設備

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

(11) 清理操作

Step3.rc 腳本--對應/etc/rc.d/rc$runlevel.d/目錄下的所有服務的鏈接--所有以K開頭的服務停掉,S開頭的服務開啟

說明: rc$runlevel.d –> 意味著讀取/etc/rc.d/rc#.d/下腳本

(目錄下全部文件均為軟鏈接,源為init.d下的對應腳本)

K*: K##*: ##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務

S*: S##*: ##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務

Step4.使用mingetty命令調用login程序,為用戶打印登陸提示符;

linux系統啟動流程(CentOS5/6/7為例)