CentOS(RHEL)系列操做系統的啓動流程: Intel X86兼容架構linux
Linux的系統組成: 內核+應用程序(GNU/Linux): 單純的指Linux內核c#
從硬盤存儲和啓動操做系統的角度:緩存
Linux的系統組成: 內核+根文件系統(rootfs)安全
內核功能: 進程管理, 文件系統管理, 內存管理, 網絡協議, 驅動程序, 安全功能, ......bash
Linux系統的系統運行環境能夠分爲兩部分:服務器
內核空間: 內核代碼(系統調用)網絡
就是內核進程佔用的CPU和內存資源的總和;架構
用戶空間: 應用程序(進程或線程)框架
就是各類存儲於文件系統中的應用程序, 在發起爲進程或線程以後, 佔據的CPU和內存資源的總和;socket
操做系統內核的設計流派:
單內核設計:
全部的功能所有幾種於同一個程序; 運行時表現爲一個進程;
Linux就是單內核設計,(緣由: 咱們不須要Linux成爲最早進的, 咱們只是要使用它.)
微內核設計:
每種功能使用一個單獨的子系統來實現;
Windows,Solaris都是微內核設計
Linux內核的特色:
單內核+模塊化: 內核之中的功能+各個模塊提供的功能之和;
爲了可以提效, 會爲速度比較慢的IO設備提供緩衝和緩存;
Linux內核的組成部分:
內核核心文件: /boot/vmlinux-VERSION-release
CentOS5: /boot/vmlinux-2.6.18-398.el5
CentOS6: /boot/vmlinux-2.6.32-573.el6.x86_64
CentOS7: /boot/vmlinux-3.10.0-327.el7.x86_64
最新的內核版本: 4.17
內核模塊文件: /lib/modules/KERNEL_VERSION/kernel/
ramdisk:
CentOS5: /boot/initrd-2.6.18-398.el5.img
CentOS6: /boot/initramfs-2.6.32-573.el6.x86_64.img
ramfs:
CentOS7: /boot/initramfs-3.10.0-327.el7.x86_64.img
生成ramdisk的工具:
CentOS5/6: mkinitrd
CentOS7: dracut mkinitrd
ramdisk和ramfs的區別:
ramdisk:雙緩衝和雙緩存
ramfs:提效, 避免雙緩衝和雙緩存
CentOS系列操做系統的啓動流程(2)
整個系統啓動的流程基本能夠分爲POST-->MBR(GRUB)-->Kernel-->Init-->Runlevel
BIOS(BasicInput/Output System):
基本輸入輸出系統, 改系統存儲於主板的ROM芯片上, 計算機在開機時, 會最早讀取該系統, 而後會有一個加電自檢過程, 這個過程其實就是檢查CPU和內存, 計算機最基本的組成單元(控制器, 運算器和存儲器), 還會檢查其餘硬件, 若沒有異常就開始加載BIOS程序到內存中. BIOS主要的一個功能就是存儲了磁盤的啓動順序, BIOS會按照啓動順序去查找第一個磁盤頭的MBR信息, 並加載和執行MBR中的Bootloader程序, 若第一個磁盤不存在MBR, 則會繼續查找第二個磁盤(PS: 啓動順序能夠在BIOS的界面中進行設置), 一旦BootLoader程序被檢測並加載內存中, BIOS就將控制權交給了BootLoader程序.
MBR(Master BootRecord):
主引導記錄, MBR存儲於磁盤的頭部, 大小爲512bytes, 啓動, 446bytes用於存儲BootLoader程序, 64bytes用於存儲分區表信息, 最後2bytes用於MBR的有效行檢查.
GRUB(GrandUnified Bootloader):
多系統啓動程序, 其執行過程可分爲三個步驟:
Stage1:這個其實就是MBR, 它的主要工做就是查找並加載第二段Bootloader程序(stage2), 但系統在沒啓動時, MBR根本找不到文件系統, 也就找不到stage2所存放的位置, 所以, 就有了stage1_5
Stage1_5:該步驟就是爲了識別文件系統
Stage2:GRUB程序會根據/boot/grub/grub.conf文件查找Kernel的信息, 而後開始加載Kernel程序, 當kernel程序被檢測並加載到內存中, GRUB就將控制權交給Kernel程序.
PS:實際上這個步驟/boot還沒被掛載, GRUB直接識別grub所在磁盤的文件系統, 因此實際上應該是/grub/grub.conf文件, 改配置文件的信息以下:
grub.conf:
#boot=/dev/sda
default=0 #設定默認啓動的title的編號,從0開始
timeout=5 #等待用戶選擇的超時時間
splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖片
hiddenmenu #隱藏菜單
title CentOS (2.6.18-194.el5PAE) #內核標題
root (hd0,0) #內核文件所在的設備
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #內核文件路徑以及傳遞給內核的參數
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路徑
Kernel
內核, Kernel是Linux系統最主要的程序, 實際上, Kernel的文件很小, 只保留了最基本的模塊, 並以壓縮的文件形式存儲在硬盤中, 當GRUB將Kernel讀進內存, 內存開始解壓內核文件. 將內核啓動, 應該先講下initrd這個文件.
initrd(InitialRAM Disk), 它在stage2這個步驟就被拷貝到了內存中, 這個文件實在安裝系統時產生的, 是一個臨時的根文件(rootfs). 由於Kernel爲了精簡, 只保留最基本的模塊, 所以,Kernel上並無各類硬件的驅動程序, 也就沒法識別rootfs所在的設備, 故產生了initrd這個文件, 該文件裝載了必要的驅動模塊, 當Kernel啓動時, 能夠從initrd文件中裝載驅動模塊, 直到掛載真正的rootfs, 而後將initrd從內存中移除.
Kernel會以只讀方式掛載根文件系統, 當根文件系統被掛載後, 開始裝載第一個進程(用戶空間的進程), 執行/sbin/init以後就將控制權交給init程序.
Init
初始化, 該程序就是進行OS初始化操做, 其實是根據/etc/inittab(定義了系統默認運行級別)設定的動做進行腳本的執行, 第一個被執行的腳本爲/etc/rc.d/rc.sysinit, 這個是真正的OS初始化腳本, 簡單講下這個腳本的任務:
1.激活udev和selinux;
2.根據/etc/sysctl.conf文件, 來設定內核參數;
3.設定系統時鐘;
4.裝載硬盤映射;
5.啓動交換分區;
6.設置主機名;
7.根文件系統檢測, 並以讀寫方式從新掛載根文件系統;
8.激活RAID和LVM設備;
9.啓動磁盤配額;
10.根據/etc/fstab, 檢查並掛載其餘文件系統;
11.清理過時的鎖和PID文件;
執行完後, 根據配置的啓動級別, 執行對應目錄底下的腳本, 最後執行/etc/rc.d/rc.local這個腳本, 至此, 系統啓動完成.
Runlevel
runlevel,運行級別, 不一樣的級別會啓動的服務不同, init會根據定義的級別去執行相應目錄下的腳本, Linux的啓動級別分爲如下幾種:
0: 關機
1: 單一用戶模式(直接以管理員身份進入)
2:多用戶模式(無網絡)
3:多用戶模式(命令行)
4:保留
5:多用戶模式(圖形界面)
6: 重啓
在不一樣的運行級別下, /etc/rc.d/rc這個腳本會分別執行不一樣目錄下的腳本
Runlevel 0 - /etc/rc.d/rc0.d/
Runlevel 1 - /etc/rc.d/rc1.d/
Runlevel 2 - /etc/rc.d/rc2.d/
Runlevel 3 - /etc/rc.d/rc3.d/
Runlevel 4 - /etc/rc.d/rc4.d/
Runlevel 5 - /etc/rc.d/rc5.d/
Runlevel 6 - /etc/rc.d/rc6.d/
這寫目錄下的腳本只有K*和S*開頭的文件, K開頭的文件爲開機須要執行關閉的服務, S開頭的文件爲開機須要執行開啓的服務.
CentOS 5的SysV Init的工做過程:
CentOS 5 SysVInit:
運行級別(run level): 爲了系統的運行或維護等目的而設置的管理機制;
0-6:七個運行級別:
#0 - 關機, halt, shutdown
# 1 - 單用戶模式(Single user mode), root, 無需驗證; 維護模式;
#2 - 多用戶模式(Multiuser), 會啓動網絡功能; 但不會啓動NFS, 維護模式;
#3 - 多用戶模式(Full multiuser mode), 徹底的功能模式), 僅使用CLI, 不激活GUI;
#4 - 預留級別, 目前無特別使用的目的; 可是習慣上認爲與3運行級別相同;
#5 - 多用戶模式(Full multiuser mode), 徹底的功能模式, 默認激活GUI和CLI, 默認使用的是GUI;
#6 - 重啓, reboot
一般會使用3, 5運行級別做爲這次系統啓動的默認運行級別;
查看當前系統的運行級別:
who-r
runlevel
切換運行級別:
init[0-6]
Init的配置文件: /etc/inittab, 此配置文件有以下功能:
1.在整個系統初始化的過程當中要作哪些任務;
啓動或關閉哪些後臺服務;
如何進行系統初始化;
在驗證用戶的身份無誤以後, 如何爲用戶提供登錄提示符, 還要區分是圖形界面仍是文件界面;
當備用電源失效或從新生效時, 如何指揮系統操做;
定義了按下"Ctrl+Alt+Del"組合鍵時, 系統將採起什麼行爲;
2.全部規定的任務如何執行;
每一行定義一種操做, 格式以下:
id:runlevels:action:process
id:一種操做的惟一標識符;
1#,id, pf, pr, #, x,
runlevels:指定任務執行所依賴的運行級別;
####,#, 留空
action: 在何種條件下啓動此任務;
wait:等待切換至此任務所在的運行級別時, 運行一次;
respawn:一旦此任務結束, 就自動從新啓動此任務;
initdefault:用於設定默認的運行級別, 一般後面的process省略
sysinit:設置系統初始化的方式, 通常狀況下此處運行/etc/rc.d/rc.sysinit腳本
/etc/rc.d/rc.sysinit, 此文件的功能以下:
1.設置主機名稱;
2.設置啓動的歡迎信息;
3.激活udev和SELinux
4.掛載/etc/fstab文件中定義的全部有效文件;
5.激活各個swap設備;
6.檢測rootfs, 而且以讀寫的方式從新掛載rootfs;
7.設置系統時間;
8.根據/etc/sysctl.conf文件設置內核參數;
9.激活lvm和軟RAID等高級邏輯設備;
10.加載額外的設備的驅動程序;
11.完成清理工做;
/etc/rc.d/rc,此文件的功能以下:
根據特定的運行級別, 啓動或關閉/etc/rc.d/rd$runlevel.d/*
K*:要中止的服務; K字母后面的兩位數字表示優先級; 數字越小優先級越高; 依賴其餘服務的服務應該優先關閉, 被其餘服務依賴的服務應該稍後關閉;
S*:要啓動的服務; S字母后面的兩位數字表示優先級; 數字越小優先級越高; 被其餘服務依賴的服務應該優先啓動, 依賴其餘服務的服務應該稍後啓動;
rc腳本能夠接受一個運行級別做爲其參數運行內容的;
其腳本框架:
fori in /etc/rc.d/rc#.d/K* ; do $istop done fori in /etc/rc.d/rc#.d/S* ; do $istart done
全部由rc腳本關閉或啓動的連接文件的源文件都存在於/etc/rc.d/init.d, 系統爲了方便使用, 爲此目錄建立了連接/etc/init.d
全部/etc/init.d(/etc/rc.d/init.d)目錄中的腳本執行方式:
#/etc/init.d/SRV_SCRIPT {start|stop|restart|status}
#service SRV_SCRIPT {start|stop|restart|status}
chkconfig命令: 查看系統服務相關運行級別下的運行狀態;
格式: chkconfig --list [name]
管理系統服務在/etc/rc.d/rc#.d/目錄下的服務腳本的連接:
chkconfig--add name
chkconfig--del name
爲了可以讓chkconfig命令管理系統服務的腳本的連接, 每一個腳本中都必須有這樣的格式:
#chkconfig: 2345 90 60
2345:在哪一個運行級別下, 此服務是自動啓動狀態; 也就是說, 在對應的運行級別的rc#.d目錄中, 是以S開頭的文件; 若是該位置爲"-", 則表示全部運行級別都爲K開頭的;
90:若是在某個運行級別下爲開啓狀態, 該數字爲S後面的優先級數字;
60:若是在某個運行級別下爲中止狀態, 該數字爲K後面的優先級數字;
#description: 對於此係統服務的摘要性描述信息;
單獨設置指定運行級別下系統服務的自動啓動或關閉的狀態:
chkconfig[--level levels] name <on|off|reset>
/etc/rc.d/rc.local腳本的功能:
它是init程序在引導用戶空間進程啓動的過程當中, 所執行的最後一個腳本; 所以, 以便於或不須要寫在系統服務相關的腳本中的內容但又指望能夠開機即運行的功能, 能夠直接卸載此腳本中;
/etc/inittab的文件的第二部分:
#Run gettys in standard runlevels
1:2345:respawn:/sbin/mingettytty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingettytty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingettytty6
mingetty會調用login程序, 打開虛擬終端; 除了mingetty以外, 諸如getty之類的程序也能夠生成虛擬終端控制檯;
若是默認的運行級別是5, 則咱們須要/etc/x11/prefdm腳本打開圖形界面終端; 操做以下:
X6R11- X Version 6 Release 11
小結:(用戶空間的啓動流程), /sbin/init
/sbin/init--> /etc/inittab --> 設置默認運行級別 --> /etc/rc.d/rc.sysinit腳本, 完成系統初始化 -->關閉那些對應運行級別下須要中止的服務, 啓動那些對應運行級別下須要開啓的服務 --> Ctrl+Alt+Del熱鍵功能 --> UPS電源的失效與恢復以後的操做 --> 生成終端[啓動圖形界面]
CentOS 6:
Init程序: uupstart, 其應用程序依然是/sbin/init, 其配置文件:
/etc/inittab:僅僅只是用於定義默認運行級別:
/etc/init/*.conf:
rcS.conf:執行系統初始化腳本的任務;
rc.conf:執行根據運行級別關閉或開啓系統服務的任務;
start-ttys.conf:執行打開終端相關的任務;
prefdm.conf:執行打開圖形界面的任務;
upstart機制: 基於事件驅動的程序管理模型: Driven-envet
系統的啓動流程:
POST--> BootSequence(BIOS) --> Bootloader --> kernel [--> ramfs] -->rootfs(ro) --> /sbin/init --> 設定默認運行級別 --> 系統初始化 --> 能夠並行執行Ctrl+Alt+del熱鍵功能定義, 系統服務的開啓和關閉, 電源管理, dbus管理等 --> 登錄提示符
CentOS 7:
Init程序: Systemd, 與經典的Init程序徹底不一樣: 其配置文件:
/etc/systemd/system/*
/usr/lib/systemd/system/*:systemd的UNIT文件;
/etc/inittab: 已廢除;
systemd徹底兼容SysV分格的Init程序及其腳本; 所以, service類的命令在CentOS7中依然可用; 可是, 建議使用CentOS 7標配的systemctl命令來控制和管理系統服務;
systemctl命令: 該系統和服務系統的管理控制
格式: systemctl [OPTIONS...] COMMAND [NAME...]
使用systemctl管理服務的通常方式:
~]#systemctl {start|stop|restart|status} name[.service]
設置CentOS 7的默認運行級別:
~]#systemctl set-default {multi-user.target | graphical.target}
查看CentOS 7的默認運行級別:
~]#systemctl get-default
Bootloader:
GRUB: GRandUniform Bootloader, 通用統一引導加載器;
grub0.x: grub legacy
grub1.x: grub2
grub legacy:
1ststage: stage1, MBR的前446Bytes;
1.5stage: stage1_5, MBR以後的若干個扇區中; 讓stage1中的bootloader程序可以識別stage2所在額分區的文件系統;
2ndstage: stage2, 磁盤的啓動分區;
注意: stage2及內核核心文件必須放置在同一個基本磁盤分區上;
stage2提供的功能:
1.加載操做系統內核核心文件;
2.提供一個菜單和交互接口;
3.容許用戶編輯菜單內容;
4.命令行接口操做模式;
5.身份認證機制, 以保證菜單編輯和內核啓動的安全;
grub的命令行界面:
提示符: grub>
grub的命令行界面中的經常使用命令:
help:獲取全部的grub命令的名稱列表和簡要使用方法;
helpGRUB_CMD: 顯示特定命令的詳細幫助信息;
root(hd#,#): 將指定磁盤的指定分區做爲grub程序的根設備;
hd#:磁盤編號, #通常是從0開始的數字; 如hd0表示第一塊磁盤;
#:分區編號, #通常也是從0開始的數字, 如0拜師第一個分區;
示例: (hd0,0): 當前計算機上的第一塊磁盤的第一個分區;
find(hd#,#): 從指定的分區中搜索文件, 並顯示出文件所在位置;
kernel/PATH/TO/KERNEL_CORE_FILE: 設定本次啓動時用到的內核文件的絕對路徑; 額外還能夠在kernel 命令中, 爲內核啓動添加更多的內核參數;
roroot=/dev/sda3 selinux=0 init=/sbin/init(/bin/bash) quiet rhgb {1|s|S|single}
initrd/PATH/TO/initramfs-VERSION-release.img
grub的配置文件:
/boot/grub/grub.conf
/etc/grub.conf:連接文件, 連接到/boot/grub/grub.conf
其文件內容:
default=0 #設定默認菜單項;整個菜單中的全部的title是從0開始編號的;
timeout=5 #等待用戶作出選擇的時間;若用戶不作選擇,grub會自動引導默認菜單項;
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #grub的背景圖片對應的路徑;
hiddenmenu #隱藏grub的啓動菜單
passwordd --md5 CRYPTED_PASSWOED #爲保護菜單設置的密碼, 一般用於防止隨意進入單用戶模式;
title CentOS 6 (2.6.32-573.el6.x86_64) #菜單項中的"標題"
root (hd0,0) #指定grub的根設備, 一般是用來安裝grub的那個分區;
kernel/vmlinuz-2.6.32-573.el6.x86_64.img #內核所對應的ramdisk(ramfs)文件
password --md5 CRYPTED_PASSWORD #保護操做系統內核的啓動;
Systemd:
Systemd的新特性:
1.在系統引導的時候能夠實現服務的並行啓動;
2.可以實現按需激活進程; 在系統啓動時, 須要隨系統啓動服務, 其服務進程並無啓動, 可是Systemd爲每個此類服務進程都註冊了對應的套接字; 咱們稱這種服務處理方式爲"半激活狀態";
3.可以對當前系統的用戶空間的每一個進程進行狀態快照; 之後若是進程出現問題或故障, 能夠迅速恢復進程狀態至過去的某一時刻;
4.systemd內部有一種基於依賴關係來定義的服務控制邏輯;
核心管理概念: unit文件
由systemd相關的配置文件進行標識, 識別和配置功能的實現的基礎;
unit的文件分類: 系統服務類 socket 目標類快照類 ......
其配置文件:
/usr/lib/systemd/system/*:主要的配置文件
/etc/systemd/system/*:符號連接文件, 連接到/usr/lib/systemd/system/*
/run/systemd/system/*:非配置關鍵項
Unit文件的常見類型:
Serviceunit: 文件的擴展名爲.service, 用於定義系統服務, 通常.service擴展名能夠省略;
Targetunit: 文件的擴展名爲.target, 用於模擬實現"init程序的運行級別";
Deviceunit: 文件的擴展名爲.device, 用於定義內核識別出來的各設備;
Mountunit: 文件的擴展名爲.mount, 用於定義能夠被systemd管理的文件系統的掛載點;
Automountunit: 文件的擴展名爲.automount, 用於定義文件系統自動掛載點的位置;
Socketunit: 文件的擴展名爲.socket, 用於標識進程間通訊所用到的socket文件;
Swapunit: 文件的擴展名爲.swap, 用於標識swap設備;
Pathunit: 文件的擴展名爲.path, 用於監控指定目錄中的一個文件或一個子目錄; 若是被監控的文件或目錄不存在, 則systemd能夠自動建立;
systemd特性的實現方式:
1.基於socket unit的方式實現進程激活機制;
2.基於device unit的方式實現設備的自動識別, 掛載;
3.基於bus的激活機制;
4.基於path的激活機制;
systemd的兼容和不兼容:
兼容: SysV init的腳本;
不兼容: 不準使用systemctl命令來管理系統, systemctl命令的格式是固定不變的; 全部不經由systemd啓動的系統服務或系統功能, systemctl命令沒法與之直接通訊, 也就覺得此類服務或功能沒法經過systemctl來控制;
systemctl命令: 系統和服務系統的管理控制
格式: systemctl [OPTIONS...] COMMAND [NAME...]
管理服務類的操做:
啓動: service NAME start ==> systemctlstart NAME[.service]
中止: service NAME stop ==> systemctl stopNAME[.service]
重啓: service NAME restart ==> systemctlrestart NAME[.service]
狀態: service NAME status ==> systemctlstatus NAME[.service]
設置服務的開機自啓: chkconfig --level runlevels NAME on==> systemctl enable NAME[.service]
禁止服務的開機自啓: chkconfig --level runlevels NAME off==> systemctl disable NAME[.service]
查看某服務是否開機自啓: chkconfig --list NAME ==> systemctlis-enabled NAME.service
條件式重啓: service NAME condrestart ==>systemctl try-restart NAME.service
重載或重啓: systemctl reload-or-restartNAME[.service]
重載或條件式重啓: systemctl reload-or-try-restartNAME[.service]
查看某服務當前是否處於激活狀態: systemctl is-active NAME[.service]
查看全部已處於激活狀態的服務: systemctl list-units
--type=UNITTYPE: 查看指定unit類型和處於活躍狀態的服務;
--all:顯示全部, 包括處於活躍狀態和處於非活躍狀態的各服務;
查看依賴指定服務的其餘服服務: systemctl list-dependencies NAME[.service]
禁止某服務被設定爲開機自啓: systemctl mask NAME[.service]
取消禁止某服務被設定爲開機自啓: systemctl unmask NAME[.service]
管理target unit:
爲兼容init的運行級別, systemd中模擬了運行級別:
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
5==> runlevel5.target, graphical.target
6==> runlevel6.target, shutdown.target
運行級別間切換: init # ==> systemctl isolateNAME.tartet
注意: 不是全部的target都能使用上述命令進行級別切換的; 只有那些在對應的unit文件中包含了AllowIsolate=yes的語法的target才能用於切換;
修改了unit文件以後, 須要經過命令才能使之生效: # systemctl daemon-reload
查看運行級別: runlevel ==> systemctl list-units--type=target --all
查看默認運行級別: /etc/inittab(id:3:initdefault:) ==>systemctl get-default
修改默認運行級別: /etc/inittab(id:3:initdefault:) ==>systemctl set-default NAME.target
rescue.target:緊急救援模式
切換命令: systemctl isolate rescue.target
systemctlrescue
emergency.target:緊急調試模式
切換模式: systemctl emergency
rescue模式, 至關於安全模式, 在切換到此模式時, 操做系統會運行最底層的驅動程序, 以保證服務器能夠運行起來;
emergency模式: 通常來講, 一般是硬件故障, 或者硬件不可識別, 或者硬件可識別但不可用等關乎於計算機設施的問題, 一般系統會啓動emergency模式;
除上述模式以外,傳統的init命令, shutdonw命令, poweroff命令, halt命令, reboot命令其實都是systemctl的符號連接;
可使用systemctl命令來直接實現上述功能:
關機: systemctl halt, systemctl poweroff
重啓: systemctl reboot
掛起: systemctl suspend
休眠(進程快照): systemctl hibernate
掛起並休眠: systemctl hybrid-sleep
Service unit file的基本文件格式:
/etc/systemd/system:存放的都是各個unit file的符號連接;
/usr/lib/systemd/system:主要的存放路徑
若是自行編寫unit file, 能夠直接將文件放置於/etc/systemd/system目錄中; 也能夠將其放在/usr/bib/systemd/system目錄中, 可是須要爲其提供一個符號連接文件放置於/etc/systemd/system目錄中;
Serviceunit file文件的基本格式:
此類unit file一般分爲三段:
[Unit]:定義與Unit類型無關的通用選項; 用於提供當前unit的描述信息, unit的行爲信息, unit的依賴關係, unit相關幫助文檔信息等;
經常使用的選項語句:
Description:定義了相關服務的描述信息; 意義性的介紹性的描述;
After:定義了此服務在啓動前必須依賴的其餘服務;
Before:定義了依賴此服務啓動的其餘服務;
Wants:指明依賴關係, 說明該服務依賴於哪些其餘的unit; 弱依賴, 即便被依賴的服務並無被正確激活, 也不會影響當前服務是否能夠被激活;
Requires:指明依賴關係, 說明該服務依賴於哪些其餘的unit; 強依賴關係, 只要被依賴的unit沒法被正確激活, 則當前服務必定沒法激活;
Conflict:定義了各unit之間可能存在衝突;
Documentation:定義了跟當前unit相關的管理命令的文檔所在;
[Service]:定義與系統服務相關的專用的選項語句;
經常使用的選項語句:
Type:用於定義影響ExecStart即相關參數的功能的unit進程的啓動類型;
simple:默認值, 表示由ExecStart語句指明的應用程序啓動的進程就是主進程;
forking:複製自身, 表示有ExecStart語句指明的應用程序所啓動的進程中衆多的子進程中一個將成爲主進程, 而一旦啓動完成, 父進程會退出;
oneshot:一次性進程, 功能相似於simple, 在啓動後續的unit以前, 主進程會退出;
notify:功能相似於simple, 可是其後續的unit僅在經過sd_notifu()函數發送通知以後, 纔會運行ExecStart所指明的應用程序;
EnvironmentFile:環境配置文件, 此文件通常用於在ExecStart以前被讀取, 併爲ExecStart執行後面的應用程序提供必要的變量以及其餘自定義功能等;
ExecStart:指明啓動服務所須要運行的命令或腳本;
ExecReload:指明重載配置文件所須要運行的命令或腳本;
ExecStop:指明中止服務所須要運行的命令或腳本;
ExecStartPre:指明在執行ExecStart指明的命令以前須要運行的命令或腳本;
ExecStartPost:指明在執行ExecStart指明的命令以後須要運行的命令或腳本;
Restart:表示若是服務遭遇有意外而終止, 則會自動重啓該服務;
[Install]:定義由"systemctlenable"和"systemctl disable"命令在實現服務啓動或禁用時用到的專用選項語句;
WantedBy:弱依賴關係, 指的是該服務被哪些其餘units所依賴;
RequiredBy:強依賴關係, 指的是該服務被哪些其餘units所依賴;
CentOS 7系統引導過程:
1.POST
2.選擇啓動設備, 讀取引導程序
3.裝載引導程序(CentOS 7使用的grub2)
4.裝載引導程序的配置文件: /etc/grub.d/, /etc/default/grub,/boot/grub2/grub.cfg
5.加載initramfs驅動模塊
6.加載內核
7.內核以只讀方式掛載rootfs, 啓動systemd進程;
8.執行initrd-*.target全部的unit, 包括掛載/etc/fstab文件中全部有效的文件系統;
9.根切換
10.systemd執行默認的target