Linux系統組成
從動態視角看:由內核+根文件系統組成
從靜態視角看:由磁盤分區及相關文件組成
內核設計流派
單內核:所有內核功能集中于同一程序;
微內核:每種功能使用一個單獨的子系統實現;內核中某一模塊或功能的破壞不會影響其他功能的正常運行。
linux內核特點
支持模塊化:模塊文件.ko結尾(kernel object)
支持模塊運行時動態裝載或卸載:
linux內核組成部分
核心文件:/boot/vmlinuz-Version-release
模塊文件:/lib/modules/Version-Release
內核啟動之后,讀取rootfs文件系統生成的init程序,由init管理系統。之后內核退居幕后,只負責特權級操作。
ramdisk:把內存中的某段空間當作磁盤來使用。"偽根文件系統"
CentOS5:/boot/initrd-Version-release.img
CentOS6、7:/boot/initramfs-Version-release.img
CentOS啟動流程:
一、內核空間
1、POST加電自檢:對各硬件進行檢測,確保計算機能正常運行
CPU訪問ROM加載自檢程序
2、BOOT Sequence:選擇啟動次序,加載Boot Loader。
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備。
3、Boot Loader: 加載Grub。
由于存放Bootloader的磁盤空間大小僅為446字節,而grub的大小明顯超出446字節,因此,將grub分為三個階段。Bootloader僅存放grub的第一階段,用于引導。
GRUB功能:提供菜單,運行用戶選擇要啟動的系統或不同版本,把用戶選定的內核裝載到RAM中,解壓、展開,而后把系統的控制權移交給內核。
GRUB三階段:
stage1:BootLoader(位于MBR)。
stage1.5:存放文件系統驅動信息,位于MBR之后,用于引導stage1找到stage2,從而能夠訪問stage2所在的分區。
stage2:位于/boot/grub目錄下。
stage2的功用:
1)提供菜單、并提供交互式節后
摁e:進入編輯模式,用于編輯菜單
摁c:進入命令模式,交互式接口
2)加載用戶選擇的內核或操作系統
運行傳遞參數給內核
可隱藏菜單
3)位菜單提供保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
GRUB分類:
Windows:ntloader
Linux:
LILO:Linux Loader。缺陷:不能加載1024之后的柱面,因此被grub取代。
GRUB:GRand Uniform Bootloader
CentOS5、6 :Grub 0.x 版本,也稱之為grub legacy
CentOS7:Grub 1.x版本,也稱之為Grub2
GRUB存放于/boot中,配置文件為/boot/grub/grub.conf,在/etc/目錄下有一名為grub.conf的連接文件。
4、kernel階段
1)自身初始化
2)探測可識別到的所有硬件設備
3)加載硬件驅動程序(可能借助ramdisk來加載)
4)以只讀方式掛載根文件系統
5)運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
CentOS5及之前:SysV
配置文件:/etc/inittab
CentOS6:upstart
配置文件:/etc/inittab(為了兼容以前的版本),/etc/init/*.conf
CentOS7:Systemd
配置文件:/usr/lib/systemd/system;/etc/systemd/system
二、用戶空間
5、/etc/inittab配置文件:
每行定義一種action以及與之相對應的process,配置釋義:
id:runlevels:action:process
id:一個任務的標識符
runleves:在哪些級別啟動此任務,#,###;也可以為空,表示所有級別
action:在什么條件下啟動此任務
process:任務
action:
wait:等待切換至此任務所在的級別時執行一次。
respawn:一旦此任務終止,就自動重啟之。
initdefault:設置默認允許級別,此時,process省略掉
id:3:initdefault #設置默認級別
si:sysinit:/etc/rc.d/rc.sysinit #設定系統初始化方式,此處一般為指定的/etc/rc.d/rc.sysinit腳本
tty1:2345:respawn:/usr/bin/mingetty tty1
tty2:2345:respawn:/usr/bin/mingetty tty2
….
tty6:2345:respawn:/usr/bin/mingetty tty6
在運行級別為2345時,會默認開啟6個虛擬終端
1)mingetty會調用login程序
2)getty等程序也能打開虛擬終端。
tty7:5:respawn:/etc/x11/ 啟動圖形界面
l0:0:wait:/etc/rc.d/rc 0
rc腳本:接受一個運行級別數字為參數。當系統啟動時讀取到默認運行級別、或運行級別發生變化時,/etc/rc.d/rc腳本將傳遞運行級別為參數,在/etc/rc.d/rc$runlevel.d/目錄下進行操作:其將先kill掉以K開頭的服務或腳本,然后啟動運行以S開頭的服務或腳本。這些腳本為/etc/rc.d/init.d/或/etc/init.d目錄下某腳本的連接文件(Symbolinc)
例:l3:3:wait:/etc/rc.d/rc 3 意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的腳本所控制范圍。
K##*:要停止的服務;##表示優先級,數字越小,越優先關閉;依賴的服務先關閉,而后關閉被依賴。服務a的運行建立在服務b運行的基礎上,那么要關掉服務b,得先關掉服務a;意味著服務a的關閉優先級要高于服務b(即a的關閉優先級數字小b的)
S##*:要啟動的服務;##表示優先級,數字越小,越優先啟動;被依賴的服務先啟動,而依賴的服務后啟動。仍以服務a的運行建立在服務b的基礎上為例,要運行服務a,則服務b得先啟動,意味著服務b的啟動優先級要高級服務a(即b的啟動優先級數字小于a的)
rc腳本框架:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
/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/下的每個腳本在各運行級別下的啟動或關閉狀態。
設置某服務在某個或某幾個運行級別下是自動啟動還是關閉。
將服務增加為自啟動服務的過程
1)創建建自定義服務腳本
2)初始化自定義服務:chkconfig –add srv_script
3)設置啟動|關閉級別:chkconfig –level ### srv_script on|off,如果chkconfig設置時不指定運行級別,默認采用腳本中設置的運行級別。
4)啟動或關閉服務:chkconfig srv_script on|off
5)查看服務運行信息:chkconfig –list srv_script
注:能被管控的服務腳本必須具備以下的特性。
#!/bin/bash # # chkconfig: runlevel start_nn stop_nn 設置運行級別、服務啟動優先級、范圍關閉優先級。 #自定義的腳本服務,若不被其他服務依賴,則其啟動應該盡量延后,等待系統其他服務啟動,關閉時優先關閉 # # description: some comments 腳本注釋
注:如果將運行級別設置為‘-’,則在初始化時在所有級別都將關閉。
附:testsrv腳本內容
#!/bin/bash # # testsrv start|stop service testsrv # # chkconfig: 2345 90 20 # description: for test chkconfig how to work prog=`basename $0` if [ $# -lt 1 ];then echo "Usage:$prog {sart|stop|restart|status}" exit 1 fi case $1 in start) echo "startting $prog" ;; stop) echo "stopped $prog" ;; restart) echo "restart $prog finished" ;; status) if pidof $prog &> /dev/null;then echo "$prog is running" else echo "$prog was stopped" fi ;; *) echo "Usage:$prog {sart|stop|restart|status}" exit 2 ;; esac
注:正常級別下,最后啟動的一個服務S99local服務鏈接至/etc/rc.d/rc.local(/etc/rc.local)文件。不便寫成腳本的指令可以寫入到/etc/rc.d/rc.local文件中。
6、系統初始化腳本文件:/etc/rc.d/rc.sysinit
(1)設置主機名
(2)設置歡迎信息
(3)激活udev設備和selinux
(4)掛載/etc/fstab文件中定義的所有文件系統(包含swap設備)
(5)檢測根文件系統,并以讀寫方式重新掛載根文件系統。
(6)設置系統時鐘
(7)根據/etc/sysctl.conf文件的設定,來設置內核參數
(8)激活LVM及軟raid設備
(9)激活swap設備
(10)加載額外設備的驅動程序;
(11)清理操作
總結:
POST—> Boot Sequence(BIOS)—>Boot loader(MBR)—>kernel—>rootfs—>/sbin/init —>設置默認運行級別運行系統初始化腳本,完成系統初始化—>關閉對應級別下需要停止的服務;啟動對應級別下需要開啟的服務—>設置登錄終端[—>啟動圖形終端(由登錄終端決定)]
補充:
Centos6上的運行級別:
0:斷電關機(halt)
1:單用戶模式(Single user),無需認證即可登陸root用戶
2:多用戶模式(Multiuser),但不提供NFS服務
3:多用戶模式,完全功能模式,文本界面
4:預留級別(Full multiuser),未定義;目前若使用4級別登錄,同3級別
5:多用戶模式(X11),圖形界面
6:重啟系統(reboot)
注意:級別0、6不能設為默認級別,否則系統不能正常啟動。
如何查看當前運行級別:
1、runlevel
2、who -r
3、Centos7:systemctl get-default
如何切換當前運行級別:
init N:N為級別數字
注:CentOS7不再有運行級別概念,在此不做討論
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/44776