在我們使用Linux操作系統的時候,只要按下電源鍵,就會出現一些亂七八糟的代碼,過一會就會出現登陸界面,那麼在這期間系統自己都做了什麼?現在就說一下在這這段時間系統做了些什麼。
系統初始化流程: POST-->Bootsequence(BIOS)-->Bootloader(MBR)-->Kernel(ramdisk)-->rootfs(readonly)-->/sbin/init()/sbin/init
第一步:加電自檢(POST·)
系統通電之後,進行硬件自檢,是在電腦CPU的控制下,將RAM芯片中的某個程序映射到ROM地址空間,並完成其中的指令檢查硬件是否健康。例如CPU設備,網卡,聲卡等設備是否完好。當檢查完成後,硬件和基本硬件都沒有問題,則開始啟動BIOS。
第二步:引導啟動 Bootsequence(BIOS)
系統加電自檢過程結束後,系統的控制權就轉交Bootloader。Bootloader存儲於硬盤上,這個時候機器不能獲取外部的存儲或者網絡信息,譬如日期,時間等一些重要的參數都是從CMOS中獲取的。說到了CMOS,那麼什麼是CMOS呢?CMOS全稱是Complementary Metal-Oxide Semiconductor(本意是指互補金屬氧化物半導體存儲囂,是一種大規模應用於集成電路芯片制造的原料)是微機主板上的一塊可讀寫的RAM芯片, 主要用來保存當前系統的硬件配置和操作人員對某些參數的設定。硬盤也必須格式成某種格式的文件系統才能在操作系統下存儲東西,那麼,引導程序想要加載硬盤上的操作系統就必須有支持這個文件系統格式的驅動才行,遺憾的是區區446K的空間並不能做到,因此在MBR隨後的扇區中 會有這個驅動程序,就會去第二段64位字節中去尋找這個驅動,而剩下的兩個字節就是校驗字節,若返回值為55AA,則有效。在Linux中通常在/boot/vmlinuz-版本-發型號,然後內核就被解壓加載到內存中了。
第三步:加載kernel
將內核導入後,系統進入自身初始化的環節,首先會探測可識別的所有硬件設備,然後就要加載硬件驅動程序(可能會借助randisk),接下來會以只讀的方式掛載根文件系統,最後會運行用戶空間的第一個程序(/sbin/init)
init程序在目前centos各發行版的類別又不一樣。
在centos5上:Sysv init
配置文件:/etc/initab
在centos6上:Upstart
配置文件:/etc/initab/etc/init/*.conf
在centos7上:systemd
配置文件:/usr/lib/systemd/system/,/etc/systemd/system
randisk又是什麼呢
其是linux內核的特性之一:使用緩存來加速對磁盤上的文件訪問
centos5:initrd工具程序:mkinitrd
centos6、7:initramfs工程程序:dracut,mkinitrd
第四步:引導加載器(GRUB加載)
對於grub,它包含了文件系統的知識。他能從ext2或ext3文件系統中加載linux內核。一旦bootloader完成啟動加載器階段,並能找到引導程序的位置,第一段啟動加載引導程序到內存中開始第二段。GRUB引導加載器階段通過將本來兩段的bootloader轉換成三個階段的bootloader。
stage1:BIOS加載mbr裡面的GRUB,因為只有446個字節,不能實現太多的功能,所以就要加載滴1.5個階段的文件。
stage1.5:加載識別文件系統的程序,來識別文件系統,不加載就無法識別文件系統,找不到boot,就不能把boot分區設置成LVM。
stage2:開始尋找內核並啟動內核
第四步:加載kernel
geub把內核加載到內存後運行,內核一般都是壓縮的,首先就要解壓。內核加載到內存的時候,文件系統還不能使用,他使用的是Bootloader加載進內存時的initramfs。系統將解壓後的內核放置在內存中,調用函數來啟動一系列的初始化以及各種設備。
第五步:讀取initrd/etc/inittab配置文件
配置文件/etc/inittab
每一行定義一種action以及與之對象的process
id:一個任務的標識符
runlevel:在那些級別啟動此服務
action:在什麼條件下啟動此任務
process:任務
action:
wait:等待切換至此任務所在的級別時執行一次
respawn:一旦此任務終止,就自動重新啟動之
initdefault:設定默認運行級別,此時,process省略
sysinit:設定系統初始化方式,此處一般指定/etc/rc.d/rc.sysinit腳本
K*:要停止的服務:K##,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉被依賴的
S*:要啟動的服務:S##,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務後啟動
chkconfig:管控/etc/init.d/每個服務腳本在各個級別下的啟動或關閉狀態
查看:chkconfig --list name
添加:chkconfig --add name
刪除:chkconfig --del name
修改指定的連接類型:
chkconfig [--level levels] name <on|off|restat>
--level levels:指要控制的級別:默認為2345
在內核加載完後,啟動的第一個進程是/sbin/init,init進程會讀取/etc/initab,這個進程最主要的功能是准備軟件環境,所有的動作都在/etc/initab中配置,執行initab來設定系統的運行默認級別,並用init #來改變系統默認級別。
系統的級別:0--7
0:關機,shutdown
1:單用戶模式。root用戶,無需認證,維護模式
2:多用戶模式:會啟動網絡功能,但不會啟動NFS,維護模式
3:多用戶模式:完全功能模式,文本界面
4:預留級別:目前無特別使用目的,但習慣以三級別使用
5:多用戶模式:完全功能模式,圖形界面
6:重啟:reboot
第六步:啟動系統服務/etc/rc.d/rc/sysinit
執行/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:清理操作
OST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本 --> 關閉或啟動對應級別下的服務 --> 啟動終端
http://xxxxxx/Linuxjc/1134225.html TechArticle