1、加電自檢(power on system test POST)
加電,就是按下電源鍵使電腦主機通電,在諸多硬件設備中有一個被稱為CMOS設備在計算機啟動的過程中起到了至關重要的作用,CMOS在加電之后會啟動保存在它上面的BIOS程序,即基本輸入輸出系統(Basic Input Output System)。自檢,主要是檢測各個硬件設備是否能夠正常運行,如CPU,硬盤,內存等等。自檢功能的實現是由BIOS控制的,BIOS程序會根據CMOS上面記錄的配置信息去讀取其他硬件設備信息并檢測其是否存在并能正常運行,之后進行硬件設備的初始化。 在開機時按ESC鍵或DEL鍵可以進入BIOS程序的設置頁面,在此頁面可以設置CMOS的相關參數。
2、引導加載程序(Boot Loader)的功能
引導加載程序(Boot Loader)是一個統稱,它的主要功能就是去識別、加載操作系統中的核心文件并提交到內存中運行。由于不同的操作系統的文件格式不一樣,因此每種操作系統都有自己引導加載程序。既然 boot loader 是一個程序那么它必須要保存在硬件設備中,此設備一般為硬盤的第一個扇區,也就是我們常說的主引導扇區MBR(Master Boot Record)。
Windows系統的引導加載程序是 ntloader,它只能啟動Windows系統 。 Linux系統的引導加載程序,早期PC機用的的是 LILO(LInux LOader) ,現在 LILO 主要用于安卓系統的啟動引導;現在PC機中一般使用的是 GRUB2。
引導加載程序的主要功能:
a、提供菜單:用戶可以選擇不同的啟動項 b、加載內核文件:直接指向可啟動的程序區段來開啟操作系統 c、轉交其他bootloader:將引導裝載功能轉交個其他loader負責
在學習磁盤管理的時候,我們知道每個磁盤分區都會有一個啟動扇區,操作系統默認會在這個扇區中安裝bootloader程序。Windows系統默認是同時在MBR和每個磁盤分區中安裝 boot loader 的,而Linux系統在安裝時會詢問我們是否將 bootloader 程序安裝到MBR上。因此我們安裝雙系統時要先安裝Windows在安裝Linux。
3、加載系統內核(Kernel)和 ramdisk的功能
我們知道通過bootloader的管理而開始讀取內核文件后,接下來,Linux會將內核解壓縮到內存中,并利用內核的功能開始檢查各個硬件設備,也就是說內核會自己再檢測一次硬件,而不會使用BIOS檢測到硬件信息,此時內核就開始接管BIOS后的工作了。
那么Linux內核文件存放在哪里呢?答案是/boot目錄中,并且以 vmlinuz-VERSION 命名,但是boot目錄是掛載在根(/)目錄下的而此時系統還沒有啟動,根目錄是不存在的,也就是說沒有辦法直接將/boot目錄的內核文件加載到內存中。怎么辦?
此時就要借用虛擬文件系統(InitialRAM DISK)了,簡寫為ramdisk,此文件系統也同樣存放在/boot目錄中,它作用在于啟動正在的根目錄。ramdisk在系統安裝時會根據用戶主機的硬件設備自動生成。ramdisk在不同系統的稱呼不同,centos 5 中 /boot/initrd-VERSION-release.img,centos 6,7 中 /boot/initramfs-VERSION-release.img。
CentOS 5
CentOS 6
bootloader可以加載kernel和ramdisk至內存中,然后讓ramdisk加壓縮為根目錄,kernel就能夠借此加載適當的驅動程序,最終釋放虛擬文件系統,并掛載實際的根目錄文件系統(只讀掛載),然后開始后續的正常啟動流程。
其實,虛擬文件系統是用在當系統啟動時無法掛載根目錄的情況下的,比如你的根目錄在特殊的磁盤接口(USB STAT SCSI)中,或者你的文件系統較為特殊(LVM RAID)。如果你的Linux系統安裝在IDE接口的磁盤上,并且使用 ext2或ext3 文件系統,那么即使沒有ramdisk也可以正常啟動Linux,但是IDE接口的磁盤已經很少使用了。
補充:kernel初始化的功能
探測可識別到的所有硬件設備 加載硬件驅動程序(可能借助于ramdisk 加載驅動) 以只讀方式掛載根文件系統 運行用戶空間的第一個應用程序:/sbin/init
以上是內核空間中的啟動流程。
4、啟動用戶空間的第一個進程/sbin/init
注意:至此以后的內容都是用戶空間內的操作,并且以CentOS 5為例,其實CentOS 6的用戶空間的啟動流程根5的是類似的,只不過它將配置文件分成多個/etc/init/*.conf,/etc/inittab(此文件僅用于定義默認運行級別)。
在內核加載完畢并進行完硬件檢測與驅動程序加載后,此時內核會主動調用第一個進程/sbin/init。init程序的主要功能是:準備程序的運行環境,包括系統的主機名、網絡配置、文件系統格式及其他服務的啟動管理,而這些操作都是通過/etc/inittab文件來規劃的,在此文件中設置了默認的啟動執行等級(runlevel)。先來查看一下/etc/inittab文件的內容(以centos 5 為例)
[root@station1 boot]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Trap CTRL-ALT-DELETE (工作中此項操作需要小心,可以用#號注釋掉) ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
從上面可以看到系統有0-6共7個運行級別(本機的默認級別為5),分別如下: 0 :關機 1 :單用戶模式(root 自動登錄), single, 維護模式 2 :多用戶模式,啟動網絡功能,但不會啟動NFS ;維護模式 3 :多用戶模式,正常模式;文本界面 4 :預留級別;可同3 級別 5 :多用戶模式,正常模式;圖形界面 6 :重啟
此文件每一行定義一種 action 以及與之對應的process命令。格式為 id:runlevel:action:process ,其中action的常用值有:
wait: 切換至此級別運行一次process respawn :此process 終止,就重新啟動之 ctrlalttab:代表按下Ctrl+Alt+Del三個組合鍵是否可以重啟系統 initdefault :設定默認運行級別;process 省略 sysinit :設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit
常用的級別為3、5,1模式多用來系統維護,相當于Windows的安全模式??梢允褂?runlevel 命令和 who -r 命令查看當期系統的級別。級別切換可以使用init #(#:0-6)命令
5、初始化腳本(/etc/rc.d/rc.sysinit)
/etc/rc.d/rc.sysinit文件是Linux系統運行的第一個腳本,主要是用來設置系統環境的。此腳本所做的事情主要有以下幾點:
(1) 設置主機名 (2) 設置歡迎信息 (3) 激活udev(Linux kernel 2.6系列的設備管理器)和 selinux (4) 掛載/etc/fstab 文件中定義的文件系統 (5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統 (6) 設置系統時鐘 (7) 激活swap 設備 (8) 根據/etc/sysctl.conf 文件設置內核參數 (9) 激活lvm 及software raid 設備 (10) 加載額外設備的驅動程序 (11) 清理操作
6、關閉或啟動對應級別下的服務
在/etc/rc.d/rc.sysinit初始化系統環境后,系統將會關閉或啟動對應級別下的服務,此處以/etc/inittab中默認的5級別為例。先看一下/etc/rc.d目錄的內容(下圖)。
可以看到每個級別都有與之對應的目錄,而每個目錄里面就記錄的就是該級別要啟動或關閉的服務(下圖,級別5)。
以大寫“K”開頭的是要關閉的服務,大寫“S”開頭的是要啟動的服務,后面接的數字為此服務關閉或開啟的優先級。這些服務的文件都是鏈接到/etc/rc.d/init.d目錄下對應的文件的。
7、啟動終端
在完成了前面的所有操作之后,系統會調用/sbin/mingtty命令啟動終端,用戶輸入了賬號密碼即可登錄系統。至此Linux的整個啟動流程結束。
原創文章,作者:pao,如若轉載,請注明出處:http://www.www58058.com/45329