目錄
Linux系統(tǒng)引導(dǎo)流程如下圖:

固件(Firmware)就是寫入EROM或EEPROM(可編程只讀存儲器)中的程序,一般來說,擔(dān)任著一個(gè)數(shù)碼產(chǎn)品最基礎(chǔ)、最底層工作的軟件才可以稱之為固件,比如計(jì)算機(jī)主板上的基本輸入/輸出系統(tǒng)BIOS(Basic Input/output System),在以前其實(shí)更多的專業(yè)人士叫它固件。
通常這些硬件內(nèi)所保存的程序是無法被用戶直接讀出或修改的。在以前,一般情況下是沒有必要對固件進(jìn)行升級操作的,即使在固件內(nèi)發(fā)現(xiàn)了嚴(yán)重的Bug也必須由專業(yè)人員帶著寫好程序的芯片把原來機(jī)器上的更換下來。隨著技術(shù)的不斷發(fā)展,修改固件以適應(yīng)不斷更新的硬件環(huán)境成了用戶們的迫切要求,所以,可重復(fù)寫入的可編程可擦除只讀存儲器EPROM(Erasable Programmable ROM),EEPROM和Flash出現(xiàn)了,這些芯片是可以重復(fù)刷寫的,讓固件得以修改和升級。
常用固件設(shè)置有:安全設(shè)置、可引導(dǎo)介質(zhì)列表、可引導(dǎo)介質(zhì)搜索順序、電源管理、啟動(dòng)細(xì)節(jié)顯示等
接通微機(jī)的電源,系統(tǒng)將執(zhí)行一個(gè)自我檢查的例行程序,對系統(tǒng)的幾乎所有的硬件進(jìn)行檢測。這是固件BIOS最重要的功能,通常稱為POST——加電自檢(Power On Self Test)
關(guān)于系統(tǒng)時(shí)間和硬件時(shí)鐘:
查看當(dāng)前系統(tǒng)時(shí)間(軟件時(shí)鐘):date 查看硬件時(shí)鐘:hwclock

如上圖我的系統(tǒng)時(shí)間和硬件時(shí)鐘基本相同且準(zhǔn)確,如果兩個(gè)當(dāng)中有一個(gè)不準(zhǔn)確則需要參照另一個(gè)時(shí)鐘進(jìn)行同步,用hwclock --help命令查看hwclock常用選項(xiàng)的幫助信息,可以看到--hctosys選項(xiàng)是根據(jù)硬件時(shí)鐘設(shè)置系統(tǒng)時(shí)間,--systohc選項(xiàng)是根據(jù)當(dāng)前系統(tǒng)時(shí)間設(shè)置硬件時(shí)鐘

如果系統(tǒng)時(shí)間和硬件時(shí)鐘都不準(zhǔn)確,我們需要重新設(shè)置,對于系統(tǒng)時(shí)間,我們用man date看看它的幫助文檔,可以看到設(shè)置系統(tǒng)時(shí)間的格式為date 月月日日時(shí)時(shí)分分年年年年.秒秒,例如設(shè)置當(dāng)前系統(tǒng)時(shí)間為2015年04月15日14時(shí)25分30秒的命令為date 041514252015.30

同理我們用man hwclock查看hwclock的幫助文檔可以知道,設(shè)置硬件時(shí)鐘為2015年04月15日14時(shí)25分30秒的命令為hwclock --set --date="4/15/2015 14:25:30",當(dāng)然也可以根據(jù)當(dāng)前系統(tǒng)時(shí)間設(shè)置硬件時(shí)鐘
固件在加電自檢沒有問題之后會讀取位于硬盤0柱面、0磁頭、1扇區(qū)(主引導(dǎo)扇區(qū))的MBR(主引導(dǎo)記錄Master Boot Record)。MBR由三個(gè)部分組成,自舉程序(BootLoader)、硬盤分區(qū)表DPT(Disk Partition table)和分區(qū)有效標(biāo)志(magic number)。在總共512字節(jié)的主引導(dǎo)扇區(qū)里自舉程序(BootLoader)占446個(gè)字節(jié),第二部分是硬盤分區(qū)表DPT,占64個(gè)字節(jié),硬盤中分區(qū)有多少以及每一分區(qū)的大小都記在其中。第三部分是分區(qū)有效標(biāo)志(magic number),占2個(gè)字節(jié),固定為55AA。

