一、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下的服務
最後啓動相關服務, 並設置登錄終端.