Linux 基礎學習篇 - Mandrake 9

第十七章、開機流程分析 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2003/02/10

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

開機流程分析

開機不是只要按一下電源鈕而關機只要關掉電源鈕就可以了嗎?有何大學問?話是這樣沒錯啦,但是由於 Linux 是一套多人多工的作業系統,你難保你在關機時沒有人在線上,如果你關機的時候碰巧一大群人在線上工作,那會讓當時在線上工作的人馬上斷線的!那不是害死人了!一些資料可以無價之寶哩!另外,與 DOS 環境不同的是, Linux 在執行的時候,雖然你在畫面上只會看到黑壓壓的一片,完全沒有任何畫面,但其實他是有很多的程式在背景底下執行的,例如郵件程式、瀏覽器主機程式等,你如果隨便關機的話,是很容易傷害硬碟及資料傳輸的動作的!所以在 Linux 下關機可是一門大學問喔
 
既然開機是很嚴肅的一件事,呵呵,那我們來瞭解一下整個開機的過程吧!好讓大家比較容易發現開機過程裡面發生錯誤的地方,與解決之道!不過,由於開機的過程中,那個 Boot Loader 使用的軟體可能不一樣,例如 Mandrake 9.0 已經同時提供 Lilo 與 Grub 這兩個開機管理程式,雖然 lilo 與 grub 的啟動過程或許有點不太相同,但是他的原理則都是一樣的哩!這裡我們先介紹較老牌的 Lilo 囉! Lilo 是什麼?!簡單的說,他是 LInux LOader 的縮寫,就是 Linux 開機時候載入的咚咚就對了!這東西可是控制了你的多重開機的命脈!底下的篇幅會再分別介紹這兩套開機管理程式!底下先開始來談談 Linux 是如何開機的呢?基本的流程為:
  1. 載入 BIOS 的硬體資訊;
  2. 讀取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)開機資訊;
  3. 載入 Kernel 的作業系統核心資訊;
  4. Kernel 執行 init 程式並取得 run-level 資訊;
  5. init 執行 /etc/rc.d/rc.sysinit 檔案;
  6. 啟動核心的外掛式模組 (/etc/modules.conf);
  7. init 執行 run-level 的各個批次檔( Scripts );
  8. init 執行 /etc/rc.d/rc.local 檔案;
  9. 執行 /bin/login 程式;
  10. 登入之後開始以 Shell 控管主機。
