| 第六章 開機流程與 Boot Loader
|
| 6.1 Linux 的開機程序 | ||
| 6.1.1 | 電腦開機簡介 --- BIOS、MBR 及 Boot 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 指令 | ||
| 1. | 先安裝 Windows: 您可以事先使用磁碟分割工具 (如 SPFDISK) 將硬碟切割成兩個分割區 (比如以一顆 40 G 的硬碟來講好了,這兩個分割區就可以個別給它個 10 G),一個用來安裝 Windows 作業系統,另一個可以拿來作為備份用途或儲存一些資料,那剩下的空間就可以留給 Linux 來使用。 |
| 2. | 再安裝 Linux: 安裝 Linux 之前,不需事先劃分分割區給其使用 (您要事先切割也不反對啦),因為在安裝的過程中就可以進行磁碟分割,不過要注意分割時不要去動到 Windows 的那兩個分割區 (以 /dev/hda 來說,就是指 /dev/hda1 及 /dev/hda2 )。另外在安裝過程,請將 LILO 或 Grub 安置在 MBR (一般預設就是安置在 MBR)。 |
| 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 裡頭了。 |
| 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 來讓您使用囉 ! |

| # runlevel 0 is System
halt (Do not use this for initdefault!) |
| id:runlevels:action:process |
| id | 代表該行紀錄的識別名稱,最多可以有四個字元。 |
| runlevels | 指定執行等級,可為 0 ~ 6 的數字及 S 等。 |
| action | 告知 init 所要採取的動作為何。 |
| process | 所要執行的程式及參數。 |
| 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 的關係。 |
| # The default
runlevel is defined here id : 5 : initdefault : |
| # First script to be executed,
if not booting in emergency (-b) mode si : : bootwait : /etc/init.d/boot |
| 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 |
suselinux:~ #
ls -l /etc/init.d/rc5.d
|
| 註: | 假使您已成功進入 runlevel 5,現在又在命令列上執行 " init 3" 來變換 runlevel 時,則位於 /etc/init.d/rc5.d 目錄中那些以 K 開頭的連結檔,其指向的 scripts 所管理的服務將會被終止,接著才啟動 /etc/init.d/rc3.d 目錄中以 S 開頭的連結檔其指向的 scripts 所管理的服務。 |
| start | stop | restart | reload | status |
| 啟動服務 | 停止服務 | 重新啟動服務 | 重新載入服務 | 顯示服務狀態 |
| suselinux:~ #
/etc/init.d/sshd status Checking for service sshd running → 檢查 ssh 服務目前有沒有在執行。 suselinux:~ # /etc/init.d/network restart → 重新啟動網路服務。 |
| 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 |
# what to do in single-user mode
|
| # what to do when CTRL-ALT-DEL
is pressed ca : : ctrlaltdel : /sbin/shutdown -r -t 4 now |
| # 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 |
| # 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 |
| 補充: | 從前面介紹的開機流程可以知道 /etc/inittab 及 /etc/fstab 是兩個很重要的檔案,如果這兩個檔案設定有誤的話,可能會造成您無法順利開啟作業系統,此時除了使用光碟的救援模式可以進去修改外,也可以在開機選單畫面下的
Boot Options 處輸入 "rw init=/bin/bash
" ,這樣在開機過程就不會呼叫 init 程式,而是改由 bash 來接管。 使用這種方式登入是不需要輸入 root 密碼的,因此要是哪天您 root 密碼忘記時,就可以透過這種方式登入來修改 root 密碼噢。 不過在您成功登入後如果發現只有根目錄被掛載 (用 df 指令查看) 著,而您還想存取其他 partition 裡的資料時,那就要執行:
另外還有個 PATH 變數的問題,如果 PATH 裡沒有包括 /usr/sbin 及 /sbin ,恰巧您要執行的指令就是在這兩個目錄中,則輸入指令時需指出指令的路徑,若因為這樣而感覺麻煩的話,那稍微修改一下 PATH 即可:
|
| 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:~ #
vi /boot/grub/menu.lst color white/blue black/light-gray
default 0
timeout 10
gfxmenu (hd0,4)/message
title SuSE root (hd0,4) kernel /vmlinuz root=/dev/hda7 vga=788 initrd /initrd
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
title=Windows 2000 rootnoverify (hd0,0) chainloader +1
|
首先先建立一個加密後的密碼:
再來到 menu.lst 做設定:
Reboot 後您就會看到以下的畫面: ![]() 當您選擇 SuSE 並按下 Enter 鍵後,會出現以下的訊息: ![]() 上圖是提示您需要做認證,也就是要輸入密碼的意思,此時您就按照畫面提示,按下任何鍵來繼續吧: ![]() 回到起始的畫面後,請先按下 [P] 來輸入開機密碼: ![]() 接著選擇 SuSE 並按下 Enter 鍵後,就可以順利開啟作業系統: ![]() 針對其他 OS 您也想採取這種方式的話,可在每一個 title 區段內補上 lock 紀錄即可。 |
安裝 GRUB 在分割區上:
安裝 GRUB 在 MBR:
您也可以使用 grub-install 指令來完成這個工作:
|
請先放入磁片,再按照以下步驟執行:
|
ntldr 只有在 Windows NT 系列的才有噢,如 2000、XP、2003 等。以比較單純的環境來說好了,假使您
/dev/hda1 為 Win 2000,/dev/hda2 為 /boot partition,GRUB 是安裝在 /boot partition,且
/dev/hda1 有設定 Active,接下來就看看要怎麼讓 ntldr 擔任 Boot Manager:
|

| suselinux:~ # vi
/etc/lilo.conf ##GLOBAL OPTIONS message=/boot/message
timeout=50
prompt
default=SuSE_Linux
boot=/dev/hda
lba32
password=8888
## PER-IMAGE SECTION image=/boot/vmlinuz
other=/dev/hda1
|
| suselinux:~ # lilo -v -v |
other=/dev/hda9 |
| 指令語法:shutdown [-rhfF] time [warning-message] 參數說明:
範例說明:
|
copyright © 2005 by barry ( 柏青哥
)