一個操做系統要完整啓動起來須要哪些步驟呢?今天以CentOS爲例探索一下linux的啓動流程;
linux
1、Linux系統的組成--kernel+rootfs(根文件系統)c#
kernel: 內核,進行進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能等等centos
rootfs: 根文件系統安全
1.內核設計流派:服務器
單內核(monolithic kernel): Linux網絡
把全部功能集成於同一個程序架構
微內核(micro kernel): Windows, Solariside
每種功能使用一個單獨子系統實現模塊化
2. Linux內核特色:spa
支持模塊化: .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
2、啓動流程詳解:
第一部分針對的是內核空間的系統初始化:
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程序,爲用戶打印登錄提示符;