圖解CentOS系統啓動流程

本文轉發自:ch666.blog.51cto.com
當我們按下開機鍵後,系統背後的祕密我們是否瞭解呢?這裏,我帶大家探索一下linux系統開機背後的祕密。


1.加電自檢

主板在接通電源後,系統首先由POST程序來對內部各個設備進行檢查,自檢中如發現有錯誤,將按兩種情況處理:對於嚴重故障(致命性故障)則停機,此時由於各種初始化操作還沒完成,不能給出任何提示或信號;對於非嚴重故障則給出提示或聲音報警信號,等待用戶處理。

2.BIOS啓動引導階段

自檢通過之後,按次序查找各引導設備,第一個有引導程序的設備即爲本次啓動要用到的設備。一般電腦是按"F2"或"Del"鍵等等進入BIOS,在裏面我們可以調整硬盤的啓動順序。

找到第一個有引導程序的設備後,BIOS會找到設備中的MBR,讀取其中的Bootloader
3.GRUP引導階段

這時候就可以看到我們的Centos系統了,但是一般都不需要操作,會自動啓動系統。其實我們也可以自己手動啓動系統的

3.1 手動在grub命令行接口啓動系統:

grub> root (hd
#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=
/dev/
DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

3.2 grub的命令行接口:

e: 編輯模式,用於編輯菜單;
c: 命令模式,交互式接口;
help: 獲取幫助列表
help KEYWORD: 詳細幫助信息
find (hd
#,#)/PATH/TO/SOMEFILE:
root (hd
#,#) 設定grup的根設備
kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;
例如:init=
/path/
to/init, selinux=
0
initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk;
boot: 引導啓動選定的內核;

3.3 配置文件:/boot/grub/grub.conf
配置項:

default
=#: 設定默認啓動的菜單項;落單項(title)編號從
0
開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashimage=(hd
#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [--md5] STRING: 菜單編輯認證;
title TITLE:定義菜單項“標題”, 可出現多次;用來引導多個內核或者操作系統
root (hd
#,#):grub查找stage2及kernel文件所在設備分區;爲grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
password [--md5] STRING: 啓動選定的內核或操作系統時進行認證

4.加載內核階段

內核會自身初始化:探測可識別到的所有硬件設備;加載硬件驅動程序;(有可能會藉助於ramdisk加載驅動) 以只讀方式掛載根文件系統;運行用戶空間的第一個應用程序:/sbin/init

5.init初始化階段

內核加載完畢,會運行init程序,init進程起來後,系統啓動的控制權移交給init進程 /sbin/init進程是所有進程的父進程,當init起來之後,它首先會讀取配置文件 /etc/inittab,進行以下工作:

  • 1.執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此係統基本算運行起來了,後面需要進行運行級別的確定及相應服務的啓動;
  • 2.確定啓動後進入的運行級別;
  • 3.執行/etc/rc.d/rc,該文件定義了服務啓動的順序是先K後S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d下的相應文件。
  • 4.有關key sequence的設置
  • 5.有關UPS的腳本定義
  • 6.啓動虛擬終端/sbin/mingetty
  • 7.在運行級別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腳本;

  • K:要停止的服務;K##,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉被依賴的;

  • S:要啓動的服務;S##,優先級,數字越小,越是優先啓動;被依賴的服務先啓動,而依賴的服務後啓動;
    chkconfig命令:管控/etc/init.d/每個服務腳本在各級別下的啓動或關閉狀態;

  • 查看:chkconfig --list [name]

  • 添加:chkconfig --add name

  • 刪除:chkconfig --del name
    修改指定的鏈接類型:

  • chkconfig [–level LEVELS] name

  • –level LEVELS:指定要控制的級別;默認爲2345;
    init命令:

  • 級別切換:init #

  • 級別查看:who -r
    注:正常級別下,最後啓動的一個服務S99local沒有鏈接至 /etc/init.d下的某腳本,而是鏈接至了 /etc/rc.d/rc.local(/etc/rc.local)腳本;因此,不便或不需寫爲服務腳本的程序期望能開機自動運行時,直接放置於此腳本文件中即可。

發佈了25 篇原創文章 · 獲贊 45 · 訪問量 7189
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章