當(dāng)我們按下開(kāi)機(jī)鍵后,系統(tǒng)背后的秘密我們是否了解呢?這里,我?guī)Т蠹姨剿饕幌耹inux系統(tǒng)開(kāi)機(jī)背后的秘密。
1.加電自檢
主板在接通電源后,系統(tǒng)首先由POST程序來(lái)對(duì)內(nèi)部各個(gè)設(shè)備進(jìn)行檢查,自檢中如發(fā)現(xiàn)有錯(cuò)誤,將按兩種情況處理:對(duì)于嚴(yán)重故障(致命性故障)則停機(jī),此時(shí)由于各種初始化操作還沒(méi)完成,不能給出任何提示或信號(hào);對(duì)于非嚴(yán)重故障則給出提示或聲音報(bào)警信號(hào),等待用戶(hù)處理。
2.BIOS啟動(dòng)引導(dǎo)階段
自檢通過(guò)之后,按次序查找各引導(dǎo)設(shè)備,第一個(gè)有引導(dǎo)程序的設(shè)備即為本次啟動(dòng)要用到的設(shè)備。一般電腦是按"F2"或"Del"鍵等等進(jìn)入BIOS,在里面我們可以調(diào)整硬盤(pán)的啟動(dòng)順序。
找到第一個(gè)有引導(dǎo)程序的設(shè)備后,BIOS會(huì)找到設(shè)備中的MBR,讀取其中的Bootloader
3.GRUP引導(dǎo)階段
這時(shí)候就可以看到我們的Centos系統(tǒng)了,但是一般都不需要操作,會(huì)自動(dòng)啟動(dòng)系統(tǒng)。其實(shí)我們也可以自己手動(dòng)啟動(dòng)系統(tǒng)的
3.1 手動(dòng)在grub命令行接口啟動(dòng)系統(tǒng):
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
3.2 grub的命令行接口:
e: 編輯模式,用于編輯菜單;
c: 命令模式,交互式接口;
help: 獲取幫助列表
help KEYWORD: 詳細(xì)幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#) 設(shè)定grup的根設(shè)備
kernel /PATH/TO/KERNEL_FILE: 設(shè)定本次啟動(dòng)時(shí)用到的內(nèi)核文件;額外還可以添加許多內(nèi)核支持使用的cmdline參數(shù);
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 設(shè)定為選定的內(nèi)核提供額外文件的ramdisk;
boot: 引導(dǎo)啟動(dòng)選定的內(nèi)核;
3.3 配置文件:/boot/grub/grub.conf
配置項(xiàng):
default=#: 設(shè)定默認(rèn)啟動(dòng)的菜單項(xiàng);落單項(xiàng)(title)編號(hào)從0開(kāi)始;
timeout=#:指定菜單項(xiàng)等待選項(xiàng)選擇的時(shí)長(zhǎng);
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [--md5] STRING: 菜單編輯認(rèn)證;
title TITLE:定義菜單項(xiàng)“標(biāo)題”, 可出現(xiàn)多次;用來(lái)引導(dǎo)多個(gè)內(nèi)核或者操作系統(tǒng)
root (hd#,#):grub查找stage2及kernel文件所在設(shè)備分區(qū);為grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:?jiǎn)?dòng)的內(nèi)核
initrd /PATH/TO/INITRAMFS_FILE: 內(nèi)核匹配的ramfs文件;
password [--md5] STRING: 啟動(dòng)選定的內(nèi)核或操作系統(tǒng)時(shí)進(jìn)行認(rèn)證
4.加載內(nèi)核階段
內(nèi)核會(huì)自身初始化:
探測(cè)可識(shí)別到的所有硬件設(shè)備;
加載硬件驅(qū)動(dòng)程序;(有可能會(huì)借助于ramdisk加載驅(qū)動(dòng))
以只讀方式掛載根文件系統(tǒng);
運(yùn)行用戶(hù)空間的第一個(gè)應(yīng)用程序:/sbin/init
5.init初始化階段
內(nèi)核加載完畢,會(huì)運(yùn)行init程序,init進(jìn)程起來(lái)后,系統(tǒng)啟動(dòng)的控制權(quán)移交給init進(jìn)程
/sbin/init進(jìn)程是所有進(jìn)程的父進(jìn)程,當(dāng)init起來(lái)之后,它首先會(huì)讀取配置文件/etc/inittab,進(jìn)行以下工作:
1.執(zhí)行系統(tǒng)初始化腳本(/etc/rc.d/rc.sysinit),對(duì)系統(tǒng)進(jìn)行基本的配置,以讀寫(xiě)方式掛載根文件系統(tǒng)及其它文件系統(tǒng),到此系統(tǒng)基本算運(yùn)行起來(lái)了,后面需要進(jìn)行運(yùn)行級(jí)別的確定及相應(yīng)服務(wù)的啟動(dòng);
2.確定啟動(dòng)后進(jìn)入的運(yùn)行級(jí)別;
3.執(zhí)行/etc/rc.d/rc,該文件定義了服務(wù)啟動(dòng)的順序是先K后S,而具體的每個(gè)運(yùn)行級(jí)別的服務(wù)狀態(tài)是放在/etc/rc.d/rcn.d(n=0~6)目錄下,所有的文件均鏈接至/etc/init.d下的相應(yīng)文件。
4.有關(guān)key sequence的設(shè)置
5.有關(guān)UPS的腳本定義
6.啟動(dòng)虛擬終端/sbin/mingetty
7.在運(yùn)行級(jí)別5上運(yùn)行X
配置文件:/etc/inittab
每行定義一種action以及與之對(duì)應(yīng)的process
id:runlevels:action:process
id:一個(gè)任務(wù)的標(biāo)識(shí)符;
runlevels:在哪些級(jí)別啟動(dòng)此任務(wù);#,###,可以為空,表示所有級(jí)別;
action:在什么條件下啟動(dòng)此任務(wù);
process:任務(wù);(腳本或程序)
action:
wait:等待切換至此任務(wù)所在的級(jí)別時(shí)執(zhí)行一次;
respawn:一旦此任務(wù)終止,就自動(dòng)重新啟動(dòng)之;
initdefault:設(shè)定默認(rèn)運(yùn)行級(jí)別;此時(shí),process省略;
sysinit:設(shè)定系統(tǒng)初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;
K*:要停止的服務(wù);K##*,優(yōu)先級(jí),數(shù)字越小,越是優(yōu)先關(guān)閉;依賴(lài)的服務(wù)先關(guān)閉,而后關(guān)閉被依賴(lài)的;
S*:要啟動(dòng)的服務(wù);S##*,優(yōu)先級(jí),數(shù)字越小,越是優(yōu)先啟動(dòng);被依賴(lài)的服務(wù)先啟動(dòng),而依賴(lài)的服務(wù)后啟動(dòng);
chkconfig命令:管控/etc/init.d/每個(gè)服務(wù)腳本在各級(jí)別下的啟動(dòng)或關(guān)閉狀態(tài);
查看:chkconfig --list [name]
添加:chkconfig --add name
刪除:chkconfig --del name
修改指定的鏈接類(lèi)型:
chkconfig [--level LEVELS] name on|off|reset>
--level LEVELS:指定要控制的級(jí)別;默認(rèn)為2345;
init命令:
級(jí)別切換:init #
級(jí)別查看:who -r
注:
正常級(jí)別下,最后啟動(dòng)的一個(gè)服務(wù)S99local沒(méi)有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;因此,不便或不需寫(xiě)為服務(wù)腳本的程序期望能開(kāi)機(jī)自動(dòng)運(yùn)行時(shí),直接放置于此腳本文件中即可。