大概的流程就是上面寫的那個樣子啦,而每一個程序的內容主要是在幹嘛呢?底下就分別來談一談吧!
  • 尋找 BIOS 載入硬體資訊:

  • 稍微有 PC 硬體經驗的人們大概都知道 BIOS ( Basic Input/Output Setup ) 的作用!他是第一個被載入電腦的資料!你主機的 CPU 資料、開機順序、硬碟大小、晶片組工作狀態、PnP 的開啟與否、記憶體的時脈等等等...這都記錄在 BIOS 當中!所以啦,開機之後,系統會先去找這個東西;
  • 可開機硬碟的 MBR 讀取 Kernel loader:

  • 再來呢?呵呵!當然就是硬碟的開機資料囉!由於個人電腦的系統在讀完 BIOS 之後,會先去讀取第一個開機硬碟的第一個磁區(就是 master boot record, MBR 囉!),還記得這個 MBR 嗎?嗄!忘記了?趕緊回到第二篇好好的再複習一遍ㄋㄟ?。而這個磁區主要就是在記錄開機的資訊!還記得上面提到的 Lilo 及 grub 吧?他的紀錄就是在這裡囉!所以囉,這個時候 Lilo 紀錄的資訊就會被讀出來,系統並依 Lilo 的資訊去不同的系統開機,這也就是多重開機設定的地方啦。
     
    好了,先再來回憶一下,如果你是以 grub 程式開機的話,那麼在開機的時候會顯示什麼資料呢?呵呵!會顯示蠻多的開機選單,沒錯?就是『選單』,然後選擇了你的選擇項目之後,系統就會跑到該磁區去讀取該作業系統的核心囉!呵呵!所以一個好的 boot loader 會具有兩個功能,就是:
     
    • 選單功能 ( menu )
    • 指向功能 ( pointer )
     
    那麼為何要有 loader 呢?我想,我們得先來探討一下這個話題才行!要探討之前先來瞭解一下,曉不曉得 Windows 與 Linux 的檔案格式一不一樣?!呵呵!當然不一樣對不對,好了,那麼再來說一說,請問,你的電腦怎麼知道你的硬碟的資料是什麼系統?哈哈!那就是 loader 的主要功能囉!在你能使用系統之前,一定需要載入核心對吧!?但是怎樣讓你的硬體認識核心呢?那就是 kernel loader 的主要功能了!所以這裡需要提出的是, Linux 的 loader ( lilo 或 grub ) 是可以認識 windows 的核心檔案的,但是 Windows 的 loader 卻不認識 Linux 的核心檔案,因此,作為一個多重開機的設定 loader ,就無法使用 Windows 所提供的 loader 囉!由於需要讓系統認識你的 kernel ,因此,就需要 kernel loader 啦!這樣想就對啦!
     
    這一部份的資訊我們在後續的章節會再提及!
  • 載入核心( Kernel ):

  • 好了,等我們在 grub 的選單中選擇了 Linux 這個系統,然後主機跑到 Linux 所在的硬碟之下,就開始將他的核心載入囉。在 Linux 的系統下,通常開機的核心都擺在 /boot 底下,因此,這個時候的 boot loader 就會到 /boot 去尋找相關的核心。我們的 kernel 名稱通常就是 /boot/vmlinuz-xxxx 的格式,目前 Mandrake 9.0 的核心版本為 2.4.19,而 Mandrake 自行釋出的版本為 2.4.19-16mdk ,所以,使用 uname –r 會出現 2.4.19-16mdk 呦!然後 MDK 9.0 預設核心檔案就是: /boot/vmlinuz-2.4.19-16mdk 這一個!好了,載入這個檔案再往下繼續吧!
  • 核心執行 init 並由 /etc/inittab 取得系統登入狀態:

  • 核心載入之後,由核心執行的第一個程式就是 /sbin/init 囉!而這個程式第一個目標當然就是確定主機是要以怎樣的情況登入!這個時候就必須要以 /sbin/init 來載入 /etc/inittab 的資訊啦!而 Linux 共有幾種登入模式呢?嗯!這裡似乎有需要說明一下 Linux 有哪些登入的狀態!如果你進入 Linux 的 /etc/inittab 檔案的話( 可以使用 vi 啦 ),你應該會看到如下的資訊:
     
    [root @test /root]# vi /etc/inittab
    #   0 - halt (Do NOT set initdefault to this)  關機 
    #   1 - Single user mode  單人使用(系統有問題時候的登入狀況) 
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多人但無網路 
    #   3 - Full multiuser mode 文字界面登入的多人系統 
    #   4 - unused      系統保留 
    #   5 - X11           X-Windows 圖形界面登入的多人系統 
    #   6 - reboot (Do NOT set initdefault to this)  重新開機 

    id:3:initdefault:
     
    上面顯示的就是目前可以登入的狀態了(就是 run-level 啦!),共有 0?6 的登入狀態,其中,我們比較常使用的是 3 與 5 , 因為我們需要 Linux 是多人多工的情況,而較常登入的狀態就是文字與圖形界面啦!所以這裡需要設定成 3 或者是 5 ,千萬不要設定成 0 或者是 6 喔!不然系統會一直直接重新開機或者是直接關機....預設的系統登入在上面這個表格的最底下一行紀錄著!就是『id:3:initdefault 』那一行!注意喔!因為 VBird 預設是以文字界面來登入,所以才會是 3 ,如果你要改成圖形界面登入的話(請確定你的 X-windows 沒有問題),那麼就將 /etc/inittab 裡面的上面那一行,將 3 改成 5 即可囉!
     
    那麼什麼是『單人維護模式 ( run-level 為 1 )』?如果你有玩過 Windows 的話,那麼你在開機的時候如果按下 F8 時,不是會出現一些什麼『安全模式』啦、『正常開機』啦或『 MS-DOS 模式』等等的進入 Windows 的狀態嗎?尤其是當你不正常關機的時候, Windows 預設就會以『安全模式』來啟動 Windows 囉!Windows 的『安全模式』幾乎不載入一些複雜的模組,讓你的 Windows 一定可以開機成功!那麼 Linux 的維護模式狀態即是使用單人模式( 就是 run_level 為 1 啦!)所以說, Linux 的登入情況是如何呢?呵呵!沒錯,就是在這裡載入的啦!
  • init 的第一個執行內容 /etc/rc.d/rc.sysinit :

  • 確定了登入狀態之後,再來當然就是需要將主機的資訊給他讀進去 Linux 系統囉!而 Linux 系統的第一個資料內容就是 /etc/rc.d/rc.sysinit 這個檔案啦!如果你有空進入這個檔案去看看的話,會發現這個檔案的內容包括了==>設定預設路徑( PATH )、設定主機名稱、執行 /etc/sysconfig/network 所記錄的網路資訊、掛載 /proc 這個保存在記憶體當中的主機基本訊息、以及其他幾個 Linux 作業系統最基本的幾個資訊!大抵來說,他的基本工作是:
     
    1. 設定預設路徑:( PATH  )
    2. 設定網路狀態:系統會再去讀取 /etc/sysconfig/network,並將該檔案內的資料,如 NETWORKING, FORWARD_IPV4, HOSTNAME, DOMAINNAME, GATEWARY, GATEWAYDEV 等等的設定讀入系統中。
    3. 啟動系統的置換空間(簡單的可以想成是虛擬記憶體): swapping
    4. 檢查檔案系統:這個時候系統會去檢查一些可能會存在的目錄,例如 /fsckoptions 與 /forcfsck 及 /fastboot 等等的目錄,當你的系統有不正常關機的現象時(例如突然的斷電等等),那麼 Linux 將會自動的強制去檢查 root 的檔案系統 ( checking root filesystems )。簡單的想一想,就好像是 Windows 系統下,當你不正常關機時,在開機的過程中就會出現掃瞄硬碟的情況相同啦!
    5. 周邊設定與系統設定的參數 ( /proc ):在 Linux 或者是 Unix 系統中,你會在根目錄中發現一個很奇怪的磁區,那就是 /proc 囉!其實這個目錄是記錄在記憶體當中的,每次開機的時候就會被建置起來。他的主要功能是記錄主機的一些周邊設備的最新資料狀況!例如網路周邊啦、輸入輸出周邊啦等等的。沒事的話,不要到裡面亂砍喔!會有問題
    6. 設定 Plug and Play ( PNP )的一些參數資料
    7. 清除 /etc/mtab
    8. mount root 及 /proc 檔案系統 :好了,將一些資料都設定好之後,當然就是需要將資料寫下來囉!這個時候就會將 root 與 /proc 資料給他 mount 上檔案系統啦!
    9. 決定是否使用模組, 載入模組
    10. 檢查檔案系統 :與前面相同的,當前面的 /fastboot 檢查的旗標開啟之後,就會以 fsck 檢查你的其他磁區囉! ( 使用 fsck )
    11. 掛上其它檔案系統
    12. 設定 console 字型
    13. 打開 quota
    14. 清除不必要的檔案, 如 lock, pid
    15. 設定 clock
    16. serial port 初始化
    17. 將開機訊息經由 dmesg 放入 /var/log/dmesg 中
     
    如此一來,在 /etc/rc.d/rc.sysinit 就已經將基本的系統設定資料都寫好了,也將系統的資料設定完整!而如果你想要知道到底開機的過程中發生了什麼事情呢?那麼就使用第十六章學會的 dmesg 就可以知道囉
  • 啟動核心的外掛式模組 (/etc/modules.conf):

  • 由於我們的核心越來越聰明,所以呢,我們可以選擇使用模組的型態 ( 這個在後面也會繼續說明 ) 來進行驅動程式的載入!那麼如果系統原本找不到的模組 ( 例如早期的 via-rhine 晶片組 ) 就可以在這個檔案裡面 /etc/modules.conf 寫入呢!
  • init 執行 run-level 的各個 scripts :

  • 由於不同的 run-level 所需要載入的模組並不相同,所以系統早就為不同的 run-level 設定了一些批次檔( scripts )來做這件事囉!而 run-level 早就在前面的時候以 /etc/inittab 當中取得囉!好了,如果你知道如何進入到 /etc/rc.d 的目錄中的話,那麼你將會看到該目錄下應該有八個目錄跟三個檔案,目錄 rc0.d ~ rc6.d 分別代表了各個 run-level 的 scripts !而在這些目錄中的檔案都是以 S 及 K ( 大寫 ) 為開頭的檔案,並接兩位數的數字與該服務的名稱所組合而成的!如下所示為 Mandrake 9.0 的 /etc/rc.d/rc3.d 的內容:
     
    [root @test /root]# ll /etc/rc.d/rc3.d
    total 0
    lrwxr-xr-x    1 root     root           16 Oct 19 11:05 K55routed -> ../init.d/routed*
    lrwxr-xr-x    1 root     root           18 Oct 19 10:58 S03iptables -> ../init.d/iptables*
    lrwxr-xr-x    1 root     root           17 Oct 19 11:26 S10network -> ../init.d/network*
    lrwxr-xr-x    1 root     root           16 Oct 19 11:26 S12syslog -> ../init.d/syslog*
    lrwxr-xr-x    1 root     root           16 Oct 19 11:26 S20random -> ../init.d/random*
    lrwxrwxrwx    1 root     root           13 Oct 28 15:22 S40atd -> ../init.d/atd*
    lrwxr-xr-x    1 root     root           19 Oct 19 10:59 S40saslauthd -> ../init.d/saslauthd*
    lrwxrwxrwx    1 root     root           14 Oct 19 21:28 S55ntpd -> ../init.d/ntpd*
    lrwxrwxrwx    1 root     root           14 Oct 19 12:11 S55sshd -> ../init.d/sshd*
    lrwxrwxrwx    1 root     root           16 Oct 19 12:00 S56xinetd -> ../init.d/xinetd*
    lrwxr-xr-x    1 root     root           18 Oct 19 11:26 S75keytable -> ../init.d/keytable*
    lrwxr-xr-x    1 root     root           17 Oct 19 11:12 S80prelude -> ../init.d/prelude*
    lrwxr-xr-x    1 root     root           17 Oct 19 11:03 S85numlock -> ../init.d/numlock*
    lrwxr-xr-x    1 root     root           18 Oct 19 11:35 S89internet -> ../init.d/internet*
    lrwxr-xr-x    1 root     root           15 Oct 19 11:26 S90crond -> ../init.d/crond*
    lrwxr-xr-x    1 root     root           17 Oct 19 11:26 S95kheader -> ../init.d/kheader*
    lrwxr-xr-x    1 root     root           14 Oct 19 11:38 S99adsl -> ../init.d/adsl*
    lrwxr-xr-x    1 root     root           19 Oct 19 11:04 S99linuxconf -> ../init.d/linuxconf*
    lrwxr-xr-x    1 root     root           11 Oct 19 10:41 S99local -> ../rc.local*
     
    在這個目錄下的檔案都是連結檔,均指向到 /etc/rc.d/init.d 這個目錄下,而這個 /etc/rc.d/init.d 目錄則是以 Linux 的 rpm 安裝方法時,設定一些服務的啟動目錄。舉個例子來說,如果你要重新啟動 sendmail 的話,而且你的 sendmail 是以 rpm 來安裝的,那麼下達 /etc/rc.d/init.d/sendmail restart 就可以直接啟動 sendmail 囉!所以你即可知道 /etc/rc.d/init.d 裡面檔案的主要功能!因此,當你的 run-level 內的 scripts 要啟動哪寫服務呢,呵呵!就將檔案連結到該 init.d 目錄下的檔案並加以啟動即可囉!也就是說『當你以 文字模式 ( run-level=3 ) 啟動 Linux 時,你的系統在經過 BIOS、 MBR、 Kernel、 init、/etc/rc.d/rc.sysinit 之後,就會進入 /etc/rc.d/rc3.d 來啟動一些服務』囉!不過,需要注意的是,在 rc3.d (或其他目錄下 rc0.d ~ rc6.d )目錄中 S 開頭的檔案為執行該服務, K 為開頭的檔案則是殺掉該服務的意思。那麼那些數字代表的意義為何?那就是啟動的順序啦!例如S12syslog 會比S90crond 更早被執行呢!那麼為什麼要有這些順序呢?這是有原因的!例如您的主機有要啟動 WWW 好了,那麼您的網路設定應該要先啟動才對吧!所以囉,如果 WWW 先啟動,才驅動網路,那麼 WWW 自然就一定起不來啦!所以各項服務的啟動順序也是相當重要的!目前 Mandrake 當中,可以使用 chkconfig 來設定開機要啟動的服務選項呢!
  • init 執行 /etc/rc.d/rc.local

  • 在 DOS 或 Windows 的系統中,對於 autoexec.bat 與 config.sys 這兩個檔案您應該不陌生吧?!這兩個檔案是 DOS 或 Windows 在完成開機之後,第一個要去讀取的內容!那麼 Linux 有沒有該檔案?!有的!在 Linux 系統執行完了大部分的開機程序之後,接著下來就是要執行你的 Linux 主機的個人化設定囉!舉個例子來說,由於 Red Hat 7.2 預設是將 CDROM 視為一個模組啟動的裝置,因此你的 cdrom 將必須要載入兩個模組之後才能使用,分別是 modprobe cdrom, modprobe ide-cd 這兩個指令!而如果你想每次都使用 cdrom 的話,那麼你每次開機都必須記得手動載入這兩個模組!粉累耶....這個時候就可以將這兩行指令加入到 /etc/rc.d/rc.local 當中去囉!也就是說,不論你有什麼需要在開機的時候寫進去的指令,都可以在這裡寫入喔! ( 通常為了避免麻煩,我們都將開機完之後必須要做的幾件事情,例如啟動 NAT 主機的命令,使用 tarball 安裝的一些軟體的啟動指令都寫在這個檔案來,那麼系統開機完成之後,你所需要執行的指令也都執行完畢囉!)
     
    前面的步驟都被主機執行之後,開機的程序就已經完全的啟動完畢了!也就是說,如果你已經有網路的服務啟動的話(通常在 /etc/rc.d/init.d 時就載入囉),那麼你的主機已經在 Internet 上面提供服務了!所以根本就不需要你登入 Linux 系統你的主機也能正確的提供相關的服務喔!

  • 開機設定檔 /etc/sysconfig

  • 不過,在開機的過程中,到底使用了多少設定檔呢?呵呵!使用最多的設定檔大多放置在 /etc/sysconfig 這個目錄底下呢!來看一下 Mandrake 9.0 在這個設定檔底下有哪些東西?
     
    [root @test root]# ll /etc/sysconfig
    total 100
    -rw-r--r--    1 root     root          511 Sep 19 17:48 alsa
    -rw-r--r--    1 root     root          239 Sep 19 17:48 autofsck
    -rwxr-xr-x    1 root     root           41 Oct 19 11:39 autologin*
    -rwxr-xr-x    1 root     root           36 Oct 19 11:35 clock*
    drwxr-xr-x    4 root     root         4096 Oct 19 11:27 console/
    -rw-------    1 root     root           35 Oct 19 11:35 drakconnect
    -rw-------    1 root     root           29 Oct 19 11:35 drakconnect.adsl_pppoe
    -rw-------    1 root     root          363 Oct 19 11:35 drakconnect.netc
    -rwxr-xr-x    1 root     root          275 Oct 19 11:47 i18n*
    -rw-r--r--    1 root     root          952 Sep 19 17:47 init
    -rw-r--r--    1 root     root         1407 Sep 19 17:48 installkernel
    -rwxr-xr-x   1 root     root          446 Aug 26 23:37 ipvsadm*
    -rwxr-xr-x    1 root     root           39 Oct 19 11:27 keyboard*
    -rwxr-xr-x    1 root     root          114 Oct 18 11:43 mouse*
    -rwxr-xr-x    1 root     root           53 Oct 19 11:39 msec*
    -rw-r--r--    1 root     root            0 Sep 17 22:16 msec.rpmnew
    -rwxr-xr-x    1 root     root          100 Oct 19 13:35 network*
    drwxr-xr-x    5 root     root         4096 Oct 19 10:41 networking/
    drwxr-xr-x    2 root     root         4096 Oct 19 13:36 network-scripts/
    -rwxr-xr-x    1 root     root           10 Oct 19 11:26 pcmcia*
    -rw-r--r--    1 root     root          153 Jul 25  2000 rawdevices
    -rw-r--r--    1 root     root          336 Jul 26 20:35 saslauthd
    -rw-r--r--    1 root     root          455 Aug 14 09:30 syslog
    -rwxr-xr-x    1 root     root           56 Oct 19 11:39 system*
    -rw-r--r--    1 root     root          337 Sep 19 17:48 usb
    -rw-r--r--    1 root     root           41 Aug 22 18:11 xinetd
     
    上面具有黃色字體的哪幾個項目尤其重要!
     
    • clock 在設定我們 Linux 主機的時區,可以使用格林威治時間,也就是標準時間,也可以使用台灣的本地時間 ( local );
    • i18n 在設定一些語系的使用方面,例如最麻煩的文字介面下的日期顯示問題!如果您是以中文安裝的,那麼預設語系會被選擇 big5 ,所以在純文字介面之下,你的檔案日期顯示就會呈現亂碼!這個時候就需要更改一下這裡啦!更動這個 i18n 的檔案,將裡面的 LC_TIME 改成 en 即可!!
    • Keyboard 與 mouse 就是在設定鍵盤與滑鼠的形式;
    • network 可以設定主機名稱,以及 GATEWAY 這兩個重要資訊呢!
    • 至於 network-scripts 裡面的檔案,則是主要用在設定網路卡~這部份我們在網路架設篇才再次提到!


    總之,這個目錄下的檔案都是很重要的啦!

