2012年8月29日 星期三

(轉)Linux-開機流程介紹1-boot loader與kernel 載入

開機不是只要按一下電源鈕而關機只要關掉電源鈕就可以了嗎?有何大學問?話是這樣沒錯啦,但是由於 Linux 是一套多人多工的作業系統,你難保你在關機時沒有人在線上,如果你關機的時候碰巧一大群人在線上工作, 那會讓當時在線上工作的人馬上斷線的!那不是害死人了!一些資料可是無價之寶哩!
  另外,與 DOS 環境不同的是, Linux 在執行的時候,雖然你在畫面上只會看到黑壓壓的一片,完全沒有任何畫面, 但其實他是有很多的程式在背景底下執行的,例如登錄檔管控程式、前面兩章提到的例行性命令, 當然還有一大堆網路服務,如郵件伺服器、WWW伺服器等等。你如果隨便關機的話, 是很容易傷害硬碟及資料傳輸的動作的!所以在 Linux 下關機可是一門大學問喔。
  既然開機是很嚴肅的一件事,呵呵,那我們來瞭解一下整個開機的過程吧! 好讓大家比較容易發現開機過程裡面發生錯誤的地方,與解決之道!不過,由於開機的過程中,那個開機管理程式 ( Boot Loader ) 使用的軟體可能不一樣,例如目前各大 Linux distributions 的主流為 grub, 但早期 Linux 預設是使用 LILO ,台灣地區則很多朋友喜歡使用 spfdisk 。 但無論如何,我們總是得要瞭解整個 boot loader 的工作情況,才能瞭解為何進行多重開機的設定時, 為何老是聽人家講要先安裝 Windows 再安裝 Linux 的原因~
  我們先來想一想, Linux 整個開機的程序是怎樣呢?還記得我們提過,開機時要載入核心, 讓核心來驅動整個硬體,這樣才能算是一個最陽春、最基礎的作業系統吧?然後才能夠執行各種程式的運作。 同樣的,開機的流程也是需要先載入核心的。不過,載入核心前,卻需要一些前置作業,才能夠正確無誤的載入核心嘛! 所以,整個開機的程序是這樣的:
  1. 載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號;
  2. 讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊;
  3. 載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
  4. Kernel 執行 init 程式並取得 run-level 資訊;
  5. init 執行 /etc/rc.d/rc.sysinit 檔案;
  6. 啟動核心的外掛模組 (/etc/modprobe.conf);
  7. init 執行 run-level 的各個批次檔( Scripts );
  8. init 執行 /etc/rc.d/rc.local 檔案;
  9. 執行 /bin/login 程式,並等待使用者登入;
  10. 登入之後開始以 Shell 控管主機。