GRUB是在Linux中廣泛應(yīng)用的BootLoader,它的配置文件是/etc/grub.conf。(Windows xp/windows server 2003中廣泛應(yīng)用的BootLoader是NT Loader,即ntldr;而Windows Vista/Windows 7/win8(.1)中取而代之的是Boot Manager,即bootmgr)
輸入命令vi /etc/grub.conf可以編輯GRUB的配置文件。無論哪種系統(tǒng)它的自舉程序最重要的功能就是載入操作系統(tǒng)內(nèi)核,如下圖GRUB配置文件中選中部分kernel /vmlinuz-2.6.18-194.e15就是用來指定內(nèi)核所在的位置,所以如果我們在進(jìn)行內(nèi)核編譯生成新的內(nèi)核后要重新編輯一下GRUB的配置文件。/vmlinuz-2.6.18-194.e15是一個(gè)可執(zhí)行的Linux內(nèi)核文件,z表示他是一個(gè)解壓縮文件,2.6.18是內(nèi)核的版本號,其中2是主版本號,6是次版本號,次版本號若為奇數(shù)表示這是一個(gè)測試版內(nèi)核,這里次版本號為偶數(shù)6表示這是一個(gè)正式版內(nèi)核,18是末版本號。

如下圖編譯好的Linux內(nèi)核位于/boot/vmlinuz-2.6.18-194.e15,他就是一個(gè)二進(jìn)制可執(zhí)行文件;而沒有編譯的Linux內(nèi)核源文件一般默認(rèn)位于/usr/src/linux文件夾下,是一堆源代碼文件

在引導(dǎo)流程里載入內(nèi)核Kernel后內(nèi)核只做兩件事情:
一是驅(qū)動(dòng)硬件。所有操作系統(tǒng)內(nèi)核中保存最多的就是硬件驅(qū)動(dòng)程序,所以想把一個(gè)操作系統(tǒng)放在一個(gè)小型硬件設(shè)備中裁剪內(nèi)核時(shí)只需要保留這個(gè)小型硬件設(shè)備所需要的驅(qū)動(dòng)。內(nèi)核驅(qū)動(dòng)硬件和固件進(jìn)行加點(diǎn)自檢是不同的,加電自檢是在物理的層面上檢測硬件可不可用,比如硬件有沒有連接好,線有沒有插錯(cuò)等;而內(nèi)核驅(qū)動(dòng)硬件是在操作系統(tǒng)(軟件)的層次上識別和調(diào)用硬件。
二是啟動(dòng)init進(jìn)程,init進(jìn)程啟動(dòng)后會讀取/etc/inittab配置文件,執(zhí)行缺省運(yùn)行級別,從而繼續(xù)引導(dǎo)過程。在類UNIX系統(tǒng)中,init是第一個(gè)可以存在的進(jìn)程,它的pid(Process Identification)恒為1,但它也必須向一個(gè)更高級的功能負(fù)責(zé):pid為0的內(nèi)核調(diào)度器(Kernel scheduler),用來分配CPU時(shí)間片以及進(jìn)行進(jìn)程間切換。Linux是一個(gè)分時(shí)的多任務(wù)操作系統(tǒng),所謂分時(shí)就是把CPU循環(huán)周期分成小的時(shí)間片讓任務(wù)排隊(duì)處理,在一個(gè)CPU循環(huán)周期里會盡量給每一個(gè)任務(wù)分配一個(gè)時(shí)間片,如果任務(wù)在本次CPU循環(huán)周期中沒有執(zhí)行完,則在下一個(gè)CPU循環(huán)周期中還會給任務(wù)分配時(shí)間片。
輸入進(jìn)程管理命令ps -le | more查看當(dāng)前進(jìn)程如下圖,可以看到init進(jìn)程的PID為1,PPID(Parent Process Identification)為0。

