Linux系統--Linux啓動過程
CentOS 啓動流程:
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 運行統初始化腳本 --> 關閉或啓動對應級別下的服務 --> 啓動終端
1.POST:加電自檢,檢查外圍設備是否能正常啓動。
2.Boot Sequence(Bios):按一定次序查找引導設備,第一次有引導程序的設備即爲本次啓動用到的設備,不管系統能不能正常啓動。
3.BootLoader(MBR):
MBR:主引導記錄,有512個字節組成,前446字節是bootloader,64字節的分區表信息,還有2字節的Magical Number。
BootLoader:引導加載器,是一個程序。在Windows上使用的是ntloader。Linux上有兩種:LILO(LInux Loader)和Grub (GRand Unified Bootloader)
功能:提供一個菜單,允許用戶選擇要啓動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓,展開,並把控制權交給內核:
4.kernel(ramdisk):內核初始化:
探測可識別到的所有硬件設備,加載硬件驅動程序(此時可能會藉助於ramdisk加載驅動)已讀的方式掛在文件系統;運行進程的第一個應用程序:/sbin/init
ramdisk:本地迴環設備文件,把本地文件模擬磁盤或文件系統使用
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6:/boot/initramfs-VERSION-release.img
initrd 是一個被壓縮過的小型根目錄,這個目錄中包含了啓動階段中必須的驅動模塊,可執行文件和啓動腳本。當系統啓動時,bootloader會把initrd文件讀取到內存中,然後把initrd文件在內存中起始地址和大小傳遞給內核。內核在啓動初始化過程中會解壓縮initrd文件,然後將解壓後的initrd掛載爲根目錄,然後執行根目錄下的/linuxrc腳本,就可以在這個腳本中加載真實文件系統存放的設備驅動程序以及在/dev目錄下建立必要的設備結點。這樣就可以mount真正的根目錄,並且換到根目錄中。
5.啓動init程序:
加載完內核之後會啓動Linux第一個應用程序/sbin/init。在CentOS5,6,7上init的程序類型是不相同的。
CentOS5上:是SysV init,配置文件爲:/etc/inittab
CentOS6上:是Upstart init,配置文件爲:/etc/inittab, /etc/init/*.conf
CentOS7上:Systemd,配置文件爲:/usr/lib/systemd/system,/etc/systemd/system
CentOS 5上的/sbin/init :
啓動第一個init程序會讀取init的配置文件/etc/inittab,並依據此文件來進行初始化工作。/etc/inittab文件主要作用是指定運行級別,執行系統初始化腳本(/etc/rc.d/rc.sysinit),啓動相應運行級別下的服務和啓動終端。
(1)Linux的運行級別有7級別:0-6
0:關機
1:單用戶模式root,不需要登錄在此級別下可以修改管理員用戶密碼,維護模式
2:多用戶模式,會啓動網絡功能,但不會啓動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別:可同3級別;
5:多用戶模式,正常模式,圖形界面
6:重啓
級別的切換:init #
查看運行級別:runlevel 和 who -r
(2)配置文件:/etc/inittab文件內容的格式和各字段的含義:
/etc/inittab文件中每一行定義一種action和與之對應的process,用冒號隔開如:
id:runlevel:action:process
其中action常用的種類有:
wait:切換至某級別運行一次process
respawn:此process終止的話,就重新啓動之
initdefault:設置默認運行級別的,process省略
sysinit:設定系統初始化方式,此處一般指定爲:/etc/rc.d/rc.sysinit
id:3:initdefault
si::sysinit:/etc/rc.d/rc.sysinit
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
...
16:6:wait:/etc/rc.d/rc 6
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
其中rc 2表示要讀取/etc/rc.d/rc2.d目錄下的所有文件,並啓動相應的服務。
在/etc/rc.d/目錄下定義着不同運行級別服務啓動腳本所在目錄如:rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d 。這些目錄下的文件都是以K或S開頭的文件,格式如:K{Number}{ServerName}
其中以S開頭的文件向腳本傳遞start參數,服務腳本會在開機時運行此腳本(必須設定開機自啓動的情況下),K開始的文件向腳本傳遞stop參數,切換此級別時會關閉服務。
K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常爲依賴到別的服務;
S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常爲被依賴到的服務
chkconfig命令:用來查看,添加和刪除服務
查看服務在所有級別的啓動或關閉設定情形:
chkconfig [--list] [name]
添加服務:在添加時,Server的服務腳本放置在/etc/rc.d/init.d或/etc/init.d/目錄下的。其實在/etc/rc.d/rcX.d/目錄的以S和K開頭的文件都是連接至此的鏈接文件。添加服務命令:
chkconfig --add name
其中服務腳本文件中必須有以下一行:
# chkconfig: LLLL SS KK
LLLL表示運行的級別,就是服務在哪些級別下是啓動的。省略表示2345級別
SS:表示服務運行的次序
KK:表示服務關閉的次序
刪除服務:
# chkconfig --del name
正常級別下,最後啓動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫爲服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中;
mingetty會login程序,啓動終端程序
(3)文件/etc/rc.d/rc.sysinit的作用有:
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的文件系統;
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 激活swap設備;
(8) 根據/etc/sysctl.conf文件設置內核參數;
(9) 激活lvm及software raid設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
CentOS6上的/init/會讀取配置文件/etc/inittab 和 /etc/init/*.conf,文件/etc/inittab設定系統啓動的默認級別,而/etc/init目錄下所有以.conf結尾的文件是進行執行系統初始化腳本,啓動相應運行級別下的服務和啓動終端。如以下文件:
6.到啓動終端之後,提供用戶登錄界面,Linux的啓動過程結束。