第十周
-
請詳細(xì)描述CentOS的啟動流程
啟動第一步--加載BIOS
當(dāng)打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至于計算機必須在最開始就找到它,這是因為BIOS中包含了CPU的相關(guān)信息、設(shè)備啟動順序信息、硬盤信息、內(nèi)存信息、時鐘信息、PNP特性等等。在此之后,計算機心里就有譜了,知道應(yīng)該去讀取哪個硬件設(shè)備了。在BIOS將系統(tǒng)的控制權(quán)交給硬盤第一個扇區(qū)之后,就開始由Linux來控制系統(tǒng)了。
啟動第二部--讀取MBR
硬盤上第0磁道第一扇區(qū)被稱為MBR,也就是Master Boot Record,即主導(dǎo)記錄,它的大小是512字節(jié),可里面卻存放了預(yù)啟動信息、分區(qū)表信息。可分為兩部分:第一部分為引導(dǎo)去,占了446個字節(jié);第二部分為分區(qū)表,共66個字節(jié),記錄硬盤的分區(qū)信息。預(yù)引導(dǎo)區(qū)的作用之一是找到標(biāo)記為活動的分區(qū),并將活動分區(qū)的引導(dǎo)讀入內(nèi)存。 系統(tǒng)找到BIOS所指定的硬盤MBR后,就會將其復(fù)制到0*7c00地址所在的物理內(nèi)存中。其實被復(fù)制到物理內(nèi)存的內(nèi)容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。
啟動第二部--讀取MBR
硬盤上第0磁道第一扇區(qū)被稱為MBR,也就是Master Boot Record,即主導(dǎo)記錄,它的大小是512字節(jié),可里面卻存放了預(yù)啟動信息、分區(qū)表信息??煞譃閮刹糠郑旱谝徊糠譃橐龑?dǎo)去,占了446個字節(jié);第二部分為分區(qū)表,共66個字節(jié),記錄硬盤的分區(qū)信息。預(yù)引導(dǎo)區(qū)的作用之一是找到標(biāo)記為活動的分區(qū),并將活動分區(qū)的引導(dǎo)讀入內(nèi)存。 系統(tǒng)找到BIOS所指定的硬盤MBR后,就會將其復(fù)制到0*7c00地址所在的物理內(nèi)存中。其實被復(fù)制到物理內(nèi)存的內(nèi)容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。
啟動第四步--加載內(nèi)核
根據(jù)grub設(shè)定的內(nèi)核映象所在路徑, 系統(tǒng)讀取內(nèi)存映象,并進(jìn)行解壓縮操作。此時,屏幕一般會輸出”Uncompressing Linux“的提示。當(dāng)解壓縮內(nèi)核完成后,屏幕輸出”O(jiān)K,booting the kernel”。 系統(tǒng)將壓縮后的內(nèi)核放置在內(nèi)存之中,并調(diào)用start_kernel()函數(shù)來啟動一系列的出事化函數(shù)并初始化各種設(shè)備,完成Linux核心環(huán)境的建立,至此Linux內(nèi)核已經(jīng)建立起來了,基于Linux的程序應(yīng)該可以正常運行了。 Start_kernel()定義在init/main.c中,它就類似于一般可執(zhí)行程序中的main()函數(shù),系統(tǒng)在此之前所做的僅僅是一些能讓內(nèi)核程序最低限度執(zhí)行的初始化操作,真正的內(nèi)核初始化過程是從這里才開始。函數(shù)start_kerenl()將會調(diào)用一系列的初始化函數(shù),用來完成內(nèi)核本身的各方面設(shè)置,目的是最終建立起基本完整的Linux核心環(huán)境。 在start_kenrel()的結(jié)尾,內(nèi)核通過kenrel thread()創(chuàng)建出第一個系統(tǒng)內(nèi)核線程(即1號進(jìn)程),該線程執(zhí)行的是內(nèi)核中的init()函數(shù),負(fù)責(zé)的是下一階段的啟動任務(wù)。最后調(diào)用cpues_idle()函數(shù),進(jìn)入了系統(tǒng)主循環(huán)體口默認(rèn)將一直執(zhí)行default_idele()函數(shù)中的指令,即CPU的halt指令,直到就緒隊列中存在其他進(jìn)程需要被調(diào)度是才會轉(zhuǎn)向執(zhí)行其他函數(shù),此時,系統(tǒng)中唯一存在就緒狀態(tài)的進(jìn)程就是由kernel_hread()創(chuàng)建的init進(jìn)程(內(nèi)核線程),所以內(nèi)核并不進(jìn)入default_idle()函數(shù),而是轉(zhuǎn)向init()函數(shù)繼續(xù)啟動過程。
啟動第五步--用戶層init依據(jù)inittab文件來設(shè)定運行等級
內(nèi)核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,并依據(jù)文件來進(jìn)行初始化工作。 其實/etc/inittab文件最主要的作用就是設(shè)定Linux的運行等級,其設(shè)定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設(shè)定如下: 0:關(guān)機 1:單用戶模式 2:無網(wǎng)絡(luò)支持的多用戶模式 3:有網(wǎng)絡(luò)支持的多用戶模式 4:保留,未使用 5:有網(wǎng)絡(luò)支持有X-Window支持的多用戶模式 6:重新引導(dǎo)系統(tǒng),即重啟
啟動第六步--Init進(jìn)程執(zhí)行rc.sysinit
在設(shè)定了運行等級后,Linux系統(tǒng)執(zhí)行的第一個用戶層文件就是/etc/rc.sysinit腳本 程序,它做的工作非常多,包括設(shè)定PATH、設(shè)定網(wǎng)絡(luò)配置(/etc/sysconfig/network)、啟動swap分區(qū)、設(shè)定/proc等等。線程init的最終完成狀態(tài)是能夠使得一般的用戶程序可以正常地被執(zhí)行,從而真正完成可供應(yīng)用程序運行的系統(tǒng)環(huán)境。準(zhǔn)備好以上一切之后,系統(tǒng)開始進(jìn)入用戶層的初始化階段。內(nèi)核通過系統(tǒng)調(diào)用execve()加載執(zhí)行相應(yīng)的用戶層初始化程序,依次嘗試加載程序”/sbin/init”,”/etc/init”、“/bin/init”,和“/bin/sh”.只要其中有一個程序加載獲得成功,那么系統(tǒng)就將開始用戶層的初始化,而不會再回到init()函數(shù)段中。至此,init()函數(shù)結(jié)束,Linux內(nèi)核的引導(dǎo)部分也到此結(jié)束。
啟動第七步--啟動內(nèi)核模塊
具體是依據(jù)/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內(nèi)核模塊。
啟動第八步--執(zhí)行不同運行級別的腳本程序
根據(jù)運行級別的不同,系統(tǒng)會運行rc0.d到rc6.d中的響應(yīng)的腳本程序,來完成相應(yīng)的初始化工作和啟動相應(yīng)的服務(wù)。
啟動第九步--執(zhí)行/etc/rc.d/rc.local
rc.lacal就是在一切初始化工作后,Linux留給用戶進(jìn)行個性化的地方,可以把設(shè)置和啟動的東西放到這里
啟動第十步--執(zhí)行/bin/login程序,進(jìn)入登錄狀態(tài)
此時,系統(tǒng)已經(jīng)進(jìn)入到了等待用戶輸入username和password的時候了,已經(jīng)可以用自己的帳號登入系統(tǒng)了。
2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區(qū);
(1) 為硬盤新建兩個主分區(qū);并為其安裝grub;
(2) 為硬盤的第一個主分區(qū)提供內(nèi)核和ramdisk文件; 為第二個分區(qū)提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設(shè)置為第一啟動項并能夠正常啟動目標(biāo)主機;
3、制作一個kickstart文件以及一個引導(dǎo)鏡像。描述其過程。
4、寫一個腳本
(1) 能接受四個參數(shù):start, stop, restart, status
start: 輸出“starting 腳本名 finished.”
...
(2) 其它任意參數(shù),均報錯退出;

5、寫一個腳本,判斷給定的用戶是否登錄了當(dāng)前系統(tǒng);
(1) 如果登錄了,則顯示用戶登錄,腳本終止;
(2) 每3秒鐘,查看一次用戶是否登錄;

6、寫一個腳本,顯示用戶選定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四項選擇,則提示錯誤,并要求用戶重新選擇,只到其給出正確的選擇為止;

7、寫一個腳本
(1) 用函數(shù)實現(xiàn)返回一個用戶的UID和SHELL;用戶名通過參數(shù)傳遞而來;
(2) 提示用戶輸入一個用戶名或輸入“quit”退出;
當(dāng)輸入的是用戶名,則調(diào)用函數(shù)顯示用戶信息;
當(dāng)用戶輸入quit,則退出腳本;進(jìn)一步地:顯示鍵入的用戶相關(guān)信息后,再次提醒輸出用戶名或quit:

8、寫一個腳本,完成如下功能(使用函數(shù))
(1) 提示用戶輸入一個可執(zhí)行命令的名字;獲取此命令依賴的所有庫文件;
(2) 復(fù)制命令文件至/mnt/sysroot目錄下的對應(yīng)的rootfs的路徑上,例如,如果復(fù)制的文件原路徑是/usr/bin/useradd,則復(fù)制到/mnt/sysroot/usr/bin/目錄中;
(3) 復(fù)制此命令依賴的各庫文件至/mnt/sysroot目錄下的對應(yīng)的rootfs的路徑上;規(guī)則同上面命令相關(guān)的要求;