變換預設的登入模式

剛剛在上面說了登入主機的方式最少有六種,不過常使用的是 run-level 3 的文字介面模式與 run-level 5 的圖形介面模式!如果你在安裝的過程中選擇了文字介面登入,但是後來卻想以圖形介面登入系統,應該怎麼做?!簡單的很!就直接修改 /etc/inittab 這個檔案的內容即可!如何做呢?!以 vi 或者是其他的文書編輯軟體,進入 /etc/inittab 這個檔案,檔案的內容有點像這樣:
 
# Default runlevel. The runlevels used by Mandrake Linux are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

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

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# Run gettys in standard runlevels
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

 
在上面的資料中,將 id:3:initdefault: 裡頭的 3 改成 5 ,那麼在下次的登入時就會變成是圖形介面囉!同理,要由圖形介面變成文字介面來登入時,也是將上面那行改成 3 即可!此外,不知道您有沒有經驗,在你的 Linux 主機當中, Linux 共提供了六 個終端機介面與 一 個圖形介面的登入點,你可以按下 『 Ctrl 』+ 『 Alt』 加上 『F1』 ~ 『F6』 功能鍵 來變換不同的文字介面登入點!至於圖形介面則僅使用於『 Ctrl + Alt + F7 』這一個喔!不過,如果你只想要提供四個文字介面呢?該如何是好?!呵呵!只要將上面的最後兩行刪掉,只剩下 1:2345:....至 4:2345:...,只剩下這四行然後重新開機之後,你的 F5 與 F6 功能鍵的作用就會消失囉!就這麼簡單啦!不過,需要注意的是,圖形介面只有一個,當你使用圖形介面登入時,那麼將直接進入 tty7 那一個圖形介面的登入螢幕喔!而當你在 tty1 輸入 startx 啟動 X-Windows 時,你的控制權將會跑到 tty7 (就是在 F7 功能鍵),此時,若您的 X-windows 掛了!那麼直接按下『 Ctrl + Alt + F1 』 回到 tty1 之後,直接刪除該 X-Windows 的程序即可關閉 X-Windows 囉!很不錯吧!

