CentOS啓動流程

一、CenOS 5和6啓動流程:

CentOS啓動流程總體來說有以下步驟:

POST --> BootSequence(BIOS) --> Bootloader(MBR) --> Kernel(ramdisk) --> rootfs(只讀) 
--> switchroot --> init(CentOS 7爲systemd) --> /etc/inittab --> 讀取默認運行級別 --> 
運行系統初始化腳本, 完成系統初始化 --> 關閉對應級別下需要關閉的服務, 啓動需要啓動的服務 --> 設置登錄終端

二、啓動流程拆解

2.1 POST加電自檢

系統啓動的第一個步驟, 打開電源, 這時候主板上的BIOS芯片中的CMOS就會對整個硬件進行自檢, 如果自檢通過就會進入到下一個步驟, 引導加載次序.

2.2 BootSequence(BIOS)

這一步還是跟BIOS有關, 自檢通過, BIOS按次序查找各引導設備, 第一個有引導程序的設備即爲本次啓動用到的設備.

2.3 bootloader(MBR)

bootloader是一個程序, 其作用是提供一個菜單, 允許用戶選擇要啓動的系統或者不同版本的內核, 然後把用戶選定的內核或者系統裝載到內存特定的空間中, 解壓、展開後將系統的控制權移交給內核.
目前常用的bootloader:

  • ntloader(Windows)
  • Grub(GRand Uniform Bootloader): 識別硬盤上的文件系統; 查找並列出可啓動的操作系統.

2.3.1 MBR

MBR(主引導記錄), 存放在硬盤的0扇區, 總共有512 Bytes, 其中446 Bytes裝的是bootloader, 64 Bytes爲分區表, 最後2 Bytes爲MBR的有效性標識(55AA)

2.4 Kernel初始化

這一步中, 主要由以下幾個步驟:

  • 探測可識別到的所有硬件設備
  • 加載硬件驅動程序, 首先加載硬盤的驅動程序(可能會藉助於ramdisk加載驅動)
  • 以只讀方式掛載根文件系統(rootfs)
  • 運行用戶空間第一個應用程序: /sbin/init
    • SysV: CentOS 5; 配置文件(/etc/inittab)
    • Upstart: CentOS 6; 配置文件(/etc/inittab, /etc/init/*.conf)
    • Systemd: CentOS 7; 配置文件(/usr/lib/systemd/system/, /etc/systemd/system/)

2.4.1 如何加載硬盤驅動

內核要識別硬盤上的分區, 必須要有硬盤的驅動才行, 可是Linux的內核爲了保持足夠輕便, 硬件驅動並沒有裝載至內核中, 而是通過modules的形式插入內核中的, 所以這時候需要調用ramdisk文件. ramdisk中會存有裝系統時當前主機的硬盤驅動, 通過ramdisk文件將硬盤驅動裝載上, 使得內核可以加載各分區, 從而加載到各個硬件驅動, 然後在將控制權交回給內核.

2.5 init

init啓動後會從其配置文件中讀取運行級別, 總共有七個級別, 如下所示:

  • 0: shutdown
  • 1: 單用戶模式(root, 無需登錄), 又叫single(維護模式)
  • 2: 多用戶模式, 會啓動網絡功能, 但不會啓動NFS(維護模式)
  • 3: 多用戶模式, 正常模式, 文本界面
  • 4: 預留級別, 可同3級別一樣使用
  • 5: 多用戶模式, 正常模式, 圖形界面
  • 6: reboot

2.5.1 相關命令

2.5.1.1 init命令

init - 用戶切換級別
用法: init <0~6>

2.5.1.2 查看當前級別

命令1: runlevel
命令2: who -r

2.5.1.3 chkconfig命令

chkconfig - 查看服務在所有級別的啓動或關閉設定情形
查看: chkconfig [--list] [name]
添加: chkconfig --add name
刪除: chkconfig --del name
修改指定級別的鏈接類型: chkconfig [--level levels] name <on|off|reset>

# --level levels: 指定要設定的級別, 省略表示2345

NOTE: 正常級別下,最後啓動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,只是指向了/etc/rc.d/rc.local腳本,因此,不便或不需要寫爲服務的腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可以直接放置於/etc/rc.d/rc.local文件中

2.6 系統初始化腳本

CentOS 5和6中的系統初始化腳本位於/etc/rc.d/rc.sysinit, 其主要執行以下工作:

  • 設置主機名
  • 設置歡迎信息
  • 激活udev和selinux
  • 掛載/etc/fstab文件中定義的文件系統
  • 檢測根文件系統, 並以讀寫方式重新掛載根文件系統
  • 設置系統時鐘
  • 激活swap設備
  • 根據/etc/sysctl.conf文件設置內核參數
  • 激活lvm及software raid設備
  • 加載額外設備的驅動程序
  • 清理操作

2.7 /etc/rc.d/rc#.d/

此目錄下定義的是對應級別下的各種服務腳本, 通過ls查看, 內如如下:

[root@localhost ~]# ls /etc/rc.d/rc3.d/
K10saslauthd  K50netconsole   K89rdisc         S08ip6tables  S10network  S12rsyslog           S25netfs      S55sshd     S90crond
K15svnserve   K87restorecond  S02lvm2-monitor  S08iptables   S11auditd   S25blk-availability  S26udev-post  S80postfix  S99local

其中S代表開機要啓動的服務, K開頭的是關機要執行的服務. rc#.d的#代表運行級別.

2.8 設置登錄終端

這一步就是執行/bin/login程序, 等待用戶登錄了.

三、CentOS 7啓動流程

CentOS 7啓動流程與CentOS 5和6差不多, 只不過init程序改爲了systemd, 下面詳細解釋下Systemd後的啓動流程.

3.1 執行initrd.taget

這一步主要是掛載/etc/fstab中的文件系統, 掛載完成後切換到根目錄.

3.2 從initramfs根文件系統切換到磁盤根目錄

3.3 執行默認target配置

CentOS 7沒有以前版本的運行級別概念, 但是爲了向下兼容, 它對每個運行級別都有一個對應的軟件界指向, 如下所示:

level 0 ==> runlevel0.target, poweroff.target
level 1 ==> runlevel1.target, rescue.target
level 2 ==> runlevel2.target, multi-user.target
level 3 ==> runlevel3.target, multi-user.target
level 4 ==> runlevel4.target, multi-user.target
level 5 ==> runlevel5.target, graphical.target
level 6 ==> runlevel6.target, reboot.target

默認啓動級別由/etc/systemd/system/default.target文件指定, 這是一個軟連接文件, 這個連接指向的文件即爲啓動時的默認級別.

[root@zabbix bin]# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Jul  5  2017 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

3.4 執行basic.target

初始化系統及basic.target準備操作系統, 在CentOS6上爲rc.sysinit程序.

3.5 啓動相關target下的服務

最後啓動相關服務, 並設置登錄終端.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章