我們要成為某一方面的專家,就必須深知它的原理,知道它最基層的構(gòu)架,這樣我們才可以以不變應(yīng)萬(wàn)變,Linux 也是一樣,我們要想玩弄Linux股掌之中,就必須先知道它的基礎(chǔ),它是如何讓啟動(dòng)的。 下面就大致說(shuō)一下啟動(dòng)的順序:BIOS通電自檢--主引導(dǎo)加載程序--內(nèi)核初始化--系統(tǒng)初始化 具體如下: 主板通電--啟動(dòng)BIOS--加載BIOS硬件信息并自檢--獲取第一個(gè)設(shè)備啟動(dòng)號(hào)(MBR)--啟動(dòng)硬盤(pán)的主引導(dǎo)記錄MBR--啟動(dòng)內(nèi)核加載程序grub--加載內(nèi)核并嘗試驅(qū)動(dòng)所有硬件設(shè)備(由initrd實(shí)現(xiàn))--內(nèi)核初始化完成,運(yùn)行第一個(gè)程序init,init通過(guò)inittab的信息進(jìn)行工作--運(yùn)行/etc/rc.d/rc.sysinit進(jìn)行系統(tǒng)初始化--啟動(dòng)內(nèi)核模塊(/etc/modprobe.comf)--init執(zhí)行對(duì)應(yīng)啟動(dòng)級(jí)別下的腳本(/erc/rc.d/rc*.d)--init執(zhí)行/etc/rc.d/rc.local文件--執(zhí)行/bin/login程序等待用戶登錄 上面的是不是看著有點(diǎn)不明白,沒(méi)關(guān)系,先看一下下面的這些介紹,然后會(huì)有更詳細(xì)的開(kāi)機(jī)啟動(dòng)介紹。 大家要搞清楚系統(tǒng)啟動(dòng)的過(guò)程,就必須知道每一步用到的文件和程序是用來(lái)做什么的,定義了什么。 BIOS是英文"Basic Input Output System"的縮略語(yǔ),直譯過(guò)來(lái)后中文名稱就是"基本輸入輸出系統(tǒng)"。其實(shí),它是一組固化到計(jì)算機(jī)內(nèi)主板上一個(gè)ROM芯片上的程序,它保存著計(jì)算機(jī)最重要的基本輸入輸出的程序、系統(tǒng)設(shè)置信息、開(kāi)機(jī)后自檢程序和系統(tǒng)自啟動(dòng)程序。 其主要功能是為計(jì)算機(jī)提供最底層的、最直接的硬件設(shè)置和控制。 MBR: 每一個(gè)硬盤(pán)的第一個(gè)記錄稱為MBR。MBR 是英文Master Boot Record的縮寫(xiě),中文意為主引導(dǎo)記錄。硬盤(pán)的0磁道的第一個(gè)扇區(qū)就叫做MBR,它的大小是512字節(jié),而這個(gè)區(qū)域可以分為兩個(gè)部分。第一部分為pre- boot區(qū)(預(yù)啟動(dòng)區(qū)),占446字節(jié),用于加載啟動(dòng)第二部分,第二部分是Partition table區(qū)(分區(qū)表),占64個(gè)字節(jié)(每16個(gè)字節(jié)標(biāo)配一個(gè)分區(qū),所以我們的硬盤(pán)只能有四個(gè)主分區(qū),就在這里定義),該區(qū)相當(dāng)于一個(gè)小程序,作用是判斷哪個(gè)分區(qū)被標(biāo)記為活動(dòng)分區(qū),然后去讀取那個(gè)分區(qū)的啟動(dòng)區(qū),并運(yùn)行該區(qū)中的代碼 為什么要使用在MBR中安裝引導(dǎo)加載程序:操作核心必須要認(rèn)識(shí)磁盤(pán)文件系統(tǒng),才能讀取里面的內(nèi)容,但此時(shí)系統(tǒng)才剛開(kāi)始啟動(dòng),系統(tǒng)要如何認(rèn)識(shí)文件系統(tǒng)呢?這時(shí)候就必須要有引導(dǎo)加載程序,才能加載內(nèi)核。當(dāng)前主流的grup引導(dǎo)加載程序可以支持Linux 和 Windows 的核心系統(tǒng)。 initrd: 首先我們要知道,系在加載內(nèi)核的過(guò)程中,系統(tǒng)只會(huì)以只讀方式載入根目錄,所以為了系統(tǒng)啟動(dòng)的順序進(jìn)行,我們引入initrd概念。Linux 初始 RAM 磁盤(pán)(由initrd建立)是在系統(tǒng)引導(dǎo)過(guò)程中掛載的一個(gè)臨時(shí)根文件系統(tǒng),用來(lái)支持兩階段的引導(dǎo)過(guò)程。initrd 文件中包含了各種可執(zhí)行程序和驅(qū)動(dòng)程序,它們可以用來(lái)掛載實(shí)際的根文件系統(tǒng),然后再將這個(gè) initrd RAM 磁盤(pán)卸載,并釋放內(nèi)存。 關(guān)于rc*:init根據(jù)inittab文件定義的開(kāi)機(jī)啟動(dòng)默認(rèn)級(jí)別進(jìn)入的相應(yīng)系統(tǒng)級(jí)別,然后調(diào)用/etc/rc.d/rc根據(jù)級(jí)別參數(shù)執(zhí)行相應(yīng)級(jí)別目錄/etc/rc.d/rc*.d/下的腳本 內(nèi)核初始化過(guò)程的配置文件機(jī)器作用:/var/log/dmesg 1 硬件設(shè)備的探測(cè) 2 initrd文件,從中加載額外的設(shè)備驅(qū)動(dòng) 3 以只讀的方式掛載根文件系統(tǒng) 4 裝載init進(jìn)程 /sbin/init 系統(tǒng)的第一個(gè)進(jìn)程init的配置文件及作用:/etc/inittab 1 設(shè)定默認(rèn)運(yùn)行級(jí)別 2 啟動(dòng)系統(tǒng)初始化腳本 3 執(zhí)行指定運(yùn)行級(jí)別下的每一個(gè)啟動(dòng)腳本 4 設(shè)定CTRL+ALT+DEL組合鍵功能 5 設(shè)定該電源故障時(shí)執(zhí)行的腳本 6 設(shè)定要啟動(dòng)的虛擬控制臺(tái)/dev/tty[1-6] 7 設(shè)定當(dāng)啟動(dòng)運(yùn)行級(jí)別為5時(shí)做GUI初始化的腳本 我們看一下inittab文件里面的具體內(nèi)容: 1: id:5:initdefault: 系統(tǒng)默認(rèn)啟動(dòng)級(jí)別 2: si::sysinit:/etc/rc.d/rc.sysinit 執(zhí)行系統(tǒng)初始化腳本 3:l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 使用rc腳本執(zhí)行rc*.d目錄內(nèi)的腳本 目錄/etc/rc*.d/中以S開(kāi)頭的表示進(jìn)入該級(jí)別時(shí)要執(zhí)行的腳本 K開(kāi)頭離開(kāi)該級(jí)別時(shí)要關(guān)閉的腳本 這些腳本都為鏈接文件,真正的腳本位于/etc/init.d/下! 4:ca::ctrlaltdel:/sbin/shutdown -t3 -r now 設(shè)定CTRL+ALT+DEL組合鍵功能 5:pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" 電源故障處理 6:pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 電源重新恢復(fù)關(guān)機(jī)取消處理 7: 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 標(biāo)示6個(gè)虛擬控制臺(tái),respawn:用戶退出時(shí)虛擬控制臺(tái)關(guān)閉再開(kāi)啟等待用戶下一次進(jìn)入 8:x:5:respawn:/etc/X11/prefdm -nodaemon 啟動(dòng)圖形界面等待用戶登錄 系統(tǒng)初始化腳本/etc/rc.d/rc.sysinit 1 激活udev和selinux 2 設(shè)置內(nèi)核啟動(dòng)參數(shù) /etc/sysctl.conf 3 設(shè)置系統(tǒng)時(shí)鐘 4 裝載鍵盤(pán)映射 5 啟用交換分區(qū) (虛擬內(nèi)存) 6 設(shè)置主機(jī)名稱 /etc/sysconfig/network 7 根文件系統(tǒng)自檢并重新以讀寫(xiě)方式掛載根文件系統(tǒng) 8 激活RAID和LVM設(shè)備 9 啟動(dòng)磁盤(pán)配額 10 檢查ing掛載其他文件系統(tǒng) /etc/fstab 11 清除不再使用鎖和PID文件 大家看過(guò)上面的文件信息后,我再重述一遍linux的開(kāi)機(jī)啟動(dòng)過(guò)程,希望能是大家的思路更加清晰: 開(kāi)機(jī)通電后,BIOS進(jìn)行自檢,并且自己獲得一個(gè)設(shè)備啟動(dòng)號(hào),也就是將MBR定義為第一個(gè)要啟動(dòng)的設(shè)備,BIOS自檢完成就將控制權(quán)交給MBR,MBR分為兩部分,第一部分446字節(jié),它的唯一作用就是引導(dǎo)第二部分,也就是我們常用的grub,grub通過(guò)其菜單功能和指向功能讓我們選擇需要加載的內(nèi)核。通過(guò)引導(dǎo)加載程序讀取內(nèi)核文件(我們的內(nèi)核文件一般放在/boot/vmlinuz-servion)后,機(jī)器會(huì)將內(nèi)核解壓到主存,然后通過(guò)內(nèi)核功能來(lái)進(jìn)行設(shè)備檢測(cè)。在內(nèi)核加載過(guò)程中,系統(tǒng)只會(huì)以只讀方式載入根目錄,為了讓某些功能能以文件方式來(lái)讀取,在系統(tǒng)啟動(dòng)時(shí),就需要用initrd建立虛擬盤(pán)(RAM disk),所在grub利用引導(dǎo)加載功能加載核心是,也會(huì)加載進(jìn)initrd的映像文件/boot/initrd-****.img,然后內(nèi)核會(huì)自動(dòng)以initrd來(lái)建立虛擬盤(pán),并且用initrd-***.img文件內(nèi)的linuxrc(筆者系統(tǒng)里的該程序名字為init)程序來(lái)加載模塊,內(nèi)核驅(qū)動(dòng)外部硬件的工作完成,虛擬盤(pán)刪除。核心加載完成后,系統(tǒng)準(zhǔn)備就緒,執(zhí)行第一個(gè)進(jìn)程/sbin/init,通過(guò)id:5:initdefault: 設(shè)置系統(tǒng)默認(rèn)啟動(dòng)級(jí)別,通過(guò)si::sysinit:/etc/rc.d/rc.sysinit 執(zhí)行系統(tǒng)初始化腳本,通過(guò)l*:*:wait:/etc/rc.d/rc * 使用rc腳本執(zhí)行rc*.d目錄和rc.local目錄內(nèi)腳本。(Redhat中的運(yùn)行模式2、3、5都把/etc/rc.d/rc.local做為初始化腳本中的最后一個(gè)) 至此整個(gè)系統(tǒng)啟動(dòng)完成! 下面思考下:我們想要在開(kāi)機(jī)時(shí)自動(dòng)運(yùn)行一個(gè)命令,該如何實(shí)現(xiàn)呢?以cvslockd命令為例 1:在/etc/rc.d/init.d/目錄下 #vim cvslockd #!/bin/bash /usr/local/bin/cvslockd 命令的全路徑 為腳本添加執(zhí)行權(quán)限 #chmod +x /etc/rc.d/init.d/cvslockd 2:在文件/etc/inittab中查看系統(tǒng)的運(yùn)行級(jí)別id:5:initdefault:,表示級(jí)別為5 3. 到/etc/rc.d/rc5.d目錄下,把你要執(zhí)行的可執(zhí)行文件做一個(gè)軟連接,而且在命名的時(shí)候要以大寫(xiě)S字母開(kāi)頭,S之后的數(shù)字大小代表執(zhí)行順序的先后,數(shù)字越大越后執(zhí)行。 #ln -s /etc/rc.d/init.d/cvslockd /etc/rc5.d/S100cvslockd #ln -s /etc/rc.d/init.d/cvslockd /etc/rc0.d/K20cvslockd 方法二: 在/etc/rc.d/rc.local 添加 exec /usr/local/bin/cvslockd 該方式是在最后啟動(dòng)cvslockd
轉(zhuǎn)載自http://linuxzoe.blog.51cto.com/3005391/564940
|