Lilo

好了,要開始來搞定 boot loader 囉!第一個介紹的事較老牌的 lilo 這個玩意兒!他算是最標準的 Linux boot loader 囉!目前我的幾部主機裡面,用的也大部分都是他呢!Lilo 的設定與安裝方面必需要分成兩個步驟,分別是設定 /etc/lilo.conf 這個設定檔,設定完畢之後,還必需要給他改寫進去 MBR 或者是 Super block 才行!
 

  • 設定檔 /etc/lilo.conf

  • 基本上, lilo 是載入 Linux 核心的重要開機資料的安裝程式,他的參數設定檔案就放在 /etc/lilo.conf 裡頭,那麼我們來看一看裡面有什麼設定參數吧,基本上他的設定參數有點像底下這樣,可以分為兩部分,一個是整體的設定方面,一個則是每一個開機設定的核心檔案:
     
    [root @test linux]# vi /etc/lilo.conf 
    # 第一部份,整體的設定部分
    prompt   <==強制出現 boot 的開機訊息囉! 
    Compact  <==可以整合一些讀取的磁區,可以保持 map 較小,相當適合軟碟開機時使用 
    delay=50 <==如果有多重開機的話,可以設定這個延遲時間,單位0.1秒 
    timeout=50 <==與 delay 有類似的關係!也是 0.1 秒,如果 5 秒內沒有按鍵盤,直接以第一個 image 開機。 
    default=linux-2.4.18 <==如果開機的過程中,出現了boot之後,使用者沒有動作,
                              則以此設定的核心開機,與底下的label需對應 
    boot=/dev/hda         <==Lilo 的開機資訊寫入到 /dev/hda 這顆硬碟的 MBR 當中。 
    map=/boot/map         <==用來說明 local 主機的地圖資訊囉! 
    install=/boot/boot.b <==關於開機區的訊息(boot sector),不用理他沒關係! 
    Linear                <==在較大容量的硬碟使用時,可以加入這一個參數試試看! 
    lba32                 <==這個東西也是在大容量的硬碟使用時候會需要的參數! 
    password=1234567      <==設定密碼!如果為了安全起見,可以設定您的 lilo 密碼哩! 
    message=/boot/message <==那個 LILO 的訊息就是在裡面出現的啦!

    # 第二部分,個別的開機設定部分,一個 image 或 other 均代表一個開機設定!
    image=/boot/vmlinuz-2.4.7-10     <==核心檔案啦! 
            label=linux-2.4.7        <==請注意!label 前面以 [tab] 按鍵來作為分隔!
                                        這個字眼則是顯示在 boot 裡頭挑選項目。 
            initrd=/boot/initrd-2.4.7-10.img 
            read-only              <==開機磁區掛載為唯讀!這是預設狀況,實際在
                                        掛載入 Linux 系統時,會重新掛載成可寫! 
            root=/dev/hda1           <==掛載成 / 這個 root 目錄的磁碟! 
    other=/dev/hdb1                  <==如果是『非 Linux 核心』就以 other 來設定
                                        開機的磁碟磁區! 
        label=Windows2k          <==同樣的要有 label 來表示這個開機磁區的名稱!

     
    注意一下上面那幾個咚咚:
     
    • delay 與 timeout 的設定是 0.1 秒,所以 delay=50 表示延遲時間為 5 秒!
    • linear 與 lba32 通常用在 SCSI 或者是較大的硬碟,例如磁區超過 1024 磁軌的硬碟,可以使用這個項目來除錯!不過,如果是小於 8GB 的硬碟,這兩個東西有沒有設定就沒有什麼影響了!
    • default 需要設定成底下幾個 image 或者是 other 的 label 才成!這個地方最常被忘記!因為常常會記得修改 label ,但是忘記跟著改變 default 的內容!此外,如果你想要修正開機預設的作業系統選項,在這裡改啦!
    • password 的用途在於安全防護方面,不過有個困擾,就是『如果你的電腦因為不正常關機(如斷電後重開)而在電源恢復的時候重新開機時,則會卡在這個階段無法直接進入 Linux 系統』,因為你必須提供 password 才能繼續的工作呀!
    • boot 顯示的是開機的磁區選擇! 這裡也蠻重要的,如果你想要安裝在 MBR 裡面的話,如同上面的書寫模式,就是寫入 /dev/hda ,後面不要加上每個 partition 的代碼!但是,如果你是想寫入 Super Block ,例如我想要寫入的是 hda5 這個 Logical 的 partition 時,那麼這裡就必需要改寫為 /dev/hda5 囉!所以,您應該只要一看到這個 boot 後面接的內容,就會知道那個安裝的磁區是 MBR 還是 Super Block 囉!
    • image 可以設定成多數個!如果你的 Linux 系統有多個核心檔案的時候,例如我們剛剛編譯完成的一個新的核心,然而你又不想丟掉舊核心,就可以設定成兩個不同核心的開機系統囉!


    大致上就是這樣吧!其他不明了是什麼東西的選項,可以使用 man lilo.conf 來看看裡頭的設定!因為還有很多開機時後需要載入的參數可以來設定一番呢!


  • 預設的 lilo.conf 新增一個開機檔

  • 好啦!為了測試一下您是否已經知道了 lilo.conf 的設定方式,所以我們來做個實驗吧!請在您的『實驗主機』上面,不要在提供服務的主機上面完呦!否則死掉了不要怪我沒警告您…我們先試圖安裝在 super block 上面好了!以下面為例,黃色字體的部分是經過我的修改之後的結果,您的 /etc/lilo.conf 應該會長的跟我的差不多才是!
     
    boot=/dev/hda1
    map=/boot/map
    vga=normal
    default=linux
    keytable=/boot/us.klt
    prompt
    nowarn
    timeout=100
    message=/boot/message
    menu-scheme=wb:bw:wb:bw
    image=/boot/vmlinuz
            label=linux
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=mount"
            read-only
    image=/boot/vmlinuz
            label=failsafe
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=nomount failsafe"
            read-only
    image=/boot/vmlinuz                 <==就給他新增加一個 label ,但是內容不變!
            label=linux-test
            root=/dev/hda1
            initrd=/boot/initrd.img
            append="devfs=mount"
            read-only
     
    這樣就設定好了!接著下來看一下怎麼安裝他吧!


  • 安裝 lilo

  • 既然設定好了,自然就是要安裝他囉!安裝的方式很簡單,直接輸入 lilo 即可!
     
    [root @test root]# lilo
    Added linux *       <==有打星號的是『預設的開機設定檔!』
    Added failsafe
    Added linux-test
     
    看到沒有!要像上面這樣才是安裝成功呦!如果出現了錯誤的訊息,那麼肯定是有地方沒有安裝好!這個時候請特別的再重新設定一次 /etc/lilo.conf 呢!有打星號的是『預設的開機設定檔!』

    而如果您還要看看更多的訊息,那麼就需要這樣:
     

    [root @test root]# lilo -v
    LILO version 22.3.2, Copyright (C) 1992-1998 Werner Almesberger
    Development beyond version 21 Copyright (C) 1999-2002 John Coffman
    Released 11-Jul-2002 and compiled at 21:48:42 on Aug 13 2002.

    Reading boot sector from /dev/hda1
    Using MENU secondary loader
    Calling map_insert_data
    Mapping message file /boot/message -> message-text
    Calling map_insert_file

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added linux *

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added failsafe

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added linux-test

    /boot/boot.0301 exists - no backup copy made.
    Writing boot sector.

     
    如果你需要更多的訊息,那麼就使用『 lilo –v –v –v 』多一點 –v 就對啦!

  • 一些問題的解決之道

  •  

     
     
     
     
     

    好了! lilo 安裝完成之後,總是會有一些問題會發生吧!那麼如何來解決問題呢?嗯!可以看一下底下的一些解決之道:
     

    • 我要如何選擇不同的開機設定檔?開機的時候我只看的到 boot: 而已?

    • 開機之後,如果是以 lilo 來啟動 kernel 時,那麼他會出現 boot: 的字樣,出現這個字樣之後,馬上按下 <tab> 按鍵,那麼就會出現目前 lilo 所記憶的開機設定檔囉!然後在 boot 後面輸入想要的開機檔案,就可以囉!
    • 安裝好了 Linux 之後,在開機的過程中卻只出現『 LI 』就停止了!該如何是好?

    • 這個問題可能發生的原因是 Lilo 沒有設定好,或者是由於 Linux 安裝在非 /dev/hda ( MBR )的硬碟之中,解決的方法可以如下:
      1. 用 Linux 光碟開機,然後在出現 boot: 處輸入

      2. linux root=/dev/hda1 (這個與你的 Linux 安裝的 partition 有關)
        順利開機之後,以 vi 修改 /etc/lilo.conf 將
        linear
        這一行取消(如果沒有這一行的話,那就在 lilo.conf 中加入吧!)然後執行
        lilo
        再取出光碟並重新開機試試看;
         
      3. 進入 BIOS ,將硬碟的 mode 改成 LBA 試看看;
      4. 將Linux往前面一點的磁區安裝,例如你可能安裝在 /etc/hdc1 ,那你可以重新安裝 Linux 在 /dev/hda2 試看看
    • 安裝Linux完成之後,卻是出現 010101... 等數字在螢幕上,無法進入 Linux ...

    • 這個問題的發生很有可能是硬碟出了問題了!這個時候可以使用 fsck 來掃瞄囉!
      1. 用軟碟或者是光碟開機後,使用fsck這個硬碟修正軟體掃瞄一下您的 root partition ,例如:fsck /dev/hda1
      2. 進入 BIOS ,將硬碟的 mode 改成 LBA 試看看;
    • 我們知道 DOS 需要在第一顆硬碟的第一個磁區才能正常開機使用!那要是他並非在第一個磁區呢?例如當 DOS 系統在 /dev/hdb1 (第一條排線的 slave )?

    • 解決知道就是以 lilo 修正磁碟的配置啦!如下所示來修改 /etc/lilo.conf
      other=/dev/hdb1
         label=DOS
         map_drive=0x80
         to=0x81
         map_drive=0x81
         to=0x80
      然後再執行 lilo 寫入 MBR 當中!
    • 我不要玩 Linux 了,如何移除 lilo ?

    • 只要以 Windows 的開機片開機,然後以 Windows 系統的 fdisk 下達:
      fdisk /mbr
      就可以將 Lilo 自 MBR 當中移除囉!
    • 無法正常的進入 Lilo 怎麼辦?

    • 這的時候開機片就很重要啦!使用開機片,在出現 boot: 的時候,輸入
      linux -s
      就可以進入啦!這裡請特別留意!那個 linux 指的是 label 呢!就像剛剛我們有三個 label ,分別是 linux, linux-test 與 failsafe ,那麼如果我要以 linux-test 這個開機設定檔的單人維護模式登入,就必需要改寫成
      linux-test –s
      linux-test single
      請特別留意!!

