centos系列的啟動流程及基礎知識點
下面介紹的是基於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 ------倒數計時
splashimage=(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 ----------掛起並休眠
相關文章
- IdentityServer4系列 | 初識基礎知識點IDEServer
- [CentOS Python系列] 三.阿里雲MySQL資料庫開啟配置及SQL語句基礎知識CentOSPython阿里MySql資料庫
- java基礎知識點Java
- JavaWeb基礎知識點JavaWeb
- JavaScript基礎知識點JavaScript
- 【Git 系列】基礎知識全集Git
- Android基礎知識:Service(3)啟動模式Android模式
- Java基礎知識點梳理Java
- Servlet基礎知識點整理Servlet
- JavaScript部分基礎知識點JavaScript
- Java 基礎面試知識點Java面試
- 【Java基礎知識】Java流程控制Java
- Android View滑動相關的基礎知識點AndroidView
- JavaScript的基礎知識點(面試題)JavaScript面試題
- vueX基礎知識點筆記Vue筆記
- Python基礎知識點梳理Python
- ES 基礎知識點總結
- Java基礎知識點總結Java
- Redis 基礎知識點總結Redis
- Dubbo基礎入門知識點
- Java入門基礎知識點Java
- CSS基礎知識點總結CSS
- MySQL基礎知識點彙總MySql
- SAP SD基礎知識之流程概覽
- Thread執行緒的基礎知識及常見疑惑點thread執行緒
- 圖片基礎知識及不同格式的特點介紹
- Java基礎知識系列—序列化Java
- vue的一些基礎知識點Vue
- 【Xamarin.Forms 2】App基礎知識與App啟動ORMAPP
- ASP.NET Core基礎知識(二)【應用啟動】ASP.NET
- JSP基礎知識及工程建立JS
- Java基礎面試知識點總結Java面試
- 前端知識點總結——JavaScript基礎前端JavaScript
- Flutter 知識點總結-基礎篇Flutter
- JavaSE基礎 (全網最全知識點)Java
- iOS基礎面試知識點總結iOS面試
- javaScript基礎概念小知識點集JavaScript
- 【基礎知識】索引--點陣圖索引索引