Linux之系統啓動流程之(1)流程概述

Linux之系統啓動流程之(1)流程概述

Linux一般來說是通過引導MBR來啓動程序的,所以本片之介紹MBR啓動方式流程。

Linux組成:Kernel+rootfs

kernel(系統內核模塊)功能:

進程管理、內存管理、網路管理、驅動程序、文件系統、按全功能。

rootfs(根文件系統):相應程序和glibc,根是自引用的,能夠自我識別

庫:函數集合,function, 調用接口(頭文件負責描述)

過程調用:procedure,無返回值

函數調用:function

程序:二進制執行文件

 

內核設計流派:

單內核(monolithice kernel):Linux (LMP)

把所有功能集成於同一個程序

微內核(micro kernel):Windows, Solaris(線程)

每種功能使用一個單獨子系統實現

 

Linux內核的特點:

支持模塊化: .ko (內核模塊對象)

如:文件系統,驅動程序,網絡協議等

 (注):支持內核模塊的動態裝載和卸載

 

啓動所需組成部分:

核心文件:/boot/vmlinuz-VERSION-release.img

ramdisk:輔助的僞根系統

CentOS 5ramdisk --> initrd

/boot/initrd-VERSION-release.img

CentOS6, 7ramfs -->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啓動流程:

1、加載BIOS的硬件信息,獲取第一個啓動設備

2、讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息

3、加載核心操作設備

4、核心執行init程序,並獲取默認的運行信息

5、init程序執行/etc/rc.d/rc.sysinit文件

6、啓動核心的外掛模塊(/etc/modprobe.conf)

7、init執行運行的各個批處理文件(scripts)

8、init執行/etc/rc.d/rc.local

9、執行/bin/login程序,等待用戶登錄

10、登錄之後開始以Shell 控制主機

 

詳解啓動過程

主板及相關硬件作用

POSTPrower-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU

主板、內存、硬盤子系統、串行行接口、鍵盤、CD-ROM光驅等硬件情況的檢查測。

ROMBIOSBasic Inpupt and Ouput System,保存着有關計算機最重要的基本輸入輸出程序,系統信息設置、開機加電自檢和系統啓動自舉程序等。

RAMCMOS互補金屬氧化物半導體,保存BIOS主備的程序各項參數的設定。

按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備。

引導加載部分作用

bootloader(MBR):引導加載器

bootloader類型補充:

windowsntloader,僅是啓動OS

        Linux:功能豐富,提供菜單,運行用戶選擇要啓動系統或不同的內核版本;把用戶選定的內核裝載到內存到特定空間中,解壓、展開,並把系統控制權移交給內存。

Linux中使用的bootloder

LIIOLInux LOader

GRUBGRand Unified Bootloader

               GRUB 0.XGRUB LegacyGRUB2

 

MBR:系統盤的前446字節:bootloader,64:分區表,2 :55AA

 

GRUB:GRand Unified Bootloader

primary boot loader

Stage1MBR,第1階段

secondary boot loader

Stage1_5:識別常見的不同文件系統類型,第1,.5階段

Stage2/root/grub/,第2階段

 

kernel部分:

  自身初始化:

探測可識別到的所有硬件設備

加載硬件驅動(可能藉助於ramdisk加載驅動)

以自讀方式掛載根文件系統

運行用戶空間的第一個應用程序:/sbin/init

 

init程序的類型:

SysVinit, CentOS 5及之前

配置文件:/etc/inittab

Upstartinit, CentOS6