Grub

grub 是較新的 boot loader 程式,他具有相當多的優點,這裡不一一列舉啦!無論如何, lilo 能做的, grub 幾乎都可以做的到,包括選單、密碼、指向等等的功能!不過, grub 比 lilo 要先進的幾點是:
  1. 他可以讓您在開機的時候『自行編輯與修改開機設定項目』,有點像是 bash 的指令模式;
  2. 他可以自動『動態尋找設定檔』,亦即他可以依據 /boot/grub/menu.lst 的設定而改變其設定!因此,修改設定只要改 /boot/grub/menu.lst 即可,不需要再重新安裝 grub !
很棒吧!不過,在設定底下的工作之前,請先確認您的 grub 這個套件已經安裝上來來!如果還沒有安裝的話,那麼先查閱一下 RPM 的安裝方法再說!底下假設 grub 這個套件已經安裝在您的主機上囉!

  • 設定檔 /boot/grub/menu.lst

  • Grub 的設定檔也很簡單,就是 /boot/grub/menu.lst 這個檔案,請注意,那個 lst 是 L 的小寫呢!如果有興趣的話,可以使用 info grub 好好的去看一下他的所有功能,底下僅列出一些我們常用的功能與設定而已喔!
     
    • 關於硬碟的代號:

    • 在 grub 裡面,有一點是比較讓人覺得不適應的,那就是他的硬碟代號與 lilo 還有 Linux 傳統的代號不一樣~他的代號主要有點像這樣:
       
        (hd0,0)


      hd 指的是 IDE 的硬碟,而裡面的 0,0 代表什麼呢?第一個 0 代表他是第一個 IDE 的 master ,而第二個 0 代表他是第一塊 partition 的代號,所以呢,這個代號就是 hda1 啦!所以,我們可以得到底下這個對應表:
       

      裝置
      Lilo
      Grub
      IDE1 master hda, hda1, hda2 (hd0), (hd0,0), (hd0,1)
      IDE1 slave hdb, hdb1, hdb2 (hd1), (hd1,0), (hd1,1)
      IDE2 master  hdc, hdc1, hdc2 (hd2), (hd2,0), (hd2,1)
      IDE2 slave  hdd, hdd1, hdd2  (hd3), (hd3,0), (hd3,1)

      這裡需要先記憶一下囉!


    好了,那麼將我的 menu.lst 列出來一下吧先!
     

    [root @test root]# vi /boot/grub/menu.lst
    timeout 10        <==多久之後鍵盤沒有動靜,就直接以 default 的設定開機,這裡是秒數!
    Color black/cyan yellow/cyan     <==設定顏色的參數
    i18n (hd0,0)/boot/grub/messages  <==設定 i18n 多國語系的訊息提示
    keytable (hd0,0)/boot/us.klt   <==設定鍵盤形式,通常使用美規的鍵盤即可!
    Default 0                        <==預設的開機選項,依照底下的排序,第一個為 0 !

    title linux                      <==這是第一個開機設定檔,亦即排序為 0 號!
         kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=mount
         initrd (hd0,0)/boot/initrd.img
                                     <==上面兩個則是開機設定檔的基本內容,分別是
                                        核心檔案所在地與 Ramdisk 的設定內容!

    title failsafe                   <==這是第二個開機設定檔,亦即排序為 1 號!
         kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe
         initrd (hd0,0)/boot/initrd.img

    title windows
         chainloader (hd1,0) +1

     
    • default 與 title 的計算方式:

    • 基本的說明已經在上表當中了,這裡需要在說明的是關於 default 開機檔的計算。如果今天我有四個開機設定檔,那麼 default 算的是什麼呢?就是『排序』啦!假如我底下依序出現的設定檔 title 分別是 linux, linux-test, windows, failsafe 的話,那麼開機的時候, grub 的選單就會顯示:
         linux
         linux-test
         windows
         failsafe
      其中,linux 就是 0 ,而 failsafe 就是 3 ,如果您要調整開機時後的選單順序,就在 /boot/grub/menu.lst 修改一下他們的順序即可!但是記得 default 要跟著變,因為他也是依據排序而變的呦!這點請不要忘記了?
    • title 內容的設定方式:

    • 基本上,如果是一般的硬碟環境中,我們僅需要兩行就可以設定好 title 的內容了,分別是:
       
      root   [開機根目錄 / 所在的磁碟代號]
      kernel [開機檔案的所在地完整檔名] [root=/dev/硬碟代號]

      範例:
      root   (hd0,0)
      kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1

      設定上面就是這樣而已!所以,開機完畢之後,請將您的 kernel 檔案名稱(完整檔名)與開機的根目錄所在的磁碟代號記憶一下,那麼下次就可以手動設定開機設定項目呢!但如果是 windows 方面的設定時,那就直接使用 chainloader 這個項目即可,有點像這樣:
      chainloader  [硬碟代號] +1

      範例:
      chainloader (hd1,0) +1

       

  • 裝 grub 在系統中

  • 要安裝 grub 跟 /boot/grub/menu.lst 並沒有相關性!因為剛剛我們就提過了, grub 為動態去搜尋設定檔的,所以寫入 MBR 或 super block 時,並沒有將 menu.lst 寫入ㄋㄟ?好了,那我們就來安裝看看吧!安裝的方式主要也是分為安裝在 MBR 與 super block 呢!底下我們就來談談這兩種安裝的方式:基本上的動作就是:
     
    1. 使用 root [磁碟代號] 選擇開機根目錄 / 所在磁碟代號;
    2. 使用 setup [磁碟代號] 選擇 MBR 或 Super block 直接安裝進去!
    3. 使用 quit 就可以離開 grub 了!
      
    [root @test root]# grub

    # 先安裝在 Super Block 底下試看看:
    grub> root (hd0,0)      <==這裡輸入我要的 root 硬碟磁區!
     Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0,0)     <==實際安裝上來!使用 setup 指令!
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
     Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
     Running "install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 p /boot/grub/menu
    .lst "... succeeded
    Done.

    # 再安裝在 MBR 試看看:
    grub> root (hd0,0)
     Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
    succeeded
     Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2
    /boot/grub/menu.lst"... succeeded
    Done.
    grub> quit             <==離開 grub 囉!

     
    這樣就安裝進去囉!很方便吧!並不難吧!


  • 開機手動設定選項

  • 事實上,每次動手修改完 /boot/grub/menu.lst 就已經完成了 grub 的設定囉!因為他相當的聰明!但是,如果我設定錯誤怎麼辦?沒關係!有很多的方法可以使用呢!如果您可以順利的以硬碟進入 grub 畫面,那麼恭喜您,可以繼續下面的行動了!但是如果您的 Linux 竟然無法順利的開機了,也就是說,使用硬碟開不了機!那麼也沒有關係,別擔心,就直接給他使用 CD 開機,然後在進入 grub 畫面之後,再繼續下面的動作!
     
    • 在 grub 畫面下進行手動加入的動作:

    • 在 grub 畫面中,通常畫面的最下方都會顯示一些基本的訊息,例如下方的 Mandrake 預設文字介面 grub 登入圖示:

      在這個畫面中,您可以輸入 e 或 c 來選擇『編輯』或『進入指令列模式』,無論如何,這兩個選項將使您進入指令列模式當中啦!所以您就可以看到一個大大的 grub> 提示字元,然後就可以修改或者是自訂一些項目啦!而這些修改或者設定的項目,並不會主動的去覆蓋您的 /boot/grub/menu.lst ,而是這次登入所做的修改而已呢!通常我都是選擇 e 進入編輯的畫面,然後選擇 kernel 與 root 那兩項內容進行編輯即可!例如我們上面提過的,我的 root 與 kernel 已經知道了正確的訊息,所以我就可以按下 c 來輸入底下的字樣:
       
        grub> root (hd0,0)
        grub> kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1


      這樣就可以進入我們的主機了呢!很厲害吧!

