CentOS(RHEL)系列操做系統的啓動流程:Intel X86兼容架構c#
Linux的系統組成:內核 + 應用程序 GNU/Linux:單純的指Linux內核緩存
從硬盤存儲和啓動操做系統的角度:安全
Linux的系統組成:內核 + 根文件系統(rootfs)網絡
內核功能:進程管理,文件系統管理,內存管理,網絡協議,驅動程序,安全功能,...架構
Linux系統的系統運行環境能夠分爲兩部分:框架
內核空間:內核代碼(系統調用)ide
就是內核進程佔用的CPU和內存資源的總和;模塊化
用戶空間:應用程序(進程或線程)工具
就是各類存儲於文件系統中的應用程序,在發起爲進程或線程以後,佔據的CPU和內存資源的總和;spa
操做系統內核的設計流派:
單內核設計:
全部的功能所有集中於同一個程序;運行時表現爲一個進程;
Linux就是單內核設計
Linux,咱們不須要他成爲最早進的,咱們只是要使用它;
微內核設計:
每種功能使用一個單獨的子系統來實現;
Windows,Solaris都是微內核設計
Linux內核的特色:
單內核 + 模塊化:內核之中的功能更 + 各個模塊提供的功能之和;
爲了可以提效,會爲速度比較慢的IO設備提供緩衝和緩存;
Linux內核的組成部分:
內核核心文件:
/boot/vmlinuz-VERSION-release
CentOS 5:
/boot/vmlinuz-2.6.18-398.el5
CentOS 6:
/boot/vmlinuz-2.6.32-573.el6.x86_64
CentOS 7:
/boot/vmlinuz-3.10.0-327.el7.x86_64
最新的內核版本:4.17
內核模塊文件:
/lib/modules/KERNEL_VERSION/kernel/
ramdisk:
CentOS 5:
/boot/initrd-2.6.18-398.el5.img
CentOS 6/7:
/boot/initramfs-2.6.32-573.el6.x86_64.img
/boot/initramfs-3.10.0-327.el7.x86_64.img
CentOS 5/6:
生成ramdisk的工具:mkinitrd
CentOS 7:
生成ramdisk的工具:dracut mkinitrd
rd和ramfs:
ramdisk:雙緩衝和雙緩存;
ramfs:提效,避免雙緩衝和雙緩存;
CentOS系列操做系統的啓動流程(2)
基於x86架構兼容平臺研究系統啓動流程;
1.POST:Power-On Self Test,加電自檢;
ROM:Read-Only Memory,只讀存儲器;
CMOS:BIOS,Basic Input and Output System,基本輸入輸出系統;
X86架構的CPU能夠線性尋址的物理存儲空間:ROM + RAM
2.BootSequence:啓動順序
做用:決定到何種硬件設備上加載操做系統;
方式:按照指定的次序查找各個引導設備,第一個被找出有引導程序的設備即爲本次啓動要用到的設備;
BootLoader:引導加載器,程序;
MBR:
Master(Main) Boot Record:
0磁道0扇區:
446Byte: bootloader
64Byte:FAT,File Allocation Table;
2Byte:magic-number,55AA,表示MBR有效;
GPT:
Windows:NTLDR
Linux:
LILO:LInux LOader,有缺陷:不能支持大硬盤;不超過1024柱面;
GRUB:GRand Uniform Bootloader,全球統一引導加載器;
CentOS 6-:
GRUB 0.x:grub legacy
CentOS 7:
GRUB 1.x:grub2
grub提供的功能:
1.爲用戶提供一個菜單,菜單中列舉的是各個能夠啓動的操做系統內核;
2.能夠將用戶選定的內核核心文件裝載到RAM中,解壓縮並展開,將系統控制權移交給內核;
3.交互式的命令行接口;
4.菜單及內核啓動的安全保障;
3.內核:
自身初始化:
1) 探測可以識別到的全部的硬件設備;
2) 加載硬件的驅動程序,有可能會藉助於ramdisk加載驅動;
3) 以只讀的方式掛載根文件系統;
4) 運行用戶空間的第一個應用程序: /sbin/init
4.Init:
Init程序的類型:
CentOS 5:SysV Init
配置文件:/etc/inittab
CentOS 6:Upstart Init
配置文件:/etc/inittab 幾乎被廢棄;
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/*
/etc/systemd/system/*
小結:
系統初始化流程(內核級別)
POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(內核核心文件只能放置在基本分區上) [--> ramdisk] --> rootfs(read-only) --> /sbin/init
CentOS 5的SysV Init的工做過程:
CentOS 5 SysV Init:
運行級別(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 + Delete"組合鍵時,系統將採起什麼行爲;
2.全部規定的任務如何執行;
每一行定義一種操做,格式以下:
id:runlevels:action:process
id:一種操做的惟一標識符;
l#, id, pf, pr, #, x,
runlevel:指定任務執行所依賴的運行級別;
####, #, 留空
action:在何種條件下啓動此任務;
wait:等待切換至此任務所在的運行級別時,運行一次;
respawn:一旦此任務結束,就自動從新啓動此任務;
initdefault:用於設定默認的運行級別,一般後面的process省略
sysinit:設置系統初始化的方式,通常狀況下此處運行/etc/rc.d/rc.sysinit腳本;
powerfail:
powerokwait:
ctrlaltdel:
/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/rc$runlevel.d/*
K*:要中止的服務;K字母后面的兩位數字表示優先級;數字越小優先級越高;依賴其餘服務的服務應該優先關閉,被其餘服務依賴的服務應該稍後關閉;
S*:要啓動的服務;S字母后面的兩位數字表示優先級;數字越小優先級越高;被其餘服務依賴的服務應該優先啓動,依賴其餘服務的服務應該稍後啓動;
rc腳本能夠接受一個運行級別做爲其參數運行內容的;
腳本框架:
for i in /etc/rc.d/rc#.d/K* ; do
$i stop
done
for i in /etc/rc.d/rc#.d/S* ; do
$i start
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 - updates and queries runlevel information for system services
查看系統服務相關運行級別下的運行狀態:
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程序在引導用戶空間進程啓動的過程當中,所執行的最後一個腳本;所以,不便於或不須要寫在系統服務相關的腳本中的內容但又指望能夠開機即運行的功能,能夠直接寫在此腳本中;
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
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程序:upstart,其應用程序依然是/sbin/init,其配置文件:
/etc/inittab:僅僅只是用於定義默認運行級別;
/etc/init/*.conf:
rcS.conf:執行系統初始化腳本的任務;
rc.conf:執行根據運行級別關閉或開啓系統服務的任務;
start-ttys.conf:執行打開終端相關的任務;
prefdm.conf:執行大小圖形界面的任務;
upstart機制:基於事件驅動的程序管理模型;Driven-envet
CentOS 6 系統啓動流程:
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中依然可用;可是,建議使用CentOS7標配的systemctl命令來控制和管理系統服務;
systemctl命令:
systemctl - Control the systemd system and service manager
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