Linux系統的組成部分
1、動態視角:內核+根文件系統
2、靜態視角:磁盤分區+文件
Linux運行中的系統環境
1、用戶空間:應用程序(進程或線程)
2、內核空間:內核代碼(系統調用)
內核設計流派:
*單內核設計:把所有功能集成于同一個程序,如:Linux
*微內核設計:每種功能使用一個單獨的子系統實現,如:windows
Linux內核特點
1、支持模塊化:.ko(kernel object)
2、支持模塊運行時動態裝載或卸載
Linux內核的組成
1、核心文件:/boot/vmlinu-VERSION-release
2、ramdisk:中間臨時根文件系統,動態創建出來的,使用緩沖和緩存來加速對磁盤上的文件訪問
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6、7:/boot/initramfs-VERSION-release.img
3、模塊文件:/lib/modules/VERSION-release
CentOS系統初始化流程(內核級別)
POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab)
第一步、POST:加電自檢,檢查硬件設備是否存在
1、用于實現POST的代碼在主板上ROM(CMOS)芯片上。
2、主板上的ROM(CMOS):主板上的一塊可讀寫的并行或串行FLASH芯片,是用來保存BIOS的硬件配置和用戶對某些參數的設定。(BIOS設置程序一般都被廠商整合在芯片中,因此BIOS設置有時也被叫做CMOS設置)
第二步、Boot Sequence:按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備
BIOS:Basic Input Output System,基本輸入輸出系統。它保存著計算機最重要的基本輸入輸出的程序、開機后自檢程序和系統自啟動程序,從CMOS中讀寫系統設置的具體信息。 其主要功能是為計算機提供最底層的、最直接的硬件設置和控制
第三步、BootLoader:引導加載器,程序
提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核。
*Windows上的引導加載器:ntloader
*Linux上的引導加載器:
LILO:短小精悍的linux加載器,1024柱面之后無法加載,現在多用于安卓手機啟動。
GRUB:GRand Unified Bootloader,統一引導加載器
GRUB 0.X(CentOS 5/6):Grub Legacy
GRUB 1.X(CentOS 7)::Grub2,完全重寫,設計理念上很大改變
MBR:Master Boot Record,主引導記錄
ext系列及GPT系列的文件系統的bootloader都在MBR中的前446個字節,MBR為該磁盤的第一個扇區(1st stage),共512字節。
MBR的組成:512bytes
446bytes:bootloader
46bytes:fat(GPT文件系統中不同)
2bytes:55AA(分區表有效性標識)
GRUP引導階段:
這時候就可以看到我們的Centos系統了,但是一般都不需要操作,會自動啟動系統。其實我們也可以自己手動啟動系統的。
加載運行GRUB共可分為三步:
1、bootloader:1st stage,位于MBR中,為了引導2nd stage。
2、Partition:filesystem driver,1.5stage,mbr之后的扇區,讓stage1中的bootloader能識別stage2所在在分區上的文件系統。
3、Partition:/boot/grub,2nd stage,位于boot基本磁盤分區中,GRUB的引導程序。
stage2及內核等通常放置于一個基本磁盤分區
功用:
?。?)提供菜單、并提供交互式接口
e:編輯模式,用于編輯菜單
c:命令模式,交互式接口
?。?)加載用戶選擇的內核或操作系統
運行傳遞參數給內核
可隱藏此菜單
(3)為菜單提供了保護機制
為編輯菜單進行認真
為啟用內核或操作系統進行認證
如何識別設備:
(hd#,#)
hd#:磁盤編號,用數字表示,從0開始編號
#:分區編號,用數字表示,從0開始編號
grub的命令行接口:
e:編輯模式,用于編輯菜單 c:命令模式,交互式接口 常用命令: help:獲取幫助列表 help KEYWORD:詳細幫助信息 find(hd#,#)/PATH/TO/SOMEFILE root(hd#,#) kernel /PATH/TO/SOMEFILE:設定本次啟動時用到的內核文件,額外還可以添加許多內核支持使用的cmdline參數 例如:init=/path/to/init,selinux=0 initrd /PATH/TO/INITRAMFS_FILE:設定為選定的內核提供額外文件的randisk boot:引導啟動選定的內核
手動在grub命令行接口啟動系統:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/boot/grub/grub.conf
配置項: default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始; timeout=#:指定菜單項等待選項選擇的時長; splashimage=(hd#,#)/PATH/TO/XPMPICFILE:指明菜單背景圖片文件路徑; hiddenmenu:隱藏菜單; password [--md5] STRING: 菜單編輯認證; title TITLE:定義菜單項“標題”, 可出現多次;用來引導多個內核或者操作系統 root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”; kernel /PATH/TO/VMLINUZFILE [PARAMETERS]:啟動的內核 initrd /PATH/TO/INITRAMFSFILE: 內核匹配的ramfs文件;
第四步、kernel(ramdisk),加載內核
內核會自身初始化:
探測可識別到的所有硬件設備
加載硬件驅動程序(有可能會借助于ramdisk加載驅動)
以只讀方式掛載根文件系統
運行用戶空間的第一個應用程序:/sbin/init
ramdisk:
*Linux內核的特性之一:使用緩存和緩存來加速對磁盤上的文件訪問
*輔助性文件,并非必須,這取決于內核是否能直接去的rootfs所在的設備
目標設備驅動,例如SCSI設備的驅動
邏輯設備驅動,例如LVM設備的驅動
文件系統,例如xfs文件系統
*ramdisk是一個簡裝版的根文件系統
用戶空間的啟動流程,/sbin/init(/etc/inittab)
設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務–>設置登錄終端[–>啟動圖形終端]
init程序的類型:
CentOS 5-:SysV init
配置文件:/etc/inittab
CentOS 6:Upstart
配置文件:/etc/inittab
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/
/etc.systemd/system/
第五步、設置默認運行級別
運行級別:為了系統的運行或維護等目的而設定的機制
0-6:7個級別
0:關機,shutdown
1:單用戶模式(single user),root用戶無需認證,維護模式
2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS,維護模式
3:多用戶模式(multti user),完全功能模式,文本界面
4:預留級別,目前無特別使用目的,但習慣以同3級別功能使用
5:多用戶模式(multti user),完全功能模式,圖形界面
6:重啟,reboot
默認級別:3,5
級別切換:init #
級別查看:who -r ,runlevel
第六步、系統初始化
內核加載完畢,會運行init程序,init進程起來后,系統啟動的控制權移交給init進程
/sbin/init進程是所有進程的父進程,當init起來之后,它首先會讀取配置文件/etc/inittab,進行以下工作:
1.執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此系統基本算運行起來了,后面需要進行運行級別的確定及相應服務的啟動;
2.確定啟動后進入的運行級別;
3.執行/etc/rc.d/rc,該文件定義了服務啟動的順序是先K后S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d下的相應文件。
4.有關key sequence的設置
5.有關UPS的腳本定義
6.啟動虛擬終端/sbin/mingetty
7.在運行級別5上運行X
配置文件:/etc/inittab
每行定義一直action以及與之對應的process id:runlevels:action:process id:一個任務的標識符 runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別 action:在什么條件下啟動此任務 process:任務 action: wait:等待切換至此任務所在的級別時執行一次 respawn:一旦此任務終止,就自動重新啟動之 initdefault:設定默認運行級別,此時,process省略 sysinit:設定系統初始化方式,此處一般為指定/etc/re.d/rc.sysinit腳本 例如: id:3initdefault: si::sysinit:/etc/re.d/rc.sysinit (設定系統初始化方式) l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 (等到運行級別為1時啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制服務) ... l6:6:wait:/etc/rc.d/rc 6
系統初始化腳本:/etc/rc.d/rc.sysinit
功能:
?。?)設置主機名
?。?)設置歡迎信息
?。?)激活udev和selinux
?。?)掛載/etc/fstab文件中定義的所有文件系統
?。?)檢測根文件系統,并以大寫方式重新掛載根文件系統
?。?)設置系統時鐘
(8)激活lvm及軟raid設備
?。?)激活swap設備
?。?0)掛載額外設備的驅動程序
?。?1)清理操作
第七步、關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務
在CentOS 5和6中,系統服務都被設計為一個單獨的服務腳本,可以通過運行這些腳本來管理系統服務。在/etc/rc.d/目錄下面有7個rc#.d格式的子目錄(#為0-6的整數,對應著七個系統運行級別)
rc腳本:接受一個運行級別數字為參數
腳本框架: for srv in /etc/re.c/rc#.d/K*,do $srv stop done for srv in /etc/re.c/rc#.d/K*,do $srv start done K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉,依賴的服務先關閉,然后關閉被依賴的 S*要啟動的服務;S##*,優先級,數字越小越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動 /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命令:管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態
查看:chkconfig –list [name]
添加:chkconfig –add name
刪除:chkconfig –del name
修改指定的鏈接類型:
chkconfig [–level LEVELS] name <on|off|reset>
–level LEVELS]:指定要控制的級別,默認為2345
注:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至/etc/rc.d/rc.local(/etc/rc.local)腳本,因此,不變或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。
第八步:啟動終端
讀取/etc/init/start-ttys.conf這個配置文件,完成啟動終端的流程。其中會判定,如果運行級別為5的話,在啟動tty1-6之后會再啟動圖像終端。
總結:系統啟動流程
POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab) –> 設置默認運行級別 –> 運行系統初始化腳本,完成系統初始化 –> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 –> 設置登錄終端[–>啟動圖形終端]
原創文章,作者:641348038@qq.com,如若轉載,請注明出處:http://www.www58058.com/65225