配置文件:/etc/inittab, /etc/init/*.conf

Systemdsystemd, CentOS7

配置文件:/usr/lib/systemd/system

  /etc/systemd/system

ramdisk類型:

內核中的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問

ramdisk  -->  ramfs 提供速度

CentOS 5initrd,工作程序:mkinitrd

CentOS 6initramfs,工具程序:mkinitrd,dracut

注意:ramkdisk爲表示模擬一個虛擬磁盤來進行根切換,而ramfs直接是模擬了一種文件系統所有緩存和解壓的速度更快。

 

系統初始化:

POST-->BootSequence(BIOS)-->Bootloader(MBR)-->kernel(ramdisk)-->

(ROOBTFS虛擬根文件系統切換)-->init(或者systemd)

 

 

系統的運行級別(CentOS6之前):/sbin/init(切換級別的命令)

0halt  關機

1single user mode,  單用戶模式, 直接以管理員切入(init  s | single)

2mulit user mode, no NFS 沒有NFS服務的字符界面多用戶模式

3mulit user mode, text mode 字符界面多用戶模式

4reseved  保留級別,可同3級別

5multi  user  mode,  graphic mode  帶圖形界面的多用戶模式

6reboot 重啓

 

默認級別:3,5

切換級別:init #

查看級別:runlevel ; who -r

 

 

init初始化:

init進程其初始化文件:/etc/inittab

初始化運行級別(RUN LEVEL

系統初始化腳本

對應運行級別的腳本目錄

捕獲某個關鍵字順序

定義UPS電源終端/恢復腳步

在虛擬控制檯生成getty

在運行級別5初始化X(圖形界面程序)

各個啓動過程使用的配置文件的作用

/sbin/init:(/etc/inittab)

upstartubuntu組織開發,(RHEL 6版本以後)d-dusevent-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:系統初始化腳本

1、設置主機名

2、設置歡迎信息

3、激活udevselinux

4、掛載/etc/fstab文件中定義的文件系統

5、檢查根文件系統,並以讀寫方式重新掛載根文件系統系統

6、設置系統時鐘

7、激活swap設備

8、根據/etc/sysctl.conf文件設置內核參數

9、激活lvmsoftware raid設備

10、加載額外的設備的驅動程序

11、清理操作

 

/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####運行次序;數字越小先執行及開啓;數字越小的服務,通常爲被依賴到的服務;

 

 

系統服務管理命令(CentOS5、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服務啓動腳本風格片段

 wKiom1ffTYWAXg3cAAANcs2dQ0I760.png

解析:這裏的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服務

wKioL1ffTfzwtF1eAAAjNxaezr8015.png 

說明:這裏前面的[ ]裏面有個*符號,說明在當前運行級別已經設置自啓動,也就是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此行按空格,讓*符號消失

wKiom1ffThPzO_x_AAAV95TcmT4392.png 

注意:這裏設置好後,使用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


總結:

linuxCentos6發行版來說,開機啓動流程爲:

1、POST加電自檢,然後找到BLOS中設置的第一個啓動設備;

2、然後從此設備及硬盤中找到磁盤的前446字節,及bootloader,完成第一階段;

3、然後根據bootloader中的grub信息找到boot分區;

4、讀取/boot/grub/grub.conf配置文件中讀取vmlinuz內核文件,然後解壓並加載內核;

5、在加載完成後然後解壓initrd initramfs.img)模擬加載器來切換到真正的根文件系統,這時實際上運行了initramfs 中有一段核心腳步爲init,及grub.conf中定義的根分區(如root=/dev/sda2),然後進入系統;

6、隨之根據內核文件中定義會默認運行/sbin/init第一個系統啓動程序;

7、/sbin/init默認讀取/etc/initab文件,讀取設置的默認運行級別;

8、然後運行/etc/rc.d/rc.sysinit文件來設置一些系統的級別級別配置(如加載內核模塊、設置主機名,重新掛載文件系統等);

9、然後根據默認運行級別來找對應級別下的目錄服務腳步鏈接文件來執行,也就是執行/etc/rc.d/rc,當然這裏的腳步讀有一個上述說到的SysV風格的chkconfig標識(#chkconfig  level  SS  KK),然後安裝關閉K開頭鏈接腳步和開啓S開頭的鏈接腳步,最終啓動所有服務;

10、執行完所有服務後這裏最後會執行/etc/rc.d/rc.local (這裏包含了一些可以自定義的程序);

11、最終打開根據下面的定義的終端個數來確定打開幾個終端,會藉助agettymingetty來找到/bin/login程序來打開用戶交互式登錄界面,此時登錄後就打開了/bin/bash程序了。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章