如果父進(jìn)程中止而子進(jìn)程仍然存在,則這個(gè)子進(jìn)程被稱為孤兒進(jìn)程,在Linux系統(tǒng)中不允許有孤兒進(jìn)程的存在,所以當(dāng)系統(tǒng)檢測到孤兒進(jìn)程會自動(dòng)將它的父進(jìn)程指向?yàn)閕nit,所以init進(jìn)程理論上講是系統(tǒng)中所有進(jìn)程的父進(jìn)程。
如果子進(jìn)程中止而父進(jìn)程不知道,還在嘗試保持與子進(jìn)程之間的聯(lián)系,這個(gè)子進(jìn)程被稱為僵尸進(jìn)程(Z),當(dāng)然在Linux系統(tǒng)中僵尸進(jìn)程也是不允許存在的。
Linux運(yùn)行級別輸入命令vi /etc/inittab進(jìn)入配置文件inittab,可以看到下圖選中部分為Linux系統(tǒng)(RedHat系列)默認(rèn)的運(yùn)行級別(runlevel)

0 — halt 關(guān)機(jī),類似于shutdown,括號中警告不要把缺省的運(yùn)行級別設(shè)置成這個(gè)
1 — Single user mode 單用戶模式,只有Root可以登錄,類似于Windows的安全模式,但它沒有圖形界面
2 — Multiuser mode 多用戶模式,沒有NFS(Network File System)服務(wù)
3 — Full multiuser mode 完整的多用戶模式,具有NFS服務(wù),可以進(jìn)行類Unix操作系統(tǒng)之間的文件共享(由于NFS的安全性較差,不推薦使用NFS進(jìn)行文件共享,所以3比2并沒有優(yōu)勢)
2和3都是沒有圖形界面的,是應(yīng)用最多的服務(wù)器運(yùn)行模式
4 — unused 沒有被使用的運(yùn)行級別,可以由用戶自定義
5 — X11 系統(tǒng)缺省的運(yùn)行級別,是圖形化的多用戶模式(比3多個(gè)圖形界面)。X即圖形環(huán)境X-window,11是其版本號
6 — reboot 重啟,同樣不要把缺省的運(yùn)行級別設(shè)置成這個(gè)
關(guān)于運(yùn)行級別的命令:
輸入runlevel可以查看當(dāng)前的運(yùn)行級別,輸入init 運(yùn)行級別或telinit 運(yùn)行級別可以切換當(dāng)前的運(yùn)行級別(telinit是init的軟鏈接文件,所以這兩個(gè)實(shí)際上是同一命令)

輸入man inittab可以查看配置文件inittab的幫助文檔如下:

從中可以看出,在配置文件inittab中所有條目采取此格式:id:runlevels:action:process
id:腳本/命令標(biāo)識符,一般由兩位字母或數(shù)字組成
runlevels:指定腳本/命令的運(yùn)行級別,表示可在此運(yùn)行級別下執(zhí)行,可以指定多個(gè),若不指定則表示在所有運(yùn)行級別下均可執(zhí)行
action:指定腳本/命令的運(yùn)行狀態(tài)
process:指定要運(yùn)行的腳本/命令,前面三項(xiàng)皆為此項(xiàng)的修飾
輸入grep -v "^#" /etc/inittab | more分頁瀏覽配置文件inittab中非注釋內(nèi)容如下:

action常用取值如下:
initdefault:指定系統(tǒng)啟動(dòng)時(shí)缺省的運(yùn)行級別,如上圖inittab中的第一行id:5:initdefault: 指定系統(tǒng)啟動(dòng)時(shí)缺省的運(yùn)行級別為5
sysinit:該狀態(tài)下系統(tǒng)啟動(dòng)就會執(zhí)行process中指定的命令,如上圖inittab中的第二行si::sysinit:/etc/rc.d/rc.sysinit只要系統(tǒng)啟動(dòng)就會執(zhí)行一次Shell腳本文件/etc/rc.d/rc.sysinit(不論在哪個(gè)運(yùn)行級別下),完成系統(tǒng)服務(wù)程序啟動(dòng),如系統(tǒng)環(huán)境變量設(shè)置、設(shè)置系統(tǒng)時(shí)鐘、加載字體、檢查加載文件系統(tǒng)、生成系統(tǒng)啟動(dòng)信息日志文件等。
wait:執(zhí)行process中指定的命令,并等其結(jié)束再運(yùn)行其他命令
once:執(zhí)行process中指定的命令,不等待其結(jié)束
ctrlaltdel:按下Ctrl+Alt+Del時(shí)執(zhí)行process指定的命令
powerfail:當(dāng)出現(xiàn)電源錯(cuò)誤時(shí)執(zhí)行process指定的命令,不等待其結(jié)束
powerokwait:當(dāng)電源恢復(fù)時(shí)執(zhí)行process指定的命令
respawn:一旦process指定的命令中止,便重新運(yùn)行該命令
上圖inittab中的三到九行如下:
l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6
腳本/etc/rc.d/rc的作用是啟動(dòng)對應(yīng)運(yùn)行級別下的服務(wù),上述七行設(shè)置段分別對應(yīng)了七個(gè)不同的運(yùn)行級別,因?yàn)榈谝恍性O(shè)置的缺省運(yùn)行級別是5,所以會執(zhí)行l(wèi)5:5:wait:/etc/rc.d/rc 5這一行,調(diào)用/etc/rc.d/rc腳本,執(zhí)行運(yùn)行級別5目錄(/etc/rc.d/rc5.d)下的服務(wù)程序,完成運(yùn)行級別5的初始化設(shè)置
/etc/rc.d/rc[0123456].d目錄下分別存放了對應(yīng)于運(yùn)行級別的服務(wù)程序腳本的符號鏈接(文件名分三部分,第一部分分兩種:S開頭意為Start,表示此運(yùn)行級別下啟動(dòng)這個(gè)服務(wù);K開頭意為Kill,表示此運(yùn)行級別下關(guān)閉這個(gè)服務(wù)。第二部分?jǐn)?shù)字表示腳本的啟動(dòng)順序,理論上數(shù)字越小越優(yōu)先啟動(dòng),數(shù)字相同則按照腳本創(chuàng)建的順序依次啟動(dòng)。第三部分是腳本名稱),鏈接到/etc/rc.d/init.d目錄下的相應(yīng)腳本,缺省運(yùn)行級別5目錄(/etc/rc.d/rc5.d)下服務(wù)程序腳本的符號鏈接如下:

如要取消某運(yùn)行級別下某服務(wù)的開啟與關(guān)閉,只需到該運(yùn)行級別目錄下改變該服務(wù)程序腳本的符號鏈接名,如取消運(yùn)行級別5下sendmail服務(wù)的啟動(dòng)只需到/etc/rc.d/rc5.d目錄下輸入mv S80sendmail s80sendmail把S改成小寫s,則在下次初始化運(yùn)行級別5時(shí)則不啟動(dòng)sendmail服務(wù)(如要恢復(fù)只需把s改回S)
/etc/rc.d/rc[0123456].d目錄下存放的僅是服務(wù)程序腳本的符號鏈接,所鏈接到的服務(wù)程序腳本位于/etc/rc.d/init.d目錄下,如下圖所示:

新聞熱點(diǎn)
疑難解答
圖片精選