作者:陳柏菁  E-mail
第六章 開機流程與 Boot Loader

索引:
6.1 Linux 的開機程序
  6.1.1 電腦開機簡介 --- BIOSMBRBoot Loader介紹
  6.1.2 讓 Linux 與 Windows 共存一顆硬碟
  6.1.3 1024 磁柱的問題
  6.1.4 Linux 開機流程 --- /etc/inittab、/etc/init.d/*
  6.1.5 與 runlevel 相關指令 --- init、runlevel、chkconfig
6.2 Boot Loader 的設定
  6.2.1 GRUB 設定檔 ---
/boot/grub/menu.lst
設定開機密碼
改變 GRUB 安裝位置
建立簡單的 GRUB 開機片
使用 NT Loader 來擔任 Boot Manager
  6.2.2 LILO 設定檔 --- /etc/lilo.conf
6.3 系統關機--- shutdown 指令



6.1 Linux 的開機程序

6.1.1 電腦開機簡介

BIOS 簡述:

在還沒正式介紹 Linux 的開機流程之前,先大致認識一下電腦在開機時所會執行的基本工作。講到開機,第一個馬上聯想到的就是 BIOS,所以還是從 BIOS 的觀念開始談起吧 ! BIOS (Basic Input and Output System) 是燒錄於主機版上的 EEPROM 或 Flash memory 記憶體晶片中的程式,主要是用來記憶週邊裝置及系統的相關設定,且提供一個使用者操作介面來讓我們修改設定值,而您在 BIOS 中所做的設定,會被存放在 CMOS RAM (隨機存取記憶體) 中,且這些資料並不會因為您的關機而消失,因為主機板上的鋰電池會負責供應 CMOS RAM 所需的電力。

當我們主機電源打開後,系統會去讀出儲存在 CMOS RAM 中的 BIOS 設定,並開始進行開機自我測試 (Power On Self Test : POST),如果還在 POST 階段時按下 Delete 鍵 (大部分電腦品牌都是使用這個 key),就可以進入到 BIOS 設定的主畫面,比如您要調整開機順序或修改日期時間時就可以這麼做。接下來 BIOS 將依照 CMOS 中所設定的開機順序來依序尋找可開機裝置,如果這個裝置是硬碟的話,那就會先去讀取硬碟的第 0 個磁柱的第 0 個磁頭的第一個磁區 (最前面 512 bytes 的磁區),也就是 MBR (Master Boot Record)。

MBR 簡述:

MBR 內主要是存放著 Boot Partition Loader (BPL : 分割區引導程式) 及 partition table,分別各佔據 446 bytes 及 64 bytes 的空間,而 partition table 是包含著四個分割區的紀錄 (以 hda 來說為 hda1 ~ hda4),比如起始、結束磁柱的資訊及哪個 partition 有設定啟動旗標 (Active) 等,此時如果您硬碟上存在著兩套 windows 的作業系統,那麼 MBR 上的小程式 (BPL) 就會根據 partition table 裡有設定 Active 旗標的那個 partition,而載入該 partition 的 boot sector,以完成後續的開機作業。至於 MBR 內剩下的 2 bytes 是存放檢查碼 (Magic number),主要是讓 BPL 去檢查 MBR 磁區的正確性而已。

MBR 一般是由 DOS/Windows 的分割程式或安裝程式所建立起來的,所以也可以把剛剛提到的分割區引導程式當成一個 DOS/Windows 的 Loader 來看待。不過這裡的 Loader 與 Linux Loader 或 Win NT 系列的 NT Loader 的作用可不太相同噢 !

Boot Loader 簡述:

接著談談 Boot Loader,Boot Loader 顧名思義就是開機載入程式,其主要功用是用來載入作業系統的核心。像 NT Loader 就是用來載入 NT 的 kernel,以便開啟 NT 的作業系統,那 Linux 的 Loader 也是一樣的道理啊 ! 而在 Linux 中經常使用的 Loader 有兩種,分別是 LILO (LInux LOader) 及 GRUB (GRand Unified Bootloader) ,它們都具有 Boot Manager (開機管理程式) 的功能,也就是可以管理多重開機的意思,當您一顆硬碟上存在多套作業系統時,就必須要使用 Boot Manager 來做管理。如果之前您未曾接觸過 Linux 時,可能都會使用 SPFDISK 或 Partition Magic 這一類的 Boot Manager,但學習了 Linux 之後,您就可以使用 LILO 或 GRUB 來管理您的多重開機噢。

一般來說,Linux 的 Boot Loader 為一兩階段程式,第一階段可以放在 MBR 或 /boot 分割區的 boot sector 裡 ( 若 /boot 沒獨立出來,那就在 root partition 裡 ),第二階段則是一定放在 /boot 分割區內 (若 /boot 沒獨立出來,那就在 root partition 裡),像我們在安裝作業系統時,大部分的 distribution 預設都是將 Boot Loader 安置在 MBR,這個就是指 Boot Loader 的第一階段而言。至於為何不把 Linux Loader 全部放在 MBR ? 理由很簡單,因為 MBR 中能使用的空間有限,Loader 的程式碼不夠放啦。

接著我們就要開始提到重點了,當您將 Boot Manager 放在 MBR 的時候,它會取代原本分割區引導程式的功能,所以當 BIOS 在讀取 MBR 時,就會直接交給 Boot Manager 去執行,此時不論您是使用 LILO、GRUB 或 SPFDISK 來擔任 Boot Manager ,都會看到開機選單畫面,來讓您選擇要進入哪套作業系統。請注意,MBR 一次只能安置一個 Boot Manager,比如之前您是使用 SPFDISK 來做開機管理,現在在安裝 Linux 時又把 Linux Loader 放在 MBR,那當然 MBR 裡的 Boot Manager 就變成是 Linux Loader 了。Win NT 系列也有它們自己的 Boot Manager 叫 ntldr,不過這個 ntldr 是放在 partition 裡而非 MBR。

6.1.2 讓 Linux 與 Windows 共存一顆硬碟

目前市面上一顆硬碟的價格便宜得可以,隨便買一顆 SATA 或 IDE 的 80 G 硬碟,可能兩千元還有找,這麼大的硬碟容量如果不好好利用實在有點可惜,所以筆者在這裡教大家如何讓 Windows 與 Linux 共存一顆硬碟的基本做法,而等您本章都學習完畢後,甚至可以了解如何安裝兩套以上的作業系統。
1. 先安裝 Windows
您可以事先使用磁碟分割工具 (如 SPFDISK) 將硬碟切割成兩個分割區 (比如以一顆 40 G 的硬碟來講好了,這兩個分割區就可以個別給它個 10 G),一個用來安裝 Windows 作業系統,另一個可以拿來作為備份用途或儲存一些資料,那剩下的空間就可以留給 Linux 來使用。
2. 再安裝 Linux
安裝 Linux 之前,不需事先劃分分割區給其使用 (您要事先切割也不反對啦),因為在安裝的過程中就可以進行磁碟分割,不過要注意分割時不要去動到 Windows 的那兩個分割區 (以 /dev/hda 來說,就是指 /dev/hda1 及 /dev/hda2 )。另外在安裝過程,請將 LILO 或 Grub 安置在 MBR (一般預設就是安置在 MBR)。

這樣安裝完畢後,就可以使用 Linux Loader 來擔任 Boot Manager 囉 ! 此時當然想要開啟哪套作業系統都 OK 的啦。您要有個觀念,後裝的 Linux 是認得先裝的 Windows 的,但如果安裝順序顛倒過來,則後裝的 Windows 可是不認得先裝的 Linux 的,所以我們才會習慣把 Linux 安裝在 Windows 的後面。

假使哪天您 Windows 因為某些原因需要重新安裝,且還是安裝在 /dev/hda1 的話,會發生什麼事呢 ? 答案是開機時會直接進入 Windows 作業系統。因為您在重新安裝 Windows 的過程中,安裝程式會將 MBR 重新建立起來,所以原本的 Linux Loader 就會被 DOS 、Windows 的分割區引導程式所取代,且 partition table 紀錄裡的 /dev/hda1 也同時會被標定成 Active,所以想當然爾就只能開啟 Windows OS 了。如果當初您是先安裝 Linux 再安裝 Windows 的話,也是一樣的道理。那萬一真的發生這樣的事,有沒有得救呢 ? 當然是有的,只要您先想辦法進入到 Linux 中 (參考第五章進入維護模式那部分),再將 LILO 或 GRUB 安裝回 MBR 就行了,至於實際做法等一下會提到。

最後要是您想將 Linux OS 從硬碟中移除該怎麼做呢 ? 首先您可以使用 SPFDISK 來將 Linux 的分割區全部刪除,然後再重建 MBR (其實只是在重建 BPL 這個程式區啦) 就行了。您可以直接在 SPFDISK 裡重建 MBR,也可以在進入 DOS 後執行:
C:\> fdisk /mbr

有些時候您可能會想安裝更多套的作業系統,比如一套 Windows 再加上三套 Linux,那這時候您就必須學會如何修改 LILO 或 GRUB 設定檔了。只要把本章內容看完,這些應該都難不倒各位的。

底下我們大致整理一下 Linux Loader (指第一階段) 安置在 /boot partition 及 MBR 的差異:

˙ 安置在 /boot 分割區時
可搭配其它 Boot Manager,如 SPFDISK、Partition Magic 來製作開機選單,當然也可以讓 LILO 或 GRUB 來擔任 Boot Manager,不過記得要將 /boot partition 設定為 Active。
˙ 安置在 MBR 時
這樣是最單純的做法,因為在 BIOS 讀取到 MBR 後就直接交給 Linux Loader 執行。這個時候您就不可以再安裝任何的 Boot Manager 在 MBR 裡頭了。

6.1.3 1024 磁柱的問題


早期的硬碟容量不大時,其定址方式是採取 CHS (cylinder、head、sector) 實體定址,而所能支援的定址上限只能達 1024 磁柱、16 磁頭及 63 磁區,如果以一個磁區為 512 bytes 來換算的話,則只能使用到 1024 x 16 x 63 x 512 bytes 的磁碟空間,相當於 528 M。但隨著磁碟儲存技術持續的進展,硬碟空間也相對的不斷增加情形下,這樣的限制對於磁碟的存取就會產生問題,為了解決這方面的限制,因而後來發展出了 LBA (Logical Block Address) 邏輯區塊定址技術,透過這種技術使得您在對硬碟做存取時,會經由 BIOS 中的 [INT 13h] 中斷來下命令給硬碟,讓硬碟了解所存取檔案的位置。使用這種技術可以讓我們所能存取磁碟的最大限制為 8.4GB (1024 cylinder),所以只要 BIOS 支援 [INT 13h] 的 LBA mode,那麼存取 8.4 G 內的資料是 OK 的。

不過後來磁碟容量又突破 8.4 G 以後,這種舊式的 LBA mode 就又無法應付了,因此後來又設計出加強版的 [INT 13h],使得對硬碟的存取限制高達 9.4 TB 。只要您是使用 1999 年以後的電腦,則 BIOS 應該都會支援 [INT 13h Extension] 的 LBA mode。

早期接觸 Linux 的人 (1999 年以前),可能都會習慣將 /boot 分割區獨立出來並往前安置,就是因為這個 1024 cylinder 的問題,因 /boot 內存放著作業系統的核心,如果您有 1024 cylinder 的問題,那麼當您的 kernel 是在 8.4 G 以後的話,將會造成 Loader 無法載入 kernel,而為了預防這種事情發生,就會把 /boot 獨立成一個 partition 並安置在 8.4 G 以前,這樣才能夠解決這方面的問題。

再來談到 LILO 與 GRUB 的問題,如果您是使用舊版的 LILO,由於其不支援 [INT 13h Extension],所以也是會有 1024 cylinder 的問題,但如果是使用新版的 LILO 或 GRUB 則不需擔心這方面的限制,不過前提是您的 BIOS 需支援 [INT 13h Extension] 的 LBA mode。

6.1.4 Linux 開機流程

這裡就要開始說明 Linux 的整個開機過程,順便把前面學過的部分再做個複習。而在以下的解說中是假設從硬碟開機,且 Linux Loader 是安裝在 MBR。

1. 按下主機電源後,BIOS 做硬體偵測並根據 CMOS 中的紀錄,來決定開機的裝置。
2, 接著 BIOS 會讀取硬碟最前面的那個 512 bytes 的磁區,也就是讀取 MBR 中的資訊,並將 Linux Loader 載入記憶體,接著主控權就交由 Linux Loader 來執行。
3. 接著您就會看到一個開機選單畫面,來讓您選擇要開啟哪套作業系統。
4. 選擇 Linux OS 並按下 Enter 鍵以後,Linux Loader 就將 Linux kernel 載入記憶體,準備來進行其他初始化的工作。
5. kernel 被成功載入後所執行的第一支程式為 init,因此 init 的 PID 為 1。
6. init 會去讀取 /etc/inittab (initial table) 的內容,並執行檔案內的相關 scripts。
7. 最後就是執行 login 程式,此時會等待您輸入帳號密碼,如果認證無誤的話,就會開啟一個 shell 來讓您使用囉 !

以下是開機過程的簡單流程圖:



在整個 Linux 開機過程裡, /etc/inittab 扮演著一個很重要的角色,所以對這個檔案必須要有一些基本的認識。在這個檔案裡,首先需先了解幾個系統的執行等級 ( run level ):

# runlevel 0 is System halt (Do not use this for initdefault!)
# 關機。

# runlevel 1 is Single user mode
# 單人模式 。

# runlevel 2 is Local multiuser without remote network (e.g. NFS)
# 多人使用的模式,但無網路相關服務。

# runlevel 3 is Full multiuser with network
# 多人使用的文字介面模式,有網路相關服務。

# runlevel 4 is Not used
# 目前為系統所保留,不使用。

# runlevel 5 is Full multiuser with network and xdm
# 多人使用的圖形介面模式,有網路相關服務。

# runlevel 6 is System reboot (Do not use this for initdefault!)
# 重新開機。


檔案內容中如果在該行的最前頭被加上 " # " 這個符號,表示為註解說明而已,註解的那幾行是不會被讀入的。

再來針對 inittab檔案中的設定語法作個說明。檔案格式共有四個欄位,每個欄位間用 " : " 做區隔:

id:runlevels:action:process

id 代表該行紀錄的識別名稱,最多可以有四個字元。
runlevels 指定執行等級,可為 0 ~ 6 的數字及 S 等
action 告知 init 所要採取的動作為何
process 所要執行的程式及參數。

我們針對第三個欄位 action 的部分來做補充:

initdefault 告訴 init 在系統在開機時,預設要進入的執行等級為何 ; 當 runlevel 設定成 3,表示開機後要以文字介面來登入系統,設定成 5,則是以圖形介面來登入。請注意使用這個 action 時,runlevel 千萬不要指定為 0 或 6。
wait

表示第二個欄位的 runlevel 被指定後,第四個欄位的 process 將會被執行,且 init 會等待至 process 執行完畢後再繼續進行下一個動作。

bootwait 表示在系統開機期間,第四個欄位所指定的 process 將會被執行,且 init 會等待至 process 執行完畢後再進行下一個動作。
ctrlaltdel 當使用者按下 Ctrl - Alt - Del 組合鍵時,init 就會讓第四個欄位所指定的 process 去執行,此時該 process 所執行的動作就是重新該機。如果您不想開放此功能的話,將該行註解起來或整行刪除即可。
respawn respawn 這個 action 一般常搭配與登入有關係的 process 來使用,比如 mingetty。 當您登入 tty1 ~ tty6 時,之所以能在 login 提示號下輸入帳號密碼,這就是 mingetty 的功勞,而在您輸入帳號並按下 Enter 鍵後,mingetty 程式隨即結束執行。又當您登出系統後,init 會再次起動 mingetty,以提供給下一個使用者登入,這就是 respawn 的關係。

以上的觀念都了解後,接著就來看看 /etc/inittab 的內容:

內容一:
# The default runlevel is defined here
id : 5 : initdefault :
第一筆紀錄是設定開機時預設要進入的 runlevel。

內容二:
# First script to be executed, if not booting in emergency (-b) mode
si : : bootwait : /etc/init.d/boot
/etc/init.d/boot 是在開機過程中 init 所執行的第一支 Scripts,其主要執行的工作大致如下:

1. 掛載 proc、sysfs、devpts 這一類的虛擬檔案系統。
2. 執行 /etc/init.d/boot.d 目錄中的符號連結檔 (名稱是以 S 做開頭的) 所指向的 scripts,而這些 scripts 所要做的工作有:
檢查及掛載 root 檔案系統、啟用邏輯磁區、依 /etc/fstab 來檢查及掛載本地端的檔案系統 (root fs 除外)、載入模組、啟動 swap、設定 CMOS 時間、設定 hostname 及 yp、儲存核心訊息於 /var/log/boot.msg、… 等等。
3. 執行 /etc/init.d/boot.local 這支 script。當您有一些工作希望在開機過程被執行的話,可以在 boot.local 中做設定,比如模組的額外掛載及防火牆的設定。

內容三:

# /etc/init.d/rc takes care of runlevel handling
l0 : 0 : wait : /etc/init.d/rc 0
l1 : 1 : wait : /etc/init.d/rc 1
l2 : 2 : wait : /etc/init.d/rc 2
l3 : 3 : wait : /etc/init.d/rc 3

#l4 : 4 : wait : /etc/init.d/rc 4
l5 : 5 : wait : /etc/init.d/rc 5
l6 : 6 : wait : /etc/init.d/rc 6

當 boot script 完成了一些初始化的工作後,會將主控權交還給 init 程式,init 就會根據 initdefault 所指定的 runlevel 來決定下一步的動作。由於 initdefault 所指定的 runlevel 為 5,因此 /etc/init.d/rc 就會根據 /etc/init.d/rc5.d 的內容來決定啟動哪些服務。我們仔細看 rc5.d 的目錄內容,發覺其下都是一些符號連結檔,並連結至 /etc/init.d/ 目錄下的 scripts:

suselinux:~ # ls -l /etc/init.d/rc5.d
lrwxrwxrwx 1 root root 6 Sep
6
  00:11 K07xdm -> ../xdm
lrwxrwxrwx 1 root root 7 Sep
6
  00:11 K08cron -> ../cron
lrwxrwxrwx 1 root root 9 Sep
6
  00:11 K08hwscan -> ../hwscan
lrwxrwxrwx 1 root root 7 Sep
6
  00:11 K08nscd -> ../nscd
lrwxrwxrwx 1 root root 9 Sep
6
  00:12 K08xinetd -> ../xinetd
lrwxrwxrwx 1 root root 7 Sep
6
  00:11 K10sshd -> ../sshd
lrwxrwxrwx 1 root root 6 Sep
6
  00:11 K12nfs -> ../nfs
lrwxrwxrwx 1 root root 8 Sep
6
  00:11 K15smbfs -> ../smbfs
lrwxrwxrwx 1 root root 9 Sep
6
  00:11 K16syslog -> ../syslog
lrwxrwxrwx 1 root root 10 Sep
6
  00:11 K17network -> ../network
lrwxrwxrwx 1 root root 10 Aug
29
  20:35 S05network -> ../network
lrwxrwxrwx 1 root root 9 Aug
29
  18:37 S06syslog -> ../syslog
lrwxrwxrwx 1 root root 8 Aug
29
  18:44 S07smbfs -> ../smbfs
lrwxrwxrwx 1 root root 6 Aug
29
  18:41 S10nfs -> ../nfs
lrwxrwxrwx 1 root root 7 Sep
6
  00:11 S12sshd -> ../sshd
lrwxrwxrwx 1 root root 7 Aug
29
  18:45 S14cron -> ../cron
lrwxrwxrwx 1 root root 9 Aug
29
  18:41 S14hwscan -> ../hwscan
lrwxrwxrwx 1 root root 7 Aug
29
  18:45 S14nscd -> ../nscd
lrwxrwxrwx 1 root root 9 Sep
6
  00:12 S14xinetd -> ../xinetd
lrwxrwxrwx 1 root root 6 Sep
6
  00:11 S15xdm -> ../xdm

這些符號連結檔的檔名不是以 K (Kill) 開頭,就是以 S (Startup、Source) 開頭。
如果以開機過程來說的話,則 S 開頭的符號連結檔所指向的 scripts 會在開機期間被執行 (Startup scripts),因而能夠啟動系統相關服務 (系統服務都是靠這些 scripts 來管理的)。

假使您已成功進入 runlevel 5,現在又在命令列上執行 " init 3" 來變換 runlevel 時,則位於 /etc/init.d/rc5.d 目錄中那些以 K 開頭的連結檔,其指向的 scripts 所管理的服務將會被終止,接著才啟動 /etc/init.d/rc3.d 目錄中以 S 開頭的連結檔其指向的 scripts 所管理的服務。

另外連結檔檔名中的數字大小表執行先後順序,數字小的會優先被執行,而這些數字請勿任意更動,因不同的服務之間是會有相依關係存在的。

/etc/init.d 目錄內的 scripts 可以接受相關的引數來啟動、停止、重新啟動相關的服務,至於常見引數如以下:

start stop restart reload status
啟動服務 停止服務 重新啟動服務 重新載入服務 顯示服務狀態

範例說明
suselinux:~ # /etc/init.d/sshd status
Checking for service sshd      running

→ 檢查 ssh 服務目前有沒有在執行。

suselinux:~ # /etc/init.d/network restart

重新啟動網路服務。

為了簡化操作,SuSE 裡頭還可以這麼執行:
suselinux:~ # rcsshd status
suselinux:~ # rcnetwork restart

suselinux:~ # which rcsshd
/usr/sbin/rcsshd

suselinux:~ # ls -l /usr/sbin/rcsshd
lrwxrwxrwx 1 root root 16 Aug 29 18:45 /usr/sbin/rcsshd -> /etc/init.d/sshd
看了以上的說明,應該知道為什麼可以使用 rcxxx 這種方式來管理服務了吧 !

內容四:
# what to do in single-user mode
ls : S : wait : /etc/init.d/rc S
~~ : S : respawn : /sbin/sulogin
這是關於進入到單人模式時的設定。執行 /sbin/sulogin 的目的,是為了只允許管理者來登入單人模式,因此在進入到 single user mode 時,會要求您輸入管理者密碼。如果把這兩行註解起來後,下次進入 single user mode 時就不需輸入 root 密碼了,不過不建議這樣做啦 !

內容五:
# what to do when CTRL-ALT-DEL is pressed
ca : : ctrlaltdel : /sbin/shutdown -r -t 4 now
當使用者按下 Ctrl - Alt - Delete 組合鍵時就會重新開機。想想看這樣是不是很不妥,因為這樣一來每個使用者都能夠讓系統 reboot,所以您可以考慮取消此功能,只要把該行註解起來或整行刪除即可。

內容六:
# what to do when power fails/returns
pf : : powerwait : /etc/init.d/powerfail start
pn : : powerfailnow : /etc/init.d/powerfail now

po : : powerokwait : /etc/init.d/powerfail stop
如您有安裝 UPS 不斷電系統,在發生斷電的時候,init 就會根據這些設定來採取行動。第一行設定是說斷電時會通知線上使用者,在兩分鐘後要重新開機至單人模式中,而 init 會等待 /etc/init.d/powerfail 執行完畢為止再進行下個動作。第二行設定是說發生斷電時立刻關機。第三行是說當電力恢復後,馬上取消 shutdown 的動作。以上三個 action,您可 " man inittab " 自行查閱 ; 另外您要是懂一些 scripts 的話,也可以順便去看一下 /etc/init.d/powerfail 的內容。

內容七:
# getty-programs for the normal runlevels
# <id>:<runlevels>:<action>:<process>
# The "id" field MUST be the same as the last
# characters of the device (after "tty").

1 : 2345 : respawn : /sbin/mingetty --noclear 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
這個部分在說明進入 Runlevel 2 ~ 5 時,會執行 /sbin/mingetty ttyn (n 為 1~6)。如果這個地方您不是使用 respawn 這個 action,則在登出終端機後將無法再讓其他 user 登入。

以上就是 /etc/inittab 的大致內容。

在開機過程中,往往會在螢幕上看到很多訊息快速閃過您眼前,由於所出現的訊息很多且捲動的速度太快,當然也就無法看個仔細囉,所以在完成整個開機作業並登入系統後,可以使用 dmesg 指令來查看剛剛核心所提供的相關訊息,另外您也可以檢視 /var/log/boot.msg 檔案。
補充 從前面介紹的開機流程可以知道 /etc/inittab 及 /etc/fstab 是兩個很重要的檔案,如果這兩個檔案設定有誤的話,可能會造成您無法順利開啟作業系統,此時除了使用光碟的救援模式可以進去修改外,也可以在開機選單畫面下的 Boot Options 處輸入 "rw init=/bin/bash " ,這樣在開機過程就不會呼叫 init 程式,而是改由 bash 來接管。

使用這種方式登入是不需要輸入 root 密碼的,因此要是哪天您 root 密碼忘記時,就可以透過這種方式登入來修改 root 密碼噢。

不過在您成功登入後如果發現只有根目錄被掛載 (用 df 指令查看) 著,而您還想存取其他 partition 裡的資料時,那就要執行:

# mount -a

另外還有個 PATH 變數的問題,如果 PATH 裡沒有包括 /usr/sbin 及 /sbin ,恰巧您要執行的指令就是在這兩個目錄中,則輸入指令時需指出指令的路徑,若因為這樣而感覺麻煩的話,那稍微修改一下 PATH 即可:

# PATH=$PATH:/usr/sbin:/sbin

6.1.5 與 runlevel 相關的指令


init
  Boot Loader 將核心載入記憶體後,所執行的第一支程式就是它,當然您在完成開機作業後也可以使用 init 來變換 runlevel,當您執行 " init 6 ",就是告訴 init 現在要改變 runlevel 到 6,也就是重新開機的意思,那 " init 0 " 當然就是要關機囉 ! 其他像是 " init 1 "、" init 3 "、" init 5 " 應該不用多做解釋了。另外 " init q " 是告訴 init 再去讀取一次 /etc/inittab 的內容。



runlevel
 

用來查看之前跟現在的 runlevel 為何:

suselinux:~ # runlevel
N 5
那個 5 就是現在的 runlevel,至於 N 是表示前一個 runlevel,如果您進入 runlevel 5 後就沒有再變更過,那麼就會以 N 來代表前一個 runlevel。 假使您目前的 runlevel 為 5,執行了 " init 3 " 之後再輸入 runlevel 去檢視:

suselinux:~ # runlevel
5 3
結果顯示之前的 runlevel 為 5,而現在的 runlevel 為 3。



chkconfig:enable or disable system services.
  這個指令可以用來設定系統服務在進入不同 runlevel 時要啟動或停止該項服務。如果我們希望有哪些服務在開機時能啟動或關閉,就可以使用這個指令去設定。

指令語法 chkconfig [names] [runlevel]
chkconfig -l | --list [names]
chkconfig -a | --add [names]
chkconfig -d | --del [names]

範例說明
suselinux:~ # chkconfig -l
apache2 0:off 1:off 2:off 3:off 4:off 5:off 6:off
atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
cron 0:off 1:off 2:on 3:on 4:off 5:on 6:off
gpm 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:off 5:on 6:off
nfs 0:off 1:off 2:off 3:on 4:off 5:on 6:off

列出系統服務在進入不同的 runlevel 時是否要啟用。比如以 network 那一行來講好了,其代表意思是說當進入了 runlevel 2、3 或 5 時,就會啟動網路服務。

suselinux:~ # chkconfig -l cron
cron 0:off 1:off 2:on 3:on 4:off 5:on 6:off

只列出 cron 這個服務在不同 runlevel 的啟用狀態。

suselinux:~ # chkconfig atd 35

設定進入 runlevel 3 及 5 時,啟動 atd 服務。您也可以執行 " chkconfig atd on " 或 " insserv atd "。

suselinux:~ # chkconfig --level 35 atd on

與上面的執行結果是相同的。

另外 insserv 指令也可以達到這個目的:

suselinux:~ # insserv atd,start=3,5

做個確認:
suselinux:~ # chkconfig -l atd
atd 0:off 1:off 2:off 3:on 4:off 5:on 6:off

suselinux:~ # chkconfig atd off

進入所有 runlevel 時,都停止 atd 服務。

suselinux:~ # insserv -r atd
與上面執行結果是一樣的。

suselinux:~ # chkconfig -a atd
atd 0:off 1:off 2:on 3:on 4:off 5:on 6:off

將 atd 服務加入啟動行列。要移除的話使用 " -d " 參數即可。 


6.2 Boot Loader 的設定

這一節是要介紹 Linux 經常使用的兩種 Boot Loader:LILO 與 GRUB。如果將來您硬碟上存在好幾套的作業系統,並希望以 LILO 或 GRUB 來擔任 Boot Manager 時,那這兩種 Loader 的設定檔可要好好的學一學才行。

6.2.1 GRUB 設定檔

GRUB 設定檔在 /boot/grub/menu.lst。假設目前硬碟上安裝三套作業系統,一套 Windows 加上兩套 Linux ,如以下:



接著就根據上圖的安排來看看在 SuSE 裡的 menu.lst 要如何做設定:

suselinux:~ # vi /boot/grub/menu.lst

color white/blue black/light-gray

這是當您在 GRUB 圖形選單畫面中按下 ESC 鍵而進入到文字選單畫面時,所指定的前景、背景顏色。

default 0

指定預設要開啟的作業系統。0 代表第一筆 title 的紀錄,也就是 SuSE OS,同樣道理,1 就代表第二筆 title 紀錄。

timeout 10

當您看到 GRUB 選單畫面後,如 10 秒內未做任何的輸入(未按下鍵盤的任何 key),則 GRUB 就會開啟預設的作業系統。

gfxmenu (hd0,4)/message

指定 GRUB 選單畫面影像訊息的檔案。

title SuSE  
 root (hd0,4)  
 kernel /vmlinuz root=/dev/hda7 vga=788
 initrd /initrd


使用 title 來設定所要開啟的這一套作業系統。title 後面接的名稱,就是您在 GRUB 選單中所看到的作業系統名稱。

下一行的 root 是用來定義 /boot 所在的分割區為何,由於 /boot 裡包含了開機過程需載入的相關重要檔案,因此會把 /boot 目錄所在的那個分割區當成根目錄來看待。其後的 hd0 代表 hda (您可從 /boot/grub/device.map 檔案裡找到 GRUB 裝置名稱與 Linux 裝置名稱的對照表),hd1代表 hdb,依此類推 ; 至於後面所接的數字,0 表示第一個分割區,1表示第二個分割區 …,所以 (hd0,4) 就是 hda5 的意思。

kernel 是用來指定 kernel image 的位置, 因為剛剛已經定義了 /boot 所在的分割區為根目錄,所以核心的實際路徑為 /boot/vmlinuz 。至於其後都是一些核心參數,首先使用 root=/dev/hda7 來告訴核心實際根目錄的位置,而 vga 則是設定文字模式下的解析度。
您也可以把 root (hd0,4) 及 kernel /vmlinuz 合併起來設定:
kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=788
或者是
kernel (hd0,4)/boot/vmlinuz root=/dev/hda7 vga=788

最後談到 initrd (initial ramdisk)。所謂的 ramdisk 是將記憶體的一部份當成磁碟來使用,所以也稱為虛擬磁碟。
/boot/ initrd-2.6.5-7.97-default 是一個經過壓縮的 initial ramdisk image file,當核心在進行開機作業時,這個檔案會被解壓縮至記憶體內,而檔案中會包括一些未編入核心裡頭的模組,像 SCSI、RAID、File System 等等。我們就拿 SCSI 及 RAID 來說好了,由於它們在 Linux 中是被編譯成模組的型態,而不是編進核心裡,所以在開機過程中需先藉由 initrd 來先行將這些模組載入,這樣也才可以讓我們使用 SCSI 硬碟或 RAID。

title=Fedora  
 root=(hd0,1)  
 kernel /vmlinuz-2.6.5-1.358 ro vga=788 root=LABEL= / rhgb
 initrd /initrd-2.6.5-1.358.img

定義另一套 Linux 的作業系統。核心參數中的 " ro " 表示在開機過程將 root partition 掛載成 read-only 的意思 ; " root=LABEL= / " 是使用 fs-label 的方式來設定,當然您要改成 " root=/dev/hda3 " 也行 ; " rhgb " (redhat graphical boot) 是表示在開機中途會轉成以圖形化的方式來繼續開機 。

title=Windows 2000  
 rootnoverify (hd0,0)  
 chainloader +1

設定 Windows OS 的方式就跟 Linux 不同了。rootnoverify 是指示 GRUB 不需掛載 hda1 的分割區,只需知道是要啟動此分割區上的作業系統即可。 chainloader 是指定 hda1 的第一個磁區做啟動磁區 (boot sector)。後面兩行亦可合併成 chainloader (hd0,0) +1

GRUB 設定檔修改完存檔離開後不需執行任何動作,因下次開機時,GRUB 會自己找到 menu.lst,並套用裡邊的設定,方便吧 !



設定開機密碼

  首先先建立一個加密後的密碼:
suselinux:~ # grub-md5-crypt
Password:
Retype password:
$1$FMb641$e3O27.Zeet.mILf0dnpZu/ ← 這是編碼後的密碼。

另外您也可以在 Grub-Shell 中做這件事:

suselinux:~ # grub
grub> md5crypt

Password: ****
Encrypted: $1$kZb641$nJYYIhjvVNFdd2BPjbc971 




再來到 menu.lst 做設定:
color white/blue black/light-gray

default 0

timeout 10

gfxmenu (hd0,0)/message

password --md5 $1$kZb641$nJYYIhjvVNFdd2BPjbc971 ← 直接將剛剛所產生的密碼貼上來。

title SuSE  
 root (hd0,4)  
 kernel /vmlinuz root=/dev/hda7 vga=788
 initrd /initrd
 lock  加上這個紀錄後,您要開啟 SuSE OS 時,就必需先按下 [ P ] 來輸入開機密碼。



Reboot 後您就會看到以下的畫面:





當您選擇 SuSE 並按下 Enter 鍵後,會出現以下的訊息:





上圖是提示您需要做認證,也就是要輸入密碼的意思,此時您就按照畫面提示,按下任何鍵來繼續吧:





回到起始的畫面後,請先按下 [P] 來輸入開機密碼:





接著選擇 SuSE 並按下 Enter 鍵後,就可以順利開啟作業系統:



針對其他 OS 您也想採取這種方式的話,可在每一個 title 區段內補上 lock 紀錄即可。



改變 GRUB 安裝位置

  安裝 GRUB 在分割區上
suselinux:~ # grub

grub> root (hd0,4) ← 先指定 /boot partition 的位置。

grub> setup (hd0,4) ← 將 GRUB 安裝在 /dev/hda5 的 boot sector。

grub> quit ← 退出 GRUB 設定。

安裝 GRUB 在 MBR
suselinux:~ # grub

grub> root (hd0,4) ← 先指定 /boot partition 的位置。

grub> setup (hd0) ← 將 GRUB 安裝在 MBR。

grub> quit ← 退出 GRUB 設定。

您也可以使用 grub-install 指令來完成這個工作:
suselinux:~ # grub-install /dev/hda

suselinux:~ # grub-install /dev/hda5



建立簡單的 GRUB 開機片

  請先放入磁片,再按照以下步驟執行:
suselinux:~ # mke2fs /dev/fd0  格式化磁片。

suselinux:~ # mkdir /mnt/floppy  建立掛載點。

suselinux:~ # mount /dev/fd0 /mnt/floppy  執行掛載。

suselinux:~ # mkdir -p /mnt/floppy/boot/grub  建立存放開機相關檔案的目錄。

suselinux:~ # cd /boot/grub
suselinux:/boot/grub # cp stage1 stage2 menu.lst device.map /mnt/floppy/boot/grub

→ 複製 Grub 所需的開機資料至磁片中。

suselinux:/boot/grub # umount /mnt/floppy  卸載磁片。也可稍後再卸載。

suselinux:~ # grub

grub> device (fd0) /dev/fd0

如果 device.map 裡已有對應紀錄,則此步驟可省略。

grub> root (fd0)  以 FLOPPY 來取代 /boot partition 的位置。

grub> setup (fd0)  將 GRUB 安裝在 FLOPPY。

grub> quit



使用 NT Loader ( NTLDR ) 來擔任 Boot Manager

  ntldr 只有在 Windows NT 系列的才有噢,如 2000、XP、2003 等。以比較單純的環境來說好了,假使您 /dev/hda1 為 Win 2000,/dev/hda2 為 /boot partition,GRUB 是安裝在 /boot partition,且 /dev/hda1 有設定 Active,接下來就看看要怎麼讓 ntldr 擔任 Boot Manager:

1. 在 Linux 中需完成的工作

將 /boot partition 的 boot sector 先行複製到另一個檔案:
suselinux:~ # dd if=/dev/hda2 of=/tmp/suseboot.lnx bs=512 count=1

接著把一片已格式化成 FAT 的磁片放入,並將 suseboot.lnx 複製到磁片中:
suselinux:~ # mcopy /tmp/suseboot.lnx A:
   
2. 在 Windows 中需完成的工作

先於檔案總管裡點選工具資料夾選項


於 [ 檢視 ] 項目中將 "隱藏已知檔案類型的副檔名" 及 "隱藏保護的作業系統檔案" 前面的勾勾拿掉,並且選擇 "顯示所有檔案和資料夾":


完成後您就可以在 C 槽中看到 boot.ini 這個檔案:


接著把剛剛磁片中的 suseboot.lnx 複製到 C 槽裡,然後再編輯 boot.ini 即完成囉:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
C:\ suseboot.lnx="SuSE" ← 補上這一行。

6.2.2 LILO 設定檔

LILO 在以前是非常受歡迎的 Linux Loader,不過自從 GRUB 出現後,有被漸漸取代的趨勢,但是還是有很多玩家對其情有獨鍾,所以對它也要有一些基本認識。LILO 的設定檔在 /etc/lilo.conf,我們以下圖的安裝為範例來檢視其內容:



suselinux:~ # vi /etc/lilo.conf

##GLOBAL OPTIONS

message=/boot/message

指定 LILO 選單畫面影像訊息的檔案。

timeout=50

看到 LILO 選單畫面出來後,若 5 秒 (50 x 0.1) 內沒按下鍵盤的任何 key,就會開啟預設的作業系統。

prompt

此參數會顯示選單提示畫面。如果沒這個參數,那麼在開機時會直接開啟預設的作業系統,除非您在開機後手腳快一些按下 Ctrl - X,這樣才會出現選單畫面。

default=SuSE_Linux

設定預設要開啟的作業系統。記得此處的名稱一定要與底下所提及的 PER-IMAGE SECTION 設定區段中其中一個 label 所指定的名稱相同。

boot=/dev/hda

這裡表示 LILO 是安裝在 MBR,如果是 boot=/dev/hda2,那表示 LILO 是安置於第二個分割區的 boot sector。

lba32

這個參數會產生 32 位元的邏輯區塊位址,也就是為了要支援大硬碟啦。

password=8888

設定開機密碼。與 grub 不同的是這裡為明碼,而非編碼後的密碼。

## PER-IMAGE SECTION

image=/boot/vmlinuz
   label=SuSE_Linux
   initrd=/boot/initrd
   root=/dev/hda3
   vga=788

image 是用來定義核心映像檔的位置 ; label 是設定選單畫面中所出現的作業系統名稱,名稱中不能包含空白字元。至於其他參數的意思都與 GRUB 相同,忘記的話,請回去再複習一次。

other=/dev/hda1
   label=Win98

other 是用來定義另一套作業系統所在的分割區,也就是第一個分割區所存在的作業系統為 win98。

當修改完 lilo.conf 後請務必執行 lilo 指令:
suselinux:~ # lilo -v -v

" -v " 是用來顯示執行 lilo 時的訊息," -v " 輸入愈多次表示顯示在螢幕的訊息就愈多。

修改完 /etc/lilo.conf 後,一定要執行 lilo 來將其重新安裝一次,不然就等於沒有修改噢。

上面的範例只是 Windows 與一套 Linux 共存一顆硬碟的設定,那如果又加上另一套 Linux 的話,就必須再使用 other 去做設定,比如現在又多了一套 Fedora,其 /boot partition 在 /dev/hda9,則您可於 lilo.conf 中補上:

other=/dev/hda9
   label=Fedora


這樣當您在 SuSE 的 LILO 選單畫面中選擇要進入 Fedora 時,就會將開機作業引導給 Fedora 的 Boot Loader 去執行。

6.3 系統關機

平常我們在關機或重新開機時,可能會使用 halt、init、poweroff 或 reboot 這一類的指令,不過萬一您這台主機是一台工作站,平常都有一些使用者會遠端連線至您的主機,那麼當您要關機時最好是使用 shutdown 指令,因為使用 shutdown 來關機或重新開機時,可以設定緩衝時間,這樣遠端連線者在接獲關機或 reboot 的通知時,才有時間把手邊正在執行的工作做個結束。

shutdown: bring the system down.

  指令語法shutdown [-rhfF] time [warning-message]

參數說明
-h 系統關機。
-r 系統重新開機。
-f 重新開機時,忽略磁碟檢查。
-F 重新開機時,強迫做磁碟檢查。

範例說明
suselinux:~ # shutdown 2

系統 2 分鐘後,將 reboot 至單人模式。執行 "shutdown +2" 也是一樣的效果。

suselinux:~ #
shutdown -r 5

系統 5 分鐘後將重新開機。此時所有連線到這台主機的使用者都會收到五分鐘後要重新開機的訊息。
在 5 分鐘的等待期間內,如果按下 Ctrl - C,就可以取消此 shutdown 的動作。

suselinux:~ #
shutdown -h 3 "Note:Server will halt in 3 minutes."

系統 3 分鐘後即將關機,並且連線者會接收到 "Note:Server will halt in 3 minutes." 的訊息。

suselinux:~ # shutdown -Fr now

現在立刻重新開機,並在開機過程強迫做 fsck。若您使用 "-f " 參數則會忽略 fsck。

suselinux:~ #
shutdown -h 18:30 "system will halt at 18:30"

下午六點三十分關機。如果現在離 18:30 還有一段時間,則使用者暫時不會收到通知,一直要到離關機時間還剩 15 分鐘時才會接獲通知。



copyright © 2005 by barry ( 柏青哥 )