1. 程式人生 > >CentOS系統啟動流程

CentOS系統啟動流程

centos系統啟動流程

CentOS系統啟動流程


CentOS的啟動流程總體順序如下(以CentOS 6為例):


POST --> BootSequence(BIOS) --> Bootloader --> kernel [-->ramfs] -->rootfs(ro) --> /sbin/init --> 設定默認運行級別 --> 系統初始化 --> 可以並行執行ctrl+alt+del熱鍵功能定義,系統服務的開啟和關閉,電源管理,dbus管理等 --> 登錄提示符


第一步:POST加電自檢


主要實現的功能是檢測各個外圍硬件設備是否存在而且能夠正常運行起來,實現這一自檢功能的是固化在主板上的ROM(主要代表為CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS會檢測CPU、Memory以及I/O設備是否能夠正常運行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動

去加載ROM芯片上的BIOS程序,是這樣來實現的。而檢測完成之後就進行硬件設備的初始化。


第二步:Boot Sequence(選擇啟動設備以加載MBR)


主要實現的功能是選擇要啟動的硬件設備,選擇了之後就可以讀取這個設備上位於MBR裏頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啟動順序的設定,BIOS自己會依次掃描各個引導設備,然後第一個被掃描到具有引導程序(bootloader)的設備就被作為要啟動的引導設備。


第三步:加載bootloader(MBR)


這一步實現起來的步驟比較多,前面的BIOS通過讀取並執行啟動設備的MBR中的bootloader,而bootloader要實現的功能就是提供一個菜單給用戶,讓用戶去選擇要啟動的系統或不同的內核版本,然後把用戶選擇的內核版本加載至RAM中的特定空間,接著在RAM中解壓、展開,而後把系統控制權移交給內核。


grub是bootloader中的一種,就grub來說,為了打破在MBR中只有446Bytes用於存放bootloader這一限制,所以這一步的實現是這樣的:grub是通過分成三個階段來實現加載內核這一功能的,這三個階段分別是:stage1, stage1.5以及stage2。其中:


stage1:存放於MBR的前446Bytes,用於加載stage1.5階段,目的是為了識別並驅動stage2(或者/boot)所在分區的文件系統;


stage1.5:存放於MBR之後的扇區,加載stage2所在分區的文件系統驅動,讓stage1中的bootloader能識別stage2所在分區的文件系統;


stage2:存放於磁盤分區之上,具體存放於/boot/grub目錄之下,主要用於加載內核文件(vmlinuz-VERSION-RELEASE)以及ramdisk這個臨時根文件系統(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。


概述:假如要啟動的是硬盤設備,首先我們的硬件平臺主板BIOS必須能夠識別硬盤,然後BIOS才能加載硬盤中的bootloader,而bootloader自身加載後就能夠直接識別當前主機上的硬盤設備了;不過,能夠識別硬盤設備不代表能夠識別硬盤設備中的文件系統,因為文件系統是額外附加的一層軟件組織的文件結構,所以要對接一種文件系統,就必須要有對應的能夠識別和理解這種文件系統的驅動,這種驅動就稱為文件系統驅動。而stage1.5就是向grub提供文件系統驅動的,這樣stage1就能訪問stage2及內核所在的分區(/boot)了。


第四步:Kernel自身初始化


Kerenl在得到系統控制權之後,首先要進行自身初始化,而初始化的主要作用是:


(1)探測可識別到的所有硬件設備;

bootloader將系統控制權移交給內核就好比如後朝推翻前朝,統治者(內核)當權之後,首先要檢查一下有哪些是前朝所留下的,例如有哪些領土、人力、財力、兵力可用等等。


(2)加載硬件驅動程序,即加載真正的根文件系統所在設備的驅動程序(有可能會借助於ramdisk加載驅動);

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

如果有借助於ramdisk這個臨時文件系統(虛根),則在這一步之後會執行根切換;否則不執行根切換。

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

到這裏內核空間的啟動流程就結束了,而接下來是用戶空間完成後續的系統啟動流程。


第五步:核心執行init 程序,並獲取默認的運行信息


init可以理解成是內核派來管理用戶空間的使者,就好像天使代表上帝來訪問人間一樣。init這個初始化程序會根據其配置文件執行一系列操作。雖然CentOS 5、CentOS 6以及CentOS 7的init配置 文件各不相同,但總體的啟動流程是不變的。


這一步的流程是:/sbin/init --> 根據init配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 關閉或啟動用戶選定的默認運行級別所對應的服務 --> 啟動終端,打印登錄提示符


對於CentOS 5來說,初始化程序init是SysV init,其配置文件為:/etc/inittab;


對於CentOS 6來說,初始化程序init是upstart,其配置文件為:/etc/inittab, /etc/init/*.conf,也就是upstart將配置文件拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置文件,而/etc/inittab僅用於設置默認運行級別;


對於CentOS 7來說,初始化程序init是systemd,其配置文件為:/usr/lib/system/systemd/*, /etc/systemd/system/*;


運行級別

運行級別是為了系統的運行和維護等目的而設定的一種機制,對於CentOS 5/6來講,一共有7種運行級別,即0-6,它們的意義如下:

0:關機模式,shutdown;

1:單用戶模式(single user):不需要通過認證,登錄進去之後為root用戶身份,是維護模式;

2:多用戶模式(multi user):會啟動網絡功能,但不會啟動NFS,是維護模式;

3:多用戶模式(multi user):為完全功能模式,提供文本界面;

4:預留級別,目前無特別使用目的,但習慣上以同3級別功能來使用;

5:多用戶模式(multi user):為完全功能模式,提供圖形界面;

6:重啟模式,reboot;


第六步:init 程序執行/etc/rc.d/rc.sysinit 文件 


在init執行的第二步執行系統初始化過程。


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

(1) 設置主機名 (讀取/etc/sysconfig/network文件中的HOSTNAME進行)

(2) 設置歡迎信息

(3) 激活udev 和selinux

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

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

只讀模式掛載,最後才改成可讀可寫

(6) 設置系統時鐘

(7) 激活swap 設備

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

(9) 激活lvm 及software raid 設備

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

(11) 清理操作


第七步:啟動核心的外掛模塊


第八步:init 執行運行的各個批處理文件(scripts)

在系統/etc/rc.d/rc.sysinit初始化完成系統之後,此時系統就已經可以正常工作了,只是還缺少啟動時所需要的各項服務,這樣主機才能提供一些我們需要的功能,如網絡服務、dhcp服務等功能這裏通過inittab裏面提到的l3:3:wait:/etc/rc.d/rc 3配置了,而這裏其實是通過/etc/rc.d/rc3.d/下所有鏈接文件來決定如何啟動或關閉服務;所有以S開頭的都被傳遞start參數啟動,所有以K開頭的,都被傳遞stop參數以停止。


  而/etc/rc.d/rc3.d/下的所有鏈接文件都是在/etc/init下面的所有腳本,而這些腳本都必須至少接受四個最基本的參數,{start|stop|status|restart}


第九步:init 執行/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 在指定運行級別腳本後運行

可以根據情況,進行自定義修改


第十步:執行/bin/login 程序,等待用戶登錄


第十一步:登錄之後開始以Shell控制主機


本文出自 “12657170” 博客,請務必保留此出處http://12667170.blog.51cto.com/12657170/1951226

CentOS系統啟動流程