可開機磁片與救援磁片製作

不論任何時候,製作可以開機的磁片與救援的磁片,都是一件很值得鼓勵的事情!這裡我們提供簡單的方式來讓您的磁片可以開機呦!
  
# 製作軟碟開機片:
[root @test root]# mkbootdisk --device /dev/fd0 `uname -r`
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press <Enter> to continue or ^C to abort:

# 製作救援磁片:
[root @test root]# mkrescue --device /dev/fd0

 
不過, mkrescue 比較麻煩的一點是,這個程式僅支援 lilo 這個 loader 的 image file ,所以如果剛剛您是使用 grub 來設定 MBR 的話,那麼 mkrescue 就無法動作了?

本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

  • 我有個朋友跟我說,他想要讓一個程式在 Linux 系統下一開機就啟動,但是在關機前會自動的先結束該程式,我該怎麼建議他?

  • 答:
      由於 /etc/rc.d/rc[0-6].d 裡面有的 Sxxname 與 Kxxname 可以設定開機啟動與關機結束的事項!所以我就可以輕易的寫一個 script 放在 /etc/rc.d/init.d 裡面,並連結到我的 run-level 裡頭,就可以讓他自由自在的啟動與結束了!
  • 萬一不幸,我的一些模組沒有辦法讓 Linux 的核心捉到,但是偏偏這個核心明明就有支援該模組,我要讓該模組在開機的時候就被載入,那麼應該寫入那個檔案?

  • 答:
      應該寫入 /etc/modules.conf 這個檔案,他是模組載入相關的地方呢!
修改歷史:
  • 2003/02/10:第一次完成
伺服器篇文件
各版本彙整說明
CentOS 6.x