linux系統啟動流程(CentOS5/6/7為例)
一個操作系統要完整啟動起來需要哪些步驟呢?今天以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為例)