Linux之系統啓動流程之(1)流程概述linux
Linux通常來講是經過引導MBR來啓動程序的,因此本片之介紹MBR啓動方式流程。ubuntu
Linux組成:Kernel+rootfsvim
kernel(系統內核模塊)功能:c#
進程管理、內存管理、網路管理、驅動程序、文件系統、按全功能。windows
rootfs(根文件系統):相應程序和glibc,根是自引用的,可以自我識別緩存
庫:函數集合,function, 調用接口(頭文件負責描述)bash
過程調用:procedure,無返回值網絡
函數調用:functionide
程序:二進制執行文件模塊化
內核設計流派:
單內核(monolithice kernel):Linux (LMP)
把全部功能集成於同一個程序
微內核(micro kernel):Windows, Solaris(線程)
每種功能使用一個單獨子系統實現
Linux內核的特色:
支持模塊化: .ko (內核模塊對象)
如:文件系統,驅動程序,網絡協議等
(注):支持內核模塊的動態裝載和卸載
啓動所需組成部分:
核心文件:/boot/vmlinuz-VERSION-release.img
ramdisk:輔助的僞根系統
CentOS 5:ramdisk --> initrd
/boot/initrd-VERSION-release.img
CentOS6, 7:ramfs -->initrdamfs
/boot/initramfs-VERSION-release.img
模塊文件存放路徑:/lib/modules/VERSION-release
CentOS6啓動順序:
整體順序:
POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel-initrd-->(ROOTFS)-->/sbin/init
大體順序:
加電自檢-->MBR引導-->GRUB-->加載內核
CentOS6啓動流程:
一、加載BIOS的硬件信息,獲取第一個啓動設備
二、讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息
三、加載核心操做設備
四、核心執行init程序,並獲取默認的運行信息
五、init程序執行/etc/rc.d/rc.sysinit文件
六、啓動核心的外掛模塊(/etc/modprobe.conf)
七、init執行運行的各個批處理文件(scripts)
八、init執行/etc/rc.d/rc.local
九、執行/bin/login程序,等待用戶登陸
十、登陸以後開始以Shell 控制主機
詳解啓動過程
主板及相關硬件做用
POST:Prower-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、
主板、內存、硬盤子系統、串行行接口、鍵盤、CD-ROM光驅等硬件狀況的檢查測。
ROM:BIOS,Basic Inpupt and Ouput System,保存着有關計算機最重要的基本輸入輸出程序,系統信息設置、開機加電自檢和系統啓動自舉程序等。
RAM:CMOS互補金屬氧化物半導體,保存BIOS主備的程序各項參數的設定。
按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備。
引導加載部分做用
bootloader(MBR):引導加載器
bootloader類型補充:
windows:ntloader,僅是啓動OS
Linux:功能豐富,提供菜單,運行用戶選擇要啓動系統或不一樣的內核版本;把用戶選定的內核裝載到內存到特定空間中,解壓、展開,並把系統控制權移交給內存。
Linux中使用的bootloder:
LIIO:LInux LOader
GRUB:GRand Unified Bootloader
GRUB 0.X:GRUB Legacy,GRUB2
MBR:系統盤的前446字節:bootloader,64:分區表,2 :55AA
GRUB:GRand Unified Bootloader
primary boot loader:
Stage1:MBR,第1階段
secondary boot loader:
Stage1_5:識別常見的不一樣文件系統類型,第1,.5階段
Stage2:/root/grub/,第2階段
kernel部分:
自身初始化:
探測可識別到的全部硬件設備
加載硬件驅動(可能借助於ramdisk加載驅動)
以自讀方式掛載根文件系統
運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
SysV:init, CentOS 5及以前
配置文件:/etc/inittab
Upstart:init, CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
ramdisk類型:
內核中的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問
ramdisk --> ramfs 提供速度
CentOS 5:initrd,工做程序:mkinitrd
CentOS 6:initramfs,工具程序:mkinitrd,dracut
注意:ramkdisk爲表示模擬一個虛擬磁盤來進行根切換,而ramfs直接是模擬了一種文件系統全部緩存和解壓的速度更快。
系統初始化:
POST-->BootSequence(BIOS)-->Bootloader(MBR)-->kernel(ramdisk)-->
(ROOBTFS虛擬根文件系統切換)-->init(或者systemd)
系統的運行級別(CentOS6以前):/sbin/init(切換級別的命令)
0:halt 關機
1:single user mode, 單用戶模式, 直接以管理員切入(init s | single)
2:mulit user mode, no NFS 沒有NFS服務的字符界面多用戶模式
3:mulit user mode, text mode 字符界面多用戶模式
4:reseved 保留級別,可同3級別
5:multi user mode, graphic mode 帶圖形界面的多用戶模式
6:reboot 重啓
默認級別:3,5
切換級別:init #
查看級別:runlevel ; who -r
init初始化:
init進程其初始化文件:/etc/inittab
初始化運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳步
在虛擬控制檯生成getty
在運行級別5初始化X(圖形界面程序)
各個啓動過程使用的配置文件的做用
/sbin/init:(/etc/inittab)
upstart:ubuntu組織開發,(RHEL 6版本之後),d-dus,event-driven,基於事件驅動
systemd:(完整的並行進程)
/etc/inittab配置文件介紹:
每一行定義一種action以及與之對應的 process,格式:
id:runlevels:action:process
id:表示符
runlevels:在哪一個運行級別運行此行;
action:在什麼狀況執行此行,通常常見有下面幾種狀況:
wait:切換至此級別運行一次;
respawn:此process終止,就從新啓動
initdefault:設置默認運行級別;process字段可省略
sysinit:設定系統初始化方式,此處通常爲指定/etc/rc.d/rc.sysinit
process:要運行程序;
舉例說明/etc/inittab:
按默認3級別基本的默認/etc/inittab文件配置說明:
id:3:initdefault:#默認運行級別爲3級別,init程序讀取此行按3級別進入系統
si::sysinit:/etc/rc.d/rc.sysinit#加載文件rc.sysinit,並執行此腳本中的設置
l3:3:wait:/etc/rc.d/rc 3
#根據上面3級別進入系統後,執行對應的rc.d/rc腳步,後面參數爲3,而後進入搜索對應級別下的服務腳步,及/etc/rc.d/rc3.d/下的服務腳步,而後按順序關閉文件中對應 K開頭的服務,開啓S開頭的服務。
/etc/rc.d/rc.init:系統初始化腳本
一、設置主機名
二、設置歡迎信息
三、激活udev和selinux
四、掛載/etc/fstab文件中定義的文件系統
五、檢查根文件系統,並以讀寫方式從新掛載根文件系統系統
六、設置系統時鐘
七、激活swap設備
八、根據/etc/sysctl.conf文件設置內核參數
九、激活lvm及software raid設備
十、加載額外的設備的驅動程序
十一、清理操做
/etc/rc.d/rc腳步說明:
/etc/rc.d/rc中核心服務控制語句相似如下腳本類型:
[root@mageedu kernel]# cat rc.sh #!/bin/bash # [ $# -lt 1 ] && exit 1; runlevel=$1 path="/etc/rc.d" for k in ${path}/rc${runlevel}.d/K*;do echo "$k stopped..."; #本來rc應該是 $k stop,接收stop參數來關閉對應服務 done for s in ${path}/rc${runlevel}.d/S*;do echo "$s start...."; #本來rc應該是$s start,解析start參數來開啓對應服務 done
解析:由於這是一個測試語句,就不傳指定的{start|stop|status|restart}參數了,這裏使用echo輸出來模擬代替。固然真正的rc腳步必需要介紹一個參數來決定來決定對那個運行級別下的服務類腳步來操做,這裏輸入3測試:
#測試腳步執行
[root@mageedu kernel]# ./rc.sh 3
說明:而後會發現先輸出K後跟數字的先關閉,而後S後跟數字的再啓動。數字越小,越先操做,數字越小的越後操做,所以能夠猜想到3級別在啓動的時候會先關閉那麼不須要的服務,而又須要開啓哪些服務。
rc腳步啓動總結說明:
rc # --> 意味着讀取/etc/rc.d/rc#.d/ 下的文件
K*:K##:##運行次序;數字越小先執行及關閉;數字越小的服務,一般爲依賴到別的服務;
S*:S##:##運行次序;數字越小先執行及開啓;數字越小的服務,一般爲被依賴到的服務;
系統服務管理命令(CentOS五、6):
chkconfig 命令
chkconfig - updates and queries runlevel information for system services
更新和查詢系統服務的運行級別信息
選項及用法:
查看服務所在運行級別狀態:
chkconfig --list:查詢全部獨立守護服務的啓動設定,注意:獨立守護進程!
chkconfig --list SERVICE_NAME #查詢指定服務全部級別的啓動或關閉狀況
添加服務
chkconfig --add SERVICE_NAME(腳步名稱)
添加的SysV的服務腳步放置於/etc/rc.d/init.d (/etc/init.d)目錄下
添加的腳步的前幾行須要特定標示格式加入:
#!/bin/bash
#runlevels
解析:runlevles表示初始在哪些基本下啓動,-表示都不啓動,能夠單個能夠多個,如23表示23級別下,而3表示只在3級別啓動
#chkconfig: runlevels SS KK
解析:當chkconfig命令來爲此腳本在rc#.d目錄建立連接時,runlevel表示默認建立S*開頭的連接,除此以外的級別都建立爲K*開頭的連接。
注:連接的開頭說明:
S後面的啓動優先級爲SS所表示的數字;
K後面關閉優先次序爲KK所表示的數字;
#description:
解析:用於說明此腳本的簡單功能:\ 表示續行符號,如 start what \ aa
刪除服務:
chkconfig --del SERVICE_NAME #刪除指定服務腳步在對於級別下建立的連接文件
修改指定的連接類型:
chkconfig [--level runlevels] name <on|off|reset|resetpriorities>
--level runlevles:要設置的級別;省略時表示2345級別
添加刪除、設置自定義服務案例:
1、編寫一個模擬SysV風格的服務腳步,及可以接收{start|stop|status|restart}4鍾參數:
[root@mageedu kernel]# vim myservice.sh
#表現內容以下,用判斷一個文件是否存在來判斷服務是否啓動
[root@mageedu kernel]# cat myservice.sh #!/bin/bash # prog="/var/lock/subsys/`basename $0`"; start() { [ ! -f ${prog} ] && touch ${prog} [ $? -eq 0 ] && echo "`basename $0` start Ok" || echo "`basename $0` running...."; } stop() { [ -f ${prog} ] && rm -f ${prog} [ $? -eq 0 ] && echo "`basename $0` stop OK" || echo "`basename $0` stopped..."; } status() { [ -f ${prog} ] && echo "`basename $0` running..." || echo "`basename $0` stopped..."; } usages() { echo "Unkown Usages:`basename $0` {start|stop|restart|status}"; } declare -a arr=(start stop restart status); case $1 in ${arr[0]}) start ;; ${arr[1]}) stop ;; ${arr[2]}) stop start ;; ${arr[3]}) status ;; *) usages ;; esac
#給腳步加執行權限,而後測試腳步
[root@mageedu kernel]# chmod +x myservice.sh
#給腳步的代碼行前面加入chkconfig的SysV服務啓動腳本風格片斷
解析:這裏的35以及下面的description描述信息能夠省略不寫,只是對此腳本作一個介紹,而chkconfig:設定的參數必須寫,添加此服務時讀取此行,會在35下級別對應的目錄(/etc/rc.d/rc3.d/)下生成以S66開頭的符號連接文件和K22開頭符號連接文件。
2、將剛纔編寫的myservic模擬服務腳步添加到啓動服務列表
#測試成功後,將此腳本拷貝至/etc/rc.d/init.d/目錄下,注意不要加.sh後綴
[root@mageedu kernel]# cp -p ./myservice.sh /etc/rc.d/init.d/myservice
#查看myservice腳步是否已經拷貝成功
[root@mageedu kernel]# ls -l /etc/rc.d/init.d/myservice -rwxr-xr-x 1 root root 697 Sep 11 21:55 /etc/rc.d/init.d/myservice
#而後cd切換到此目錄(/etc/rc.d/init.d)進程操做
[root@mageedu kernel]# cd /etc/rc.d/init.d/ [root@mageedu init.d]# pwd /etc/rc.d/init.d
#使用chkconfig命令添加定義的服務腳步
[root@mageedu init.d]# chkconfig --add myservice
3、查看是否根據在chkconfig文件頭的級別、文件序列號參數在對應目錄生成了連接文件
#查看myservervie的SysV級別表示
[root@mageedu init.d]# grep '^#chkconfig' myservice #chkconfig: 35 66 22
#查看對應的35級別是否生成了對應的文件連接
[root@mageedu init.d]# ls -l /etc/rc.d/rc3.d/*myservice* lrwxrwxrwx 1 root root 19 Sep 11 22:13 /etc/rc.d/rc3.d/S66myservice -> ../init.d/myservice [root@mageedu init.d]# ls -l /etc/rc.d/rc5.d/*myservice* lrwxrwxrwx 1 root root 19 Sep 11 22:13 /etc/rc.d/rc5.d/S66myservice -> ../init.d/myservice
解析:能夠看到在3和5級別服務腳步連接目錄下都是隻生成了S開頭的文件,全部,此時表示在每次運行3和5級別時,會自動開啓此服務。
#查看當前此服務全部級別的自動開啓和關閉狀態
[root@mageedu init.d]# chkconfig --list myservice myservice 0:off1:off2:off3:on4:off5:on6:off
解析:這裏顯示myservice服務3級別和5級別都是啓動狀態,和對應級別服務目錄生成的符號連接文件所對應,都是S開頭,下面關閉此服務35運行級別自動啓動:
#使用chkconfig命令關閉 3級別的自啓動狀態
[root@mageedu init.d]# chkconfig --level 3 myservice off
#再次查看myservice服務全部運行級別的狀態
[root@mageedu init.d]# chkconfig --list myservice myservice 0:off1:off2:off3:off4:off5:on6:off
解析:這裏發現3級別已經變成了off,那麼對應的3級別服務目錄下的連接文件會變嗎?
#查看3級別服務目錄(/etc/rc.d/rc3.d/)下mysevice連接文件
[root@mageedu init.d]# ls -l /etc/rc.d/rc3.d/*myservice* lrwxrwxrwx 1 root root 19 Sep 11 22:23 /etc/rc.d/rc3.d/K22myservice -> ../init.d/myservice
解析:這裏發現已經根據/etc/rc.d/init.d/myservice腳步裏設置的K開頭22參數,改變了文件的連接命令,從S66變成了K22。
4、測試/etc/rc.d/rcN.d/*的連接文件和chkconfig服務列表的關係
#下面反過來,直接使用重命令來修改連接文件名,查看是否會修改chkconfig列表裏的狀態:
#修改K22myservice連接文件名爲S66myservce(安照chkconfig行定義好的)
[root@mageedu init.d]# mv /etc/rc.d/rc3.d/K22myservice /etc/rc.d/rc3.d/S66myservice
#檢查文件名是否已經改變
[root@mageedu init.d]# ls -l /etc/rc.d/rc3.d/*myservice* lrwxrwxrwx 1 root root 19 Sep 11 22:23 /etc/rc.d/rc3.d/S66myservice -> ../init.d/myservice
#此時使用chkconfig命令來查看3級別下是否已經變成on及自啓動服務
[root@mageedu init.d]# chkconfig --list myservice myservice 0:off1:off2:off3:on4:off5:on6:off
解析:OK,原來內部只是不斷已經鏈接名來對指定運行級別的服務腳步進行開啓或關閉處理,固然,此腳本必需要在/etc/rc.d/init.d存在,不然chkconfig不會識別,並且此服務腳步文件還必須須要有chkfonig標示行,及指定級別、生成序列號等。
5、額外的圖形字符界面工具ntsyv
不只可使用chkconfig命令,還有專用的圖形工具(ntsysv),不過只針對當前運行級別設置
#查看當前終端所在的運行級別
[root@mageedu init.d]# runlevel N 3 [root@mageedu init.d]# who -r run-level 3 2016-09-01 06:32 last=S
解析:以上連個命令都會顯示所在的運行級別,從上面輸出得知,當前在3級別運行。
#輸入ntsvsy列出當前運行級別的服務列表
[root@mageedu init.d]# ntsysv
#從ntsvsy打開的Services列表中找到自定義的myservice服務
說明:這裏前面的[ ]裏面有個*符號,說明在當前運行級別已經設置自啓動,也就是3級別。
#對Cancel按鈕按回車退出,使用chkconfig查看3級別myservice是否自啓動
[root@mageedu init.d]# chkconfig --list myservice myservice 0:off1:off2:off3:on4:off5:on6:off
解析:這裏顯示時on狀態,和 ntsysv工具裏的對應。
#再次打開ntsysv工具,對myservice此行按空格,讓*符號消失
注意:這裏設置好後,使用tab鍵切換到ok按回車才能保存設置並退出。
#使用chkconfig命令myservice在3級別是否已經變成off
[root@mageedu init.d]# chkconfig --list myservice myservice 0:off1:off2:off3:off4:off5:on6:off
#再次查看3級別的服務連接文件是否爲K22*開頭
[root@mageedu init.d]# ls -l /etc/rc.d/rc3.d/*myservice* lrwxrwxrwx 1 root root 19 Sep 11 22:47 /etc/rc.d/rc3.d/K22myservice -> ../init.d/myservice
#清除myservice對應的全部符號連接文件
[root@mageedu init.d]# chkconfig --del myservice
#再次使用chkconfig命令以及出現找不到此服務,說明全部級別下連接已經清除完
[root@mageedu init.d]# chkconfig --list myservice service myservice supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add myservice')
#可是此腳本並無刪除
[root@mageedu init.d]# ls -l /etc/rc.d/init.d/myservice -rwxr-xr-x 1 root root 772 Sep 11 22:11 /etc/rc.d/init.d/myservice
#刪除此腳本文件便可恢復開始原狀
[root@mageedu init.d]# rm -f /etc/rc.d/init.d/myservice
總結:
按linux中Centos6發行版來講,開機啓動流程爲:
一、POST加電自檢,而後找到BLOS中設置的第一個啓動設備;
二、而後今後設備及硬盤中找到磁盤的前446字節,及bootloader,完成第一階段;
三、而後根據bootloader中的grub信息找到boot分區;
四、讀取/boot/grub/grub.conf配置文件中讀取vmlinuz內核文件,而後解壓並加載內核;
五、在加載完成後而後解壓initrd (initramfs.img)模擬加載器來切換到真正的根文件系統,這時實際上運行了initramfs 中有一段核心腳步爲init,及grub.conf中定義的根分區(如root=/dev/sda2),而後進入系統;
六、隨之根據內核文件中定義會默認運行/sbin/init第一個系統啓動程序;
七、/sbin/init默認讀取/etc/initab文件,讀取設置的默認運行級別;
八、而後運行/etc/rc.d/rc.sysinit文件來設置一些系統的級別級別配置(如加載內核模塊、設置主機名,從新掛載文件系統等);
九、而後根據默認運行級別來找對應級別下的目錄服務腳步連接文件來執行,也就是執行/etc/rc.d/rc,固然這裏的腳步讀有一個上述說到的SysV風格的chkconfig標識(#chkconfig level SS KK),而後安裝關閉K開頭連接腳步和開啓S開頭的連接腳步,最終啓動全部服務;
十、執行完全部服務後這裏最後會執行/etc/rc.d/rc.local (這裏包含了一些能夠自定義的程序);
十一、最終打開根據下面的定義的終端個數來肯定打開幾個終端,會藉助agetty或mingetty來找到/bin/login程序來打開用戶交互式登陸界面,此時登陸後就打開了/bin/bash程序了。