開機不是只要按一下電源鈕而關機只要關掉電源鈕就可以了嗎?有何大學問?話是這樣沒錯啦,但是由於 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 會具有兩個功能,就是:
o 選單功能 ( menu )
o 指向功能 ( 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/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-x1 root root 16 Oct 19 11:05 K55routed -> ../init.d/routed* lrwxr-xr-x1 root root 18 Oct 19 10:58 S03iptables -> ../init.d/iptables* lrwxr-xr-x1 root root 17 Oct 19 11:26 S10network -> ../init.d/network* lrwxr-xr-x1 root root 16 Oct 19 11:26 S12syslog -> ../init.d/syslog* lrwxr-xr-x1 root root 16 Oct 19 11:26 S20random -> ../init.d/random* lrwxrwxrwx1 root root 13 Oct 28 15:22 S40atd -> ../init.d/atd* lrwxr-xr-x1 root root 19 Oct 19 10:59 S40saslauthd -> ../init.d/saslauthd* lrwxrwxrwx1 root root 14 Oct 19 21:28 S55ntpd -> ../init.d/ntpd* lrwxrwxrwx1 root root 14 Oct 19 12:11 S55sshd -> ../init.d/sshd* lrwxrwxrwx1 root root 16 Oct 19 12:00 S56xinetd -> ../init.d/xinetd* lrwxr-xr-x1 root root 18 Oct 19 11:26 S75keytable -> ../init.d/keytable* lrwxr-xr-x1 root root 17 Oct 19 11:12 S80prelude -> ../init.d/prelude* lrwxr-xr-x1 root root 17 Oct 19 11:03 S85numlock -> ../init.d/numlock* lrwxr-xr-x1 root root 18 Oct 19 11:35 S89internet -> ../init.d/internet* lrwxr-xr-x1 root root 15 Oct 19 11:26 S90crond -> ../init.d/crond* lrwxr-xr-x1 root root 17 Oct 19 11:26 S95kheader -> ../init.d/kheader* lrwxr-xr-x1 root root 14 Oct 19 11:38 S99adsl -> ../init.d/adsl* lrwxr-xr-x1 root root 19 Oct 19 11:04 S99linuxconf -> ../init.d/linuxconf* lrwxr-xr-x1 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-x1 root root 41 Oct 19 11:39 autologin* -rwxr-xr-x1 root root 36 Oct 19 11:35 clock* drwxr-xr-x4 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-x1 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-x1 root root 39 Oct 19 11:27 keyboard* -rwxr-xr-x1 root root 114 Oct 18 11:43 mouse* -rwxr-xr-x1 root root 53 Oct 19 11:39 msec* -rw-r--r--1 root root0 Sep 17 22:16 msec.rpmnew -rwxr-xr-x1 root root 100 Oct 19 13:35 network* drwxr-xr-x5 root root 4096 Oct 19 10:41 networking/ drwxr-xr-x2 root root 4096 Oct 19 13:36 network-scripts/ -rwxr-xr-x1 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-x1 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
·
上面具有黃色字體的哪幾個項目尤其重要!
o clock 在設定我們 Linux 主機的時區,可以使用格林威治時間,也就是標准時間,也可以使用台灣的本地時間 ( local );
o i18n 在設定一些語系的使用方面,例如最麻煩的文字接口下的日期顯示問題!如果您是以中文安裝的,那麼預設語系會被選擇 big5 ,所以在純文字接口之下,你的檔案日期顯示就會呈現亂碼!這個時候就需要更改一下這裡啦!更動這個 i18n 的檔案,將裡面的 LC_TIME 改成 en 即可!!
o Keyboard 與 mouse 就是在設定鍵盤與鼠標的形式;
o network 可以設定主機名稱,以及 GATEWAY 這兩個重要信息呢!
o 至於 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 啰!很不錯吧!