(評論:linux開機順序,第一先讀bios,讀取硬件信息,然後根據bios的設定讀取第一個硬盤的master boot record即MBR。MBR中安裝有boot loader,boot loader解釋核心的文件系統並且指向系統核心的文件。通過boot loader解壓縮系統核心,並將系統核心加載到內存中。總之,系統先讀bios,再根據bios讀取硬盤的MBR,再根據MBR中的boot loader分析系統核心的文件系統。並指向系統核心。
雖然以上分析很複雜,但是管理員接觸就只是grub和lilo等開機程序而已。grub是安裝在MBR內一個小程序,這個小程序能夠認識核心的文件系統。

  大概的流程就是上面寫的那個樣子啦,而每一個程序的內容主要是在幹嘛呢?底下就分別來談一談吧!
  boot loader 與 kernel 載入
  由第一篇裡面談到的一些基礎的主機硬體概念當中,我們知道整個主機在開機的時候,第一個被讀取的地方, 就是 BIOS ( Basic Input Output System ) 啦,這個 BIOS 裡面記錄了主機板的晶片組與相關的設定, 例如 CPU 與周邊設備的溝通時脈啊、開機裝置的搜尋順序啊、硬碟的大小與類型啊、 系統時間啊、各周邊匯流排的是否啟動 Plug and Play (PnP, 隨插即用裝置) 啊、 各周邊設備的 I/O 位址啊、以及與 CPU 溝通的 IRQ 岔斷等等的資訊都記錄在此, 所以囉,系統要順利的開機,首先就是要去讀取 BIOS 的相關設定值了。
  讀取了 BIOS 設定值之後,系統會根據 BIOS 的資料,進行開機自我測試 (power on self test, POST), 然後開始執行硬體偵測的初始化,並設定 PnP 裝置,之後再定義出可開機的裝置, 之後就會開始進行開機裝置的資料讀取了 (MBR 相關的任務開始)。
  讀完了 BIOS 並且瞭解了主要的主機硬體相關資訊後,主機便會開始嘗試由儲存媒體載入作業系統了。 我們剛剛提到 BIOS 會記錄『可用來開機的裝置搜尋順序』對吧!所以,系統會開始去第一個開機裝置上面進行開機程序。 我們在第二篇的 磁碟檔案系統(filesystem) 當中提到過整個儲存裝置的特性, 如果以硬碟來看,那麼開機流程讀到硬碟的過程中,第一個要讀取的就是該硬碟的主要開機磁區 (Master Boot Record, MBR) 了,而系統可以由主要開機區所安裝的開機管理程式 (boot loader) 開始執行核心辨識的工作。
  
Tips:
  我們知道每顆硬碟的第一個磁區稱為 MBR ,那麼如果我的主機上面有兩顆硬碟的話, 系統會去哪顆硬碟的 MBR 讀取資料呢?這個就得要看 BIOS 的設定了。 基本上,我們常常講的『系統的 MBR'其實指的是 第一個開機裝置的 MBR 才對! 所以,改天如果您要將開機管理程式安裝到某顆硬碟的 MBR 時, 要特別注意當時系統的『第一個開機裝置』是那個,否則會安裝到錯誤的硬碟上面喔!重要重要!   
  那麼為什麼要在 MBR 安裝 boot loader 呢?而這個 boot loader 有什麼功能呢? 還記得我們在第二篇提到的 磁碟檔案系統 吧? 我們的作業系統核心必須要認識磁碟檔案系統才能讀取裡面的資料啊, 但是整個系統才剛剛到開機起頭的地方而已,要如何認識磁碟檔案格式呢? 那就得要藉由 boot loader 來輔助啦!所以囉,當然必須要有 boot loader 才有辦法載入 Linux 的核心 (kernel) 啊!由於 boot loader 的特殊功能,因此,想要載入 Linux 核心時, 當然得使用支援 Linux filesystem 的 boot loader 了,目前主流的 grub 這套開機管理程式, 不但可以支援 Linux ,同時也支援 Windows 相關的核心系統呢!
  好了,先再來回憶一下,如果你是以 grub 程式開機的話,那麼在開機的時候會顯示什麼資料呢?呵呵! 會顯示蠻多的開機選單,沒錯~就是『選單』,然後選擇了你的選擇項目之後, 系統就會跑到該磁區去讀取該作業系統的核心囉!呵呵!所以一個好的 boot loader 會具有兩個功能,就是:
  * 選單功能 (menu)
  * 指向功能 (pointer)
作業系統的核心在硬盤上,管理員通過grub這個小程序操作核心系統的文件,開啟整個操作系統。
一個boot loader引導一個操作系統,如果是windows和linux並存,則是兩個boot loader引導兩個操作系統,開機管理程式boot loader除了可以安裝在MBR之外, 還可以安裝在每個分割槽的開機磁區(boot sector),通過MBR內boot loader的選項,管理員可以選擇指向另一個分區的boot loader,這另一個boot loader在另一個分區的boot sector內,這就是多重開機原理。
  再來強調一下,因為 Windows 與 Linux 的檔案格式不一樣?! 為了載入系統核心,所以必須要安裝認識我們作業系統的 loader, 而 Linux 的 loader ( lilo 或 grub ) 是可以認識 windows 的核心檔案的,但是 Windows 的 loader 卻不認識 Linux 的核心檔案,因此,作為一個多重開機的設定 loader ,就無法使用 Windows 所提供的 loader 囉!由於需要讓系統認識你的 kernel ,因此,就需要 boot loader 啦!這樣想就對啦!
安裝windows操作系統時,windows操作系統的boot loader會將MBR中的內容全部覆蓋掉,所以在安裝多重操作系統時,最好先安裝windows,再安裝linux,如果先安裝linux,則 windows會把linux的boot loader覆蓋掉,導致linux無法開機。
  好了,當我們藉由 boot loader 的管理而開始讀取核心檔案後,接下來, Linux 就會將核心解壓縮到主記憶體當中, 並且利用核心的功能,開始測試與驅動各個周邊裝置,包括儲存裝置、CPU、網路卡、音效卡等等。 那麼核心檔案在哪裡啊?一般來說,他會被放置到 /boot 裡面, 並且取名為 /boot/vmlinuz 才對!
  在載入核心的過程當中,我們必須要知道的是,系統只會『掛載根目錄』而已,而且是以唯讀的方式掛載的。 此外,有時為了讓某些功能可以用檔案的方式來讀取,因此,有的系統在開機的時候, 會製作所謂的虛擬硬碟 (RAM Disk) 來輔助的,那就是 initrd 以及 linuxrc 的功用了。 利用 boot loader 的功能,可以在載入核心的時候,一起載入 initrd 的映像檔 (/boot/initrd-xxxx.img), Linux 系統會主動的以 initrd (man 4 initrd) 來進行虛擬硬碟的建置, 並且利用 linuxrc (包含在 initrd 的映像檔內) 這個程式的功能來進行載入模組的動作。 linuxrc 主要的特性是:
  * 必須是 linuxrc 這個檔名;
  * 必須放置在 initrd 所建立的虛擬磁碟的最頂層目錄;
  * 必須要可以被核心所執行。
  在核心驅動周邊硬體的工作完成之後, initrd 所建立的虛擬磁碟就會被移除了! 不過您要注意的是, initrd 並非必要的,是可有可無的,要看您當初建立該核心的時候, 整個編譯的角度與過程。一般來說,各大 Linux distributions 在建立核心時, 都會一起建立出這個 initrd 的映像檔,輔助開機的順利進行。
  總之,在這個過程當中, boot loader 可以找到 Linux 的核心檔案並且將他載入到主記憶體當中, 同時可能可以藉由 initrd 建立起虛擬硬碟 (RAM Disk) 輔助開機的進行, 最後,將讀自 BIOS 的主機硬體資料交由 Linux 核心來進行偵測並且載入適當的驅動程式 (driver) ,就讓整個主機硬體準備系統的要求了。整個流程有點像這樣:


在核心完整的載入後,您的主機應該就開始正確的運作了,接下來,就是要開始執行系統的第一支程式: init。

init是Linux系統操作中不可缺少的程序之一。 是一個由內核啟動的用戶級進程。

  內核啟動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啟動一個用戶級程序init的方式來啟動其他用戶級的進程或服務。所以,init始終是第一個進程(其PID始終為1)。

  內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/sbin/init.如果內核找不到init,它就會試著運行/bin/sh,如果運行失敗,系統的啟動也會失
敗。
====================
  在核心載入完畢之後,此時系統應該就已經準備妥當,等待程式的執行了。而整個 Linux 系統當中第一支被執行的程式就是『 /sbin/init 』囉~這也是我們在前一章使用 ps aux |more 時, 看到第一行所顯示的程序內容 (PID 為 1 的那行啦) ! init 這支程式所做的工作相當的多, 他除了利用設定檔『 /etc/inittab 』來取得開機的等級 ( Run level ) 之外,還會經由這個 run level 的設定值來進行不同的開機服務項目的啟動。
  那麼什麼是 run level 呢?他有什麼功用啊?其實很簡單啦, Linux 就是藉由設定 run level 來規定系統使用不同的服務來啟動,讓 Linux 的使用環境不同。基本上,依據有無網路與有無 X Window 而將 run level 分為六個等級,分別是:
  * 0 - halt (系統直接關機)
  * 1 - single user mode (單人維護模式,用在系統出問題時的維護)
  * 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)
  * 3 - Full multi-user mode (完整的含有網路功能的純文字模式)
  * 4 - unused (系統保留功能)
  * 5 - X11 (與 runlevel 3 類似,但使用 X Window)
  * 6 - reboot (重新開機)
  由於 run level 0, 4, 6 不是關機、重新開機就是系統保留的,所以:『 您當然不能將預設的 run level 設定為這三個值 』, 否則系統就會不斷的自動關機或自動重新開機....
  好了,那麼我們開機時,到底是如何取得系統的 run level 的?呵呵!當然是 /etc/inittab 所設定的囉! 那麼 /etc/inittab 到底有什麼資訊呢?我們先來看看這個檔案的內容好了:
  [root@linux ~]# vi /etc/inittab
  # 設定系統開機預設的 run level 設定項目:
  id:3:initdefault:
  # 開始進行 run level 的服務啟動前,使用來偵測與初始化系統環境的設定檔:
  si::sysinit:/etc/rc.d/rc.sysinit
  # 7 個不同 run level 的,需要啟動的服務的 scripts 放置路徑:
  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
  # 是否允許按下 [ctrl]+[alt]+[del] 就重新開機的設定項目:
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  # 本機端終端機啟動的個數:
  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
  # 在 X Window (run level 5) 環境下的啟動 script 設定項目:
  x:5:on
ce:/etc/X11/prefdm -nodaemon
  這個檔案的語法是這樣的:
  [設定項目]:[run level]:[init 的動作行為]:[指令項目]
  1. 設定項目:
  最多四個字元,代表 init 的主要工作項目,只是一個簡單的代表說明。
  2. run level:
  該項目在哪些 run level 底下進行的意思。如果是 35 則代表 runlevel 3 與
  5 都會執行。
  3. init 的動作項目:
  主要可以進行的動作項目意義有:
 
   respawn:表示init應該監視這個進程,即使其結束後也應該被重新啟動。

  wait:init應該運行這個進程一次,並等待其結束後再進行下一步操作。

  once:init需要運行這個進程一次。

  boot:隨系統啟動運行,所以runlevel值對其無效。

  bootwait:隨系統啟動運行,並且init應該等待其結束。

  off:沒有任何意義。

  initdefault:系統啟動後的默認運行級別;由於進入相應的運行級別會激活對應級別的進程,所以對其指定process字段沒有任何意義。如果inittab文件內不存在這一條記錄,系統啟動時在控制台上詢問進入的運行級。

  sysinit:系統啟動時準備運行的命令。比如說,這個命令將清除/tmp.可以查看/etc/rc.d/rc.sysinit腳本瞭解其運行了那些操作。

  powerwait:允許init在電源被切斷時,關閉系統。當然前提是有U P S和監視U P S並通知init電源已被切斷的軟件。RH linux默認沒有列出該選項。

  powerfail:同powerwait,但init不會等待正在運行的進程結束。RH linux默認沒有列出該選項。

  powerokwait:當電源監視軟件報告「電源恢復」時,init要執行的操作。

  powerfailnow:檢測到ups電源即將耗盡時,init要執行的操作,和powerwait/powerfail不同的喲。

   ctrlaltdel:允許init在用戶於控制台鍵盤上按下Ctrl + Alt + Del組合鍵時,重新啟動系統。注意,如果該系統放在一個公共場所,系統管理員可將Ctrl + Alt + Del組合鍵配置為別的行為,比如忽略等。我是設置成打印一句罵人的話了^o^. kbrequest:監視到特定的鍵盤組合鍵被按下時採取的動作,現在還不完善。

  ondemand:A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called. However, no runlevel change will occur (ondemand runlevels are 『a', 『b',and 『c'),(英語太菜,那個however不知道該怎麼翻譯才好。慚愧!)


  4. 指令項目:
  亦即應該可以進行的指令,通常是一些 script 囉。
  所以我們可以得到這樣的結論:
  * 如果不想讓使用者利用 [crtl]+[alt]+[del] 來重新啟動系統,可以將底下這一行註解掉:
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  * 規定開機的預設 run level 是純文字 (3) 或者是具有圖形介面 (X Window, 5) ,可經由 『 id:3:initdefault: 』那個數字來決定! 以鳥哥自己這個檔案為例,我是使用純文字喔!
  所以說,你現在會自行修改登入時的預設 run level 設定值了嗎?夠簡單的吧? 一般來說,我們預設都是 3 或者是 5 來作為預設的 run level 的。但有時後可能需要進入 run level 1, 也就是單人維護模式的環境當中。這個 run level 1 有點像是 Windows 系統當中的『安全模式』啦, 專門用來處理當系統有問題時的操作環境。此外,當系統發現有問題時,舉例來說,不正常關機造成 filesystem 的不一致現象時,系統會主動的進入單人維護模式呢!
  好了, init 在取得 run level 之後,接下來要幹嘛? 上面 /etc/inittab 檔案內容不是有提到 sysinit 嗎?嘿嘿!準備初始化系統了吧!
 
init 處理系統初始化流程 (/etc/rc.d/rc.sysinit)
  還記得上面提到 /etc/inittab 裡頭有這一句『 si::sysinit:/etc/rc.d/rc.sysinit 』吧? 這表示:『我開始載入各項系統服務之前,得先做好整個系統環境,我主要利用 /etc/rc.d/rc.sysinit 這個 shell script 來設定好我的系統環境的。』夠清楚了吧? 所以,我想要知道到底 FC4 開機的過程當中幫我進行了什麼動作, 就得要仔細的分析 /etc/rc.d/rc.sysinit 囉。
  Tips:
  老實說,這個檔案的檔名在各不同的 distributions 當中都不相同, 例如 SuSE server 9 就使用 /etc/init.d/boot 與 /etc/init.d/rc 來進行的。 所以,你最好還是自行到該檔案去察看一下系統的工作喔! ^_^ 
  
  /etc/rc.d/rc.sysinit 主要的工作大抵有這幾項:
  1. 取得網路環境與主機類型:
  首先讀取網路設定檔 /etc/sysconfig/network ,取得主機名稱與預設通訊閘 (gateway) 等網路環境。
  2. 測試與掛載記憶體裝置 /proc 及 USB 裝置 /sys:
  除掛載記憶體裝置 /proc 之外,還會主動偵測系統上是否具有 usb 的裝置, 若有則會主動載入 usb 的驅動程式,並且嘗試掛載 usb 的檔案系統。
  3. 決定是否啟動 SELinux :
  近期以來,很多 distributions 都加入了美國國家安全局發展的 Security Enhance Linux 套件, 這個 SELinux 可以更加強化 Linux 操作環境的安全性,不過,由於安全掛帥, 對於新手來說,不是很容易上手。因此,我們才會建議大家先不要啟動啊。無論如何, 在這個階段我們可以分析 SELinux 是否要啟動。
  4. 周邊設備的偵測與 Plug and Play (PnP) 參數的測試:
  根據核心在開機時偵測的結果 (/proc/sys/kernel/modprobe ) 開始進行 ide / scsi / 網路 / 音效 等周邊設備的偵測,以及利用以載入的核心模組進行 PnP 裝置的參數測試。
  5. 使用者自訂模組的載入
  使用者可以在 /etc/sysconfig/modules/*.modules 加入自訂的模組, 則此時會被載入到系統當中喔!
  6. 載入核心的相關設定:
  系統會主動去讀取 /etc/sysctl.conf 這個檔案的設定值,使核心功能成為我們想要的樣子。
  7. 設定系統時間 (clock):
  8. 設定終端機 (console) 字形:
  9. 設定 RAID 與 LVM 等硬碟功能:
  10. 以 fsck 檢驗磁碟檔案系統:
  11. 進行磁碟配額 quota 的轉換 (非必要):
  12. 重新以可讀取模式掛載系統磁碟:
  13. 啟動 quota 功能:
  14. 啟動系統亂數裝置 (產生亂數功能):
  15. 清除開機過程當中的暫存檔案:
  16. 將開機相關資訊載入 /var/log/dmesg 檔案中。
  如此一來,在 /etc/rc.d/rc.sysinit 就已經將基本的系統設定資料都寫好了,也將系統的資料設定完整! 而如果你想要知道到底開機的過程中發生了什麼事情呢?那麼就使用 dmesg 就可以知道囉。 另外,基本上,在這個檔案當中所進行的很多工作的預設設定檔,其實都在 /etc/sysconfig 當中呢! 所以,請記得將 /etc/sysconfig 內的檔案好好的瞧一瞧喔! ^_^
  在這個過程當中,比較值得注意的是自訂模組的載入!在 FC4 當中,如果我們想要載入核心模組的話, 可以將整個模組寫入到 /etc/sysconfig/modules/*.modules 當中,在該目錄下, 只要記得檔名最後是以 .modules 結尾即可。 這個過程是非必要的,因為我們目前的預設模組實在已經很夠用了,除非是您的主機硬體實在太新了, 非要自己載入新的模組不可,否則,在經過 /etc/rc.d/rc.sysinit 的處理後, 你的主機系統應該是已經跑得很順暢了啦!就等著你將系統相關的服務與網路服務啟動囉!
 
啟動系統服務與相關啟動設定檔 (/etc/rc.d/rc.n & /etc/sysconfig)
  載入核心讓整個系統準備接受指令來工作,然後再經過 /etc/rc.d/rc.sysinit 的系統模組與相關硬體資訊的初始化後,你的 FC4 系統應該已經順利工作了。 只是,我們還得要啟動系統所需要的各項『服務』啊!這樣主機才能提供我們相關的網路或者是主機功能嘛! 這個時候,依據我們在 /etc/inittab 裡面提到的 run level 設定值,就可以來決定啟動的服務項目了。 舉例來說,使用 run level 3 當然就不需要啟動 X Window 的相關服務囉,您說是吧?
  那麼各個不同的 run level 服務啟動的各個 shell script 放在哪?還記得 /etc/inittab 裡面提到的:
  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
  上面提到的就是各不同 run level 放置的目錄啦!舉例來說, run level 3 的啟動目錄就是放在 /etc/rc.d/rc3.d 目錄當中囉~當然啦,不同的 distributions 這個目錄可能會有差異, 所以,您還是得要自行到 /etc/inittab 裡面瞧一瞧先!那麼在這個目錄當中有什麼咚咚啊? 我們先以鳥哥自己的宿舍的 FC4 主機裡頭的 run level 3 的啟動目錄瞧一瞧:
  [root@linux ~]# ls -l /etc/rc.d/rc3.d
  lrwxrwxrwx  1 root root 13 Jun 29 01:05 K01yum -> ../init.d/yum
  lrwxrwxrwx  1 root root 19 Jun 29 01:05 K02haldaemon -> ../init.d/haldaemon
  .....中間省略......
  lrwxrwxrwx  1 root root 17 Sep 16 14:09 S01sysstat -> ../init.d/sysstat
  lrwxrwxrwx  1 root root 17 Jun 29 01:05 S10network -> ../init.d/network
  lrwxrwxrwx  1 root root 16 Jun 29 01:05 S12syslog -> ../init.d/syslog
  .....中間省略......
  lrwxrwxrwx  1 root root 11 Jun 25 08:27 S99local -> ../rc.local
  在這個目錄下的檔案很有趣,全部都是以 S 或者是 K 為開頭的檔案,而且全部都是連結檔, 連結到 /etc/rc.d/init.d 裡面的 shell script 呢!而在 /etc/rc.d/init.d 這個目錄其實與 /etc/init.d 是一樣的,因為這兩個目錄是連結檔啊!要注意的是,在 /etc/rc.d/init.d/ 底下的 shell scripts 都使用 case.....esac 的語法,而且支援的變數 ($1) 主要有 start 及 stop , 相關的 shell script 請您回到第三篇去複習。所以,一般來說,如果我們想要啟動一些系統服務,例如啟動 atd , 需要使用:
  /etc/rc.d/init.d/atd start (也可以用 /etc/init.d/atd start)
  如果是關閉該服務,就是使用:
  /etc/rc.d/init.d/atd stop
  瞭解鳥哥想要表達的東西了嗎?是的~如果我想要在 run level 3 的環境下執行某個服務, 當然就得要將該服務寫入 /etc/rc.d/rc3.d 裡面去,而既然我們的服務已經在 /etc/rc.d/init.d 裡面建立好了, 自然可以使用連結的方式連結到 /etc/rc.d/init.d/ 內的相關的 shell script 啦。不過,為瞭解決 start 或 stop 這個變數,因此就有了 S 與 K 開頭的檔名了。
  另外,各不同的服務其實還是互有關係的,舉例來說,如果要啟動 WWW 服務,總是得要有網路吧? 所以囉, /etc/rc.d/init.d/network 就會比較先被啟動啦!那麼您就會知道在 S 或者是 K 後面接的數字是啥意思了吧?嘿嘿,那就是執行的順序啦!所以說:
  * 在 /etc/rc.d/rc3.d 內的,以 S 為開頭的檔案,為開機時,需要『啟動, start'的服務;
  * 在該目錄內的 K 為開頭的檔案,為『關機時需要關閉的服務, stop'的檔案連結;
  * 在 S 與 K 後面接的數字,代表該檔案被執行的順序。
  舉例來說,在上表當中, S10network 指向 ../init.d/network ,代表:開機時,執行『 /etc/rc.d/init.d/network start 』的意思,而 S12syslog 則代表開機時執行『 /etc/rc.d/init.d/syslog start 』的意思,且 S10network 要比 S12syslog 還要早執行喔! 所以囉,看到最後一個被執行的項目是啥?呵呵!沒錯,就是 S99local ,亦即是: /etc/rc.d/rc.local 這個檔案啦!
  好了,那麼問題來了,我要如何建立 /etc/rc.d/init.d 裡面的檔案呢? 很簡單啊,看一下 /etc/rc.d/init.d/atd 的內容就知道了,而更多的 services 啟動與相關說明,我們會在後續的 認識系統服務 詳談。 而將 /etc/rc.d/init.d/ 連結到 /etc/rc.d/rc3.d 的方法,除了手動建立外, 其實我們都是以 chkconfig 這個程式來進行管理的呢!更多的 chkconfig 請參考認識系統服務那一章。

 
 

沒有留言:

張貼留言