centos系統啟動流程
本篇僅僅講解centos5和6
centos7并不適用
Linux系統的組成部分:內核+根文件系統
內核功能:
-
進程管理
-
內存管理
-
網絡管理
-
驅動程序
-
文件系統
-
安全功能
有以下目錄結構的文件系統可以被識別為根文件系統,但根文件系統本身不存在
rootfs:/bin/ /sbin /etc/ /sys/ /proc/ /lib /dev/ /sys /tmp /boot/...
內核:
Linux內核特點:
支持模塊化:.ko(內核對象) 如:文件系統、硬件驅動、網絡協議等 支持內核模塊的動態裝載和卸載
組成部分:
核心文件:/boot/vmlinuz-VERSION-release ramdisk:輔助的偽根文件系統 centos 5:/boot/initrd-Vsersion-release.img centos 6:/boot/initramfs-Version-release.img 模塊文件:/lib/modules/VSERSION-release
centos6啟動流程
1.加載BIOS的硬件信息,獲取第一個啟動設備。 2.讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息 3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備。 4.核型執行init程序并獲取運行信息。 5.Init執行/etc/rc.d/rc.sysinit文件。 6.Init執行運行的各個批處理文件(scripts). 7.Init執行/etc/rc.d/rc.local. 8.執行/bin/login程序,等待用戶登錄。 9.登錄之后開始以Shell控制主機。
下面我們來分別介紹上述的步驟
1、POST
power-on-self-test,加電自檢,是BIOS功能的一個主要部分,負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、等硬件情況的檢測 ROM:BIOS,,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。 RAM::CMOS互補金屬氧化物半導體,保存各項參數的設定 按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
2、bootloader: 引導加載器,引導程序
windows: ntloader,僅是啟動OS Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核 LILO:LInuxLOader GRUB: GRandUnified Bootloader GRUB 0.X: GRUB Legacy,GRUB2 1st stage:位于MBR中,為了引導2nd stage 1.5 stage:位于mbr之后的扇區,不屬于任何分區,為識別內核文件所在的文件系統提供文件識別擴展 2nd stage:位于boot基本磁盤分區中,GRUB的引導程序
3、kernel階段
自身初始化 探測可識別到的所有硬件設備 加載硬件驅動程序( 有可能會借助于ramdisk加載 ) 以只讀方式掛載根文件系統 運行用戶空間的第一個應用程序:/sbin/init ramdisk: 內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問 ramdisk--> ramfs提高速度 CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs,工具程序:mkinitrd, dracut
4、init程序類型:
centos 5:sysV init 配置文件:/etc/inittab centos 6:upstart 配置文件:/etc/inittab /etc/init/*.conf 運行級別:為了系統的運行或維護等目的而設定的機制 0-6:7個級別 0:關機,shutdown # init 0 1:單用戶模式(signal user),root用戶,無須認證;維護模式 2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式 3:多用戶模式(multi user),完全功能模式;文本界面 4:預留級別:目前無特別適用目的,但習慣以同3級別功能使用 5:多用戶模式(multi user),完全功能模式,圖形界面 6:重啟,reboot 默認級別:3,5 級別切換:# init # 級別查看: # who -r # runlevel init初始化 init讀取其初始化文件:/etc/inittab 初始運行級別(RUN LEVEL) 系統初始化腳本 對應運行級別的腳本目錄 捕獲某個關鍵字順序 定義UPS電源終端/恢復腳本 在虛擬控制臺生成getty 在運行級別5初始化X /etc/inittab文件: 每行定義一種action以及與之對應的process id:runlevels:action:process id:一個任務的標識符 runlevels:在那些級別啟動此任務;#,###,標識所有級別 action:在什么條件下啟動此任務 process:任務 action: wait:等待切換至此任務所在的級別時執行一次; respawn:一旦此任務終止時,就自動重新啟動之 initdefault:設定默認運行級別;此時,process省略 sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本
5、系統初始化腳本:/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)清理操作
6、關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務
l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 ... l6:6:wait:/etc/rc.d/rc 6 意味著去啟動或關閉/etc/rc.d/rc#.d/目錄下的服務腳本所控制的服務 K*:要停止的服務;K##,優先級,數字越小,越是先關閉,依賴的服務先關閉,而后關閉被依賴的 S*:要啟動的服務;S##;優先級;數字越小,越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動 rc腳本:接受一個運行級別數字為參數 腳本框架: for srv in /etc/rc.d/rc#.d/K*; do $srv stop done for srv in /etc/rc.d/rc#.d/S*; do $srv start done /etc/init.d/* (/etc/rc.d/init.d/*)腳本執行方式: # /etc/init.d/SRV_SCRIPT { start | stop restart | status } # service SRV_SCRIPT { start | stop restart | status }
7、/etc/rc.d/rc.local
注意:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本 不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中 /etc/rc.d/rc.local在指定運行級別腳本后運行 可以根據情況,進行自定義修改
8、執行/bin/login程序,等待用戶登錄。
9、登錄
用戶輸入正確的用戶名和密碼后便可以以shell控制主機
下面來進行下簡單的總結:
內核級別的初始化流程:
POST --> bootsequence(BIOS) --> bootloader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> /sbin/init
(用戶空間的啟動流程):/sbin/init(/etc/inittab)
設置默認運行級別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 --> 設置登錄終端 --> [ 啟動圖形終端(如果設定的話) ]
原創文章,作者:sixijie,如若轉載,請注明出處:http://www.www58058.com/45395
總結的好清楚 學習了