第一步、POST加電自檢
POST(Power On Self Test)首先對每一個設備進行檢查。完成後會尋找存有引導記錄的設備,找到後讀入操作系統引導記錄,然後將系統控制權交給引導記錄,並由引導記錄來完成系統的順利啓動。
第二步、MBR引導
MBR(Master Boot Record) MBR記錄一般是在磁盤 0 磁道 1 扇區,共512個字節。前446個字節是BootLoder,後 4*16 的 64 個字節是存放分區信息的,最後 2 個字節是校驗信息,一般是 55AA。
第三步、GRUB(GRand Unified Bootloader)加載內核
就是MBR中的前 446 個字節,是BooTLoader的一種,它的作用是要選擇要啓動的內核。
[root@Linux_1 grub]# ll
總用量 274
-rw-r--r--. 1 root root 6311月 15 00:12 device.map
-rw-r--r--. 1 root root 1339211月 15 00:12e2fs_stage1_5
-rw-r--r--. 1 root root 1263211月 15 00:12fat_stage1_5
-rw-r--r--. 1 root root 1176011月 15 00:12ffs_stage1_5
-rw-------. 1 root root 73711月 15 00:12 grub.conf
-rw-r--r--. 1 root root 1176811月 15 00:12 iso9660_stage1_5
-rw-r--r--. 1 root root 1328011月 15 00:12jfs_stage1_5
lrwxrwxrwx. 1 root root 1111月 15 00:12 menu.lst-> ./grub.conf
-rw-r--r--. 1 root root 1196811月 15 00:12minix_stage1_5
-rw-r--r--. 1 root root 1442411月 15 00:12reiserfs_stage1_5
-rw-r--r--. 1 root root 134111月 15 2010splash.xpm.gz
-rw-r--r--. 1 root root 51211月 15 00:12 stage1
-rw-r--r--. 1 root root 126108 11月 15 00:12 stage2
-rw-r--r--. 1 root root 1203611月 15 00:12ufs2_stage1_5
-rw-r--r--. 1 root root 1137611月 15 00:12vstafs_stage1_5
-rw-r--r--. 1 root root 1397611月 15 00:12xfs_stage1_5
stage:用於grub引導程序過大,所以分2段引導,第一段存放在MBR中,第二段存放於內核文件系統中,第一段引導完成後可以找到第二段。但是,第二段是存放於內核文件系統中的,此時還沒有格式化文件系統,如何可以訪問到第二段的 menu.lst 呢??就需要藉助於中間層stage1_5,有它來協助 stage1段來訪問 stage2 段。stage1_5通常位於 stage1 字段後的 63 個扇區。 由於stage2 在內存中存放可以使用的文件系統不確定,所以這就是有多個 stage1_5 的原因了。
1、grub.conf 文件參數意義
default=1 # 默認啓動的內核title, 0 表示是第一個
timeout=5 # 默認等待時間
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz # 指定菜單的背景圖片的路徑。爲xpm格式,採用gzip壓縮,只能爲14bits色
hiddenmenu # 隱藏菜單
title CentOS (2.6.32-358.el6.x86_64) # 標題名,用戶可自定義
root (hd0,0) # 指定 grub 的根位置
#指定 kernel 文件的位置,還要指出 root(系統啓動後)的位置,掛載方式 ro,這項很關鍵。
#加載後會啓動 init 進程。
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-rootrd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MDSYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=autoquiet rhgb quiet
#在內核啓動過程中裝載根文件系統時有用
initrd /initramfs-2.6.32-358.el6.x86_64.img
initramfs-2.6.32-358.el6.x86_64.img的本質
#initramfs 是以 gzip 壓縮的 cpio 格式的文件。內核啓動時將他作爲一個臨時的根文件系統
# grub的 stage2 將initrd加載到內存裏,讓後將其中的內容釋放到內存中
# 內核便去執行init腳本,這時內核將控制權交給了init文件處理
#init 它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完後
# 會創建一個根設備,然後將根文件系統rootfs以只讀的方式掛載
# 這一步結束後,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序
# 執行系統的1號進程。此後系統的控制權就全權交給/sbin/init進程了
四、啓動 init 進程
init 進程是系統啓動的第一個進程。其他進程都是有此進程控制fork出來的,也就是說,init是其他進程的“祖先”,PID=1。當然,PID=0進程我們稱爲空閒進程是屬於內核的。
init啓動後所做的事情:
1、讀取/etc/inittab來讀取默認級別 假設:讀取到的默認級別是3
/etc/init/*.conf
0:關機shutdown init 0
1:單用戶模式(single user)無須認證,維護模式,直接登錄不需密碼
2:多用戶模式(multi user)會啓動網絡功能,但不會啓動NFS,維護模式
3:多用戶模式(multi user)完全功能模式,只是文本界面,不會啓動圖形界面
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用
5:多用戶模式(multi user)完全功能模式,圖形界面
6:重啓reboot
2、執行初始化系統腳本 /etc/rc.d/rc.sysinit
獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。
歡迎信息。
掛載/etc/fstab文件中定義的其它文件系統。
激活swap
檢測根文件系統,並以讀寫方式重新掛載
決定是否啓動SELinux和udev。
接口設備的檢測與即插即用(pnp)參數的測試。
用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。
加載核心的相關設置。按"/etc/sysctl.conf"這個文件的設置值配置功能。
設置系統時間(clock)。
設置終端的控制檯的字形。
設置raid及LVM等硬盤功能。
以方式查看檢驗磁盤文件系統。
進行磁盤配額quota的轉換。
重新以讀取模式載入系統磁盤。
啓動quota功能。
啓動系統隨機數設備(產生隨機數功能)。
清楚啓動過程中的臨時文件。
將啓動信息加載到"/var/log/dmesg"文件中
3、然後執行 /etc/rc.d/rc 腳本
此腳本運行的時候此腳本的時候,會讀取/etc/rc.d/rc3.d/下的所有腳本,來控制系統啓動的時候啓動或者關閉那些服務
[root@Linux_1 rc3.d]# pwd
/etc/rc.d/rc3.d
[root@Linux_1 rc3.d]# ll
總用量 0
lrwxrwxrwx. 1 root root 15 11月 15 00:57 K80kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 24 11月 15 00:57 K84wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx. 1 root root 21 11月 14 23:57 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 14 11月 15 00:57 K88sssd -> ../init.d/sssd
lrwxrwxrwx. 1 root root 15 11月 14 23:57 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 19 11月 15 00:57 K95firstboot -> ../init.d/firstboot
lrwxrwxrwx. 1 root root 14 11月 15 00:10 K99rngd -> ../init.d/rngd
lrwxrwxrwx. 1 root root 17 11月 15 00:09 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx. 1 root root 22 11月 15 00:09 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 22 11月 15 01:01 S03vmware-tools -> ../init.d/vmware-tools
lrwxrwxrwx. 1 root root 19 11月 15 00:00 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 11月 14 23:57 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 11月 14 23:57 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 11月 15 00:11 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 21 11月 14 23:53 S11portreserve -> ../init.d/portreserve
lrwxrwxrwx. 1 root root 17 11月 14 23:59 S12rsyslog -> ../init.d/rsyslog
#這裏面的腳本大致分爲 2 類,以 S 開頭的和以 K 開頭的腳本。
# S 代表開機時啓動的,K 表示開機時不啓動。
# 啓動的定義是在每個腳本中定義的:例如
# # chkconfig: - 85 15
# 默認級別 啓動次序 不啓動次序
4、執行/etc/rc.d/rc.local腳本,此腳本是啓動過程中最後啓動的一個腳本。
最後會執行 /bin/login 登錄用戶。至此係統啓動過程完成。