下面介紹的是基於Intel x86架構的CentOS系列操作系統的啓動流程。
1、Linux系統基礎簡介
(1)、Linux【系統組成】:內核+應用程序 或 內核+rootfs
(2)、Linux的【運行環境】:內核空間 --------內核進程佔用CPU和內存資源總和
用戶空間 --------應用程序佔用CPU和內存資源總和
(3)、【內核】主要具有6個【功能】:進程管理、文件系統管理、內存管理、網絡協議管理、驅動管理、內存功能。
對於內核,有兩種設計:單內核、微內核。單內核,是所有功能聚集於一個程序,表現爲一個進程。微內核,是所有功能都有單獨的子系統。對於Linux系統,採用的是單內核、模塊化設計。
(4)、Linux內核的三部分:內核核心文件、內核對象文件、ramdisk
Linux的【核心文件】 ----------/boot/vmlinuz
內核【模塊文件】 --------/lib/moduls/2.6.32-573.el6.x86_64/kernel
ramdisk ------------/boot/initramfs-2.6.32-573.el6.x86_64.img (其以.img結尾)
centos5的ramdisk 爲 /boot/initrd -----------用mkinitrd 工具生成
centos6/7的ramdisk 爲 /boot/initramfs -------用dacut 工具生成(限於7使用),但也兼容mkinitrd
ramdisk 是雙緩衝和雙緩存。
2、CentOS6 操作系統啓動流程
(1)、POST加電自檢
加電自檢中,運用ROM中的BIOS程序。主板上ROM中存儲的BIOS程序,被主板芯片映射入內存,從而協助CPU完成。
(2)、Bootsequence啓動程序
據BIOS找啓動程序,找第一個引導程序。根據BIOS的啓動順序,一次訪問各個存儲設備,檢查其MBR中是否有引導程序,如果有則將引導程序加載至內存,並且將硬件的管理權移交給引導程序。
(3)、引導加載器BootLoader
一般使用MBR中的grub,應用grub加載文件系統,grub能提供一個用戶菜單,命令行接×××互操作。-----------應用grub legacy。
引導程序grub,開始加載stage1.5,以驅動根文件系統,然後從根設備加載stage2至內存,stage2的代碼將會從同一磁盤分區加載kernel至內存,同時將硬件的管理權移交給kernel
(4)、加載內核kernel ----------------內核核心文件放在【基本分區】上
對內核進行初始化,加載硬件的驅動程序。
kernel試圖掛載根文件系統,如果其內部有直接編譯成內核的文件系統驅動程序,則無需其他輔助直接以只讀方式掛載根文件系統即可,否則,必須依賴於ramdisk提供的臨時根文件系統作爲過渡,待根文件系統驅動成功以後,完成切換的工作,以只讀方式掛載真正的文件系統。
(5)、加載根文件系統rootfs -----以只讀的方式掛載根文件系統。
如果沒有驅動,藉助於ramdisk加載驅動。
(6)、運行用戶空間的第一個應用程序: /sbin/init。
CentOS 6的Init程序爲:upstart(基於事務驅動)。
配置文件:/etc/inittab ----------僅定義默認運行級別
/etc/init/*.conf --------rcS.conf(系統初始化腳本); rc.conf(運行級別關閉或開啓系統服務的任務); start-ttys.conf(終端相關的任務); prefdm.conf(圖形界面的任務)。
(7)、設定默認運行級別 ----------/etc/inittab
(8)、系統初始化 ------------/etc/init/*.conf
(9)、並行執行任務:定義ctrl+alt+del熱鍵功能;關閉對應級別下應停止的服務,開啓對應級別下應開啓的服務;電源管理;dbus管理等。根據運行級別,選擇打開的終端數量及位置。
(10)、登錄提示符
使用mingetty命令來調用login命令,來爲用戶打印登錄提示符。
3、CentOS5基礎
(1)、CentOS基礎
CentOS5的7個運行級別爲0-6,0爲關機、6爲重啓、1爲單用戶模式、2-5爲多用戶模式,3爲多用戶的命令行界面,5爲多用戶的圖形化界面。
查看運行級別:# who -r 或 # runlevel
切換運行級別:# init 0-6
CentOS5的第一個引用程序爲Init,其配置文件爲/etc/inittab。配置文件指明系統初始化的任務
執行【規定的任務】,格式爲:id:runlevels:action:process。 action表示啓動此任務,通常爲sysinit,一般是運行/etc/rc.d/rc.sysinit腳本。所有由rc腳本關閉或啓動的鏈接文件的源文件都在/etc/rc.d/init.d,該目錄創建了鏈接/etc/init.d。
在init引導啓動用戶空間進程時,不需要寫在系統服務中的內容,寫在/etc/rc.d/rc.local腳本中。
(2)、chkconfig命令
chkconfig命令 ------------查看和管理系統服務的運行狀態。
# chkconfig --list [name]
# chkconfig --add name
# chkconfig --del name
修改/etc/rc.d/rc#.d/,管理系統服務。例如:# chkconfig: 2345 90 60 (其中,2345爲運行級別,90爲開啓的優先級,60爲關閉的優先級。)
單獨制定系統服務開啓或關閉:# chkconfig [--level levels] name <on|off|reset>
在init引導啓動用戶空間進程時,不需要寫在系統服務中的內容,寫在/etc/rc.d/rc.local腳本中。
(3)CentOS5操作系統的啓動流程
1)、POST加電自檢
加電自檢中,運用ROM中的BIOS程序。主板上ROM中存儲的BIOS程序,被主板芯片映射入內存,從而協助CPU完成。
2)、Bootsequence啓動程序
據BIOS找啓動程序,找第一個引導程序。根據BIOS的啓動順序,一次訪問各個存儲設備,檢查其MBR中是否有引導程序,如果有則將引導程序加載至內存,並且將硬件的管理權移交給引導程序。
3)、引導加載器BootLoader
一般使用MBR中的grub,應用grub加載文件系統,grub能提供一個用戶菜單,命令行接×××互操作。-----------應用grub legacy。
引導程序grub,開始加載stage1.5,以驅動根文件系統,然後從根設備加載stage2至內存,stage2的代碼將會從同一磁盤分區加載kernel至內存,同時將硬件的管理權移交給kernel
4)、加載內核kernel ----------------內核核心文件放在【基本分區】上
對內核進行初始化,加載硬件的驅動程序。
kernel試圖掛載根文件系統,如果其內部有直接編譯成內核的文件系統驅動程序,則無需其他輔助直接以只讀方式掛載根文件系統即可,否則,必須依賴於ramdisk提供的臨時根文件系統作爲過渡,待根文件系統驅動成功以後,完成切換的工作,以只讀方式掛載真正的文件系統。
5)、加載根文件系統rootfs -----以只讀的方式掛載根文件系統。
如果沒有驅動,藉助於ramdisk加載驅動。
6)、運行用戶空間的第一個應用程序: /sbin/init。
kernel試圖啓動第一個進程:/sbin/init,而後kernel轉入後臺,將用戶空間的進程管理任務交給init進程來完成
配置文件:/etc/inittab /etc/init/*.conf /etc/rc.d/rc.sysinit /etc/rc.d/rc
7)、執行/sbin/init 和 /etc/inittab文件
8)、設置默認的運行級別
9)、執行/etc/rc.d/rc.sysinit腳本,完成系統初始化
10)、執行/etc/rc.d/rc腳本,關閉對應級別下應停止的服務,開啓對應級別下應開啓的服務
11)、設置熱鍵,如:Ctrl+Alt+Del熱鍵功能
12)、UPS電源的失效與恢復
13)、生成終端,默認啓動圖形界面。
4、Bootloader
grub通用統一加載器有兩種,即grub legacy和grub2。
grub legacy分爲三個階段,分別是第一階段、第二階段和中間的1.5階段。中間階段的作用是,讓第一階段的引導程序識別第二階段分區的文件系統。stage2提供了很多功能,其中最重要的是加載操作系統的內核核心文件,還可以提供菜單和交互接口、允許用戶編輯菜單、命令行操作模式、具身份驗證機制。
grub命令行常用的6個命令如下:
1)、help:獲得grub命令的名稱列表
2)、help GRUB_CMD:特定命令的詳細幫助信息
3)、root (hd#,#):指定grub程序的根設備(磁盤的指定分區)。hd# 爲磁盤編號,# 爲分區編號,# 一般是從0開始的數字,如0表示第一個分區,如 (hd0,0),表示當前計算機上的第一塊磁盤的第一個分區。
4)、find (hd#,#):指定分區中搜索文件,顯示出文件所在的位置
5)、kernel /PATH/TO/KERNEL_CORE_FILE:本次啓動的內核文件的絕對路徑。額外內核參數:ro root=/dev/sda3 selinux=0 init=/sbin/init quiet rhgb {1|s|S|single}
6)、initrd /PATH/TO/initramfs-VERSION-release.img:內核所對應的ramdisk(ramfs)文件
grub的配置文件爲 /boot/grub/grub.conf 和 /etc/grub.conf(鏈接)。配置文件裏的內容如下:
default=0 ------默認啓動菜單項,title是從0開始編號
timeout=5 ------倒計時
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz -----圖片背景
hiddenmenu ------------(是否)隱藏grub的啓動菜單
password --md5 CRYPTED_PASSWORD ------------菜單的保護密碼
title CentOS 6 (2.6.32-573.el6.x86_64) ------菜單標題,可多個title
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.el6.x86_64.img
password --md5 CRYPTED_PASSWORD
5、CentSO7 操作系統啓動流程
(1)、POST加電自檢
加電自檢中,運用ROM中的BIOS程序。主板上ROM中存儲的BIOS程序,被主板芯片映射入內存,從而協助CPU完成。
(2)、Bootsequence啓動程序
據BIOS找啓動程序,找第一個引導程序。根據BIOS的啓動順序,一次訪問各個存儲設備,檢查其MBR中是否有引導程序,如果有則將引導程序加載至內存,並且將硬件的管理權移交給引導程序。
(3)、引導加載器BootLoader
一般使用MBR中的grub2,應用grub2加載文件系統,grub2能提供一個用戶菜單,命令行接×××互操作。
(4)、裝載引導程序的配置文件:/etc/grub.d /etc/default/grub /boot/grub2/grub.cfg
(5)、加載initramfs驅動模塊
(6)、加載內核kernel ----------------內核核心文件放在【基本分區】上
對內核進行初始化,加載硬件的驅動程序。
(7)、內核以只讀方式掛載rootfs,啓動systemd進程。
(8)、執行initrd.*.target所有的unit,包括掛載/etc/fstab所有有效的文件系統
(9)、根切換
(10)、systemd執行默認的target
6、centos7基礎
centos7的init程序採用systemd風格,systemctl命令,使用兼容以前的版本,所以也可以使用service類的命令。
Systemd具有許多centos6裏面沒有的四個特點:(1)、並行開啓,即在系統引導的時候可以實現服務的並行開啓;(2)、按需激活,即能夠實現按需激活進程,即在系統啓動時,需要隨系統啓動服務,其服務進程並沒有啓動,但是Ststemd爲每一個此類服務進程都註冊了套接字,我們稱這種服務處理方式爲“半激活狀態”。(3)、快照功能,即能夠對當前系統的用戶空間的每個進程進行狀態快照,以後如果進程出現問題或故障,可以迅速恢復進程狀態至過去的某一時候。(4)、服務控制邏輯,systemd內部有一種基於基於依賴關係來定義的服務控制邏輯。
# systemctl {start|stop|restart|status} name[.service] ----------管理服務
# systemctl set-default {multi-user.target | graphical.target} ----------設置運行級別
# systemctl get-default -----------設置默認運行級別
# systemctl set-default muti-user.target ------改回命令行界面
centos7採用unit文件進行核心管理,由Systemd相關的配置文件進行各種標識、識別、和配置功能的實現。unit文件分爲 系統服務類、socket、目標類、快照類等幾類。這些配置文件主要保存在以下三個文件中:
/etc/lib/systemd/system/*
/etc/systemd/system/* ---------符號鏈接
/run/systemd/system/* ---------非配置關鍵項
unit常見的8種類型如下:
Service unit:擴展名爲.service ----------用於定義系統服務,可省
Target unit:擴展名爲.target ------------init程序的運行級別
Decvice unit:擴展名爲.device --------內核識別的設備
Mount unit:擴展名爲.mount ------------systemd管理的文件系統的掛載點
automount unit:擴展名爲.automount --------------掛載點的位置
Socket:擴展名爲.socket -------------標識進程間通信的socket文件
Swap unit:擴展名爲.swap ------------標識swap設備
Path unit:擴展名爲.path ------------監控指定目錄中的一個文件或一個子目錄,沒有則自動創建。
target unit模擬6中的運行級別:
級別0:runlevel0.target,poweroff.target
級別1:runlevel1.target,rescue.target
級別2:runlevel2.target,multi-user.target:
級別3:runlevel3.target,multi-user.target
級別4:runlevel4.target,multi-user.target
systemd的四種實現方式如下:
(1)、基於socket unit的方式實現進程激活機制
(2)、基於device unit的方式實現設備的自動識別,掛載
(3)、基於bus的激活機制
(4)、基於path的激活機制
如果自行編寫unit file,可以直接將文件放置於/etc/systemd/syetem目錄中,也可以將其放在/usr/lib/systemd/system/目錄中。unit file通常分爲三段,分別爲 [Unit]、[Service]、[Install],各部分解釋如下:
(1)、[Unit]:定義域Unit類型無關的通用選項。
常用的選項語句:
Description ------相關服務描述
After -------服務啓動前依賴的內容
before ------------依賴此服務啓動的服務
Wants --------指明依賴關係
Requires -----------指明依賴關係
Conflict -----------各unit之間可能存在的衝突
Documentation ---------------管理命令的文檔所在位置
(2)、[Service]:定義與系統服務相關的專用的選項語句。
常用的選項語句:
Type ----------定義影響ExecStart及相關參數的功能:simple、forking、oneshot、notify
EnvironmentFile ------------------環境配置文件
ExecStart ----------啓動此服務所需要運行的命令或腳本
ExecReload -------------指明重載配置文件所需要運行的命令或腳本
ExecStop --------------指明停止此服務所需要運行的命令或腳本
ExecStartPre -----------指明啓動ExecStart所指明的命令【之前】所需要運行的命令或腳本
ExecStartPost -----------指明啓動ExecStart所指明的命令【之後】所需要運行的命令或腳本
Restart ------------表示如果服務遇到意外而終止,則會自動重啓該服務
(3)、[Install]:服務啓動或禁用時用到的專用選項語句
WantedBy ------弱依賴關係
RequiredBy ---------強依賴關係
systemctl命令 ---------------控制系統和服務管理
以下是centos6和centos7實現相同功能,所使用的不同的命令行,及其區別:
(1)、啓動:
centos6:service NAME start
centos7:systemctl start NMAE[.service]
(2)、停止:
centos6:service NAME stop
centos7:systemctl stop NMAE[.service]
(3)、重啓:
centos6:service NAME restart
centos7:systemctl restart NMAE[.service]
(4)、狀態:
centos6:service NAME status
centos7:systemctl status NMAE[.service]
(5)、服務開機自啓:
centos6:chkconfig --level runlevels NAME on
centos7:systemctl enable NAME.service
(6)、禁止服務的開機自啓:
centos6:chkconfig --level runlevels NAME off
centos7:systemctl disable NAME.service
(7)、查看是否開機自啓:
centos6:chkconfig --list NAME
centos7:systemctl is-enabled NAME.service
(8)、條件式重啓:
centos6:service NAME condrestart
centos7:systemctl try-restart NAME.service
(9)、重載或重啓:
systemctl reload-or-restart NAME.service
(10)、重載或條件式重啓:
systemctl reload-or-try-restart NAME.service
(11)、查看是否激活
systemctl is-active NAME.service
(12)、查看所有激活:
systemctl list-units
systemctl list-units --type=NUIT_TYPE:查看指定unit類型的處於活躍狀態的服務
systemctl list-units --all:顯示所有包括處於活躍狀態和處於非活躍狀態的各服務
(13)、查看服務的依賴關係:
systemctl list-dependencies NAME.service
(14)、禁止開機自啓:
systemctl mask NAME.service
(15)、取消禁止的開機自啓:
systemctl unmask NAME.service、
(16)、運行級別之間的切換:
centos6:init #
centos7:systemctl isolate NAME.target
(17)、查看運行級別:
centos6:runlevel :
centos7:systemctl list-units --type=target --all
systemctl get-default
(18)、修改默認運行級別:
systemctl set-default NAME.target
# systemctl halt,systemctl poweroff ------關機
# systemctl reboot ------重啓
# systemctl suspend ------掛起
# systemctl hibernate --------休眠
# systemctl hybrid-sleep ----------掛起並休眠