FreeBSD啟動過程。啟動一個計算機和載入作業系統的過程通常被叫做“bootstrap process ”或簡單地叫“booting”。FreeBSD啟動過程提供了許多彈性來適應實際的變化,允許選擇啟動在同一台計算機上安裝的不同作業系統,或是同一作業系統的不同版本。
基本介紹
- 中文名:FreeBSD啟動過程
- 別稱:bootstrap process
- 條件:同一作業系統的不同版本
- 特點:提供了許多彈性來適應實際的變化
概要,啟動過程中的問題,MBR啟動步驟1、2和3,啟動過程中核心的調節,關機順序,
概要
啟動一個計算機和載入作業系統的過程通常被叫做“bootstrap process ”或簡單地叫“booting”。FreeBSD啟動過程提供了許多彈性來適應實際的變化,允許選擇啟動在同一台計算機上安裝的不同作業系統,或是同一作業系統的不同版本。
這裡對可能會涉及到的配置選項和如何定製FreeBSD的啟動過程作一個描述。這包括核心啟動前會發生的每一件事情,探測設備,啟動init。如果不十分有把握的話,在系統啟動時,當螢幕的文本顏色由白變灰的時候,就可以看到系統的檢測信息了。
本文將介紹到:
FreeBSD的bootstrap系統有哪些組件,它們如何互相影響
在啟動FreeBSD時可以給組件哪些選項來控制啟動過程
注意: 這裡將只描述運行在Intel x86系統上的啟動過程。
啟動過程中的問題
打開計算機和啟動作業系統似乎會引起一個有趣的兩難選擇。根據定義,計算機在作業系統啟動之前是不知道如何做事的。這包括從磁碟運行程式。所以如果計算機沒有作業系統就不能運行程式,那作業系統是如何啟動的呢?
這個問題與《The Adventures of Baron Munchausen》(這是一本講述難以置信的冒險故事的書)一書中的問題很相似。一個人沿著檢修孔慢慢下去,然後通過抓住他的解靴帶(bootstrap)爬上來。在計算機發展的早期,術語bootstrap被套用於載入作業系統的機制,它也可以縮短為“booting”。
在x86系統中,主要由基本輸入輸出系統(BIOS)來負責載入作業系統。BIOS首先檢查磁碟的主引導記錄(MBR),它是在磁碟的一個比較特殊的地方。BIOS載入和運行MBR,而MBR能完成載入作業系統以外的任務。
如果計算機只安裝一個作業系統,那標準的MBR將起作用。這個MBR會搜尋磁碟上第一個啟動slice,然後在這個slice上運行代碼來載入引導作業系統餘下的部分程式。
如果在磁碟上安裝了多個作業系統,可以安裝一個不同的MBR,MBR可以顯示一個不同作業系統的列表,允許你選擇一個啟動。FreeBSD使用這樣的MBR,其他作業系統也會提供其他的MBR。
FreeBSD的bootstrap系統的其餘部分被分成三個階段:
第一階段是運行MBR,它只知道把計算機帶入一個特殊的狀態;
第二階段執行的程式要多一點;
第三階段就完成載入作業系統的任務。
這個工作被分成三個階段是因為PC的標準限制了程式的大小。這一系列串起來的任務允許FreeBSD提供一個比較靈活的載入程式。
核心啟動後,就會探測設備並對它們進行初始化,一旦核心啟動過程完成,核心就把控制權交給用戶處理進程init,它可以確定磁碟是否處於可用狀態。Init接著就啟動用戶級資源配置來載入檔案系統,設定網卡來激活網路,接著就啟動所有的通常在FreeBSD一運行就啟動的進程。
MBR啟動步驟1、2和3
MBR, /boot/boot0
FreeBSD MBR是駐留在/boot/boot0上的。這是MBR的一個拷貝,因為真正的MBR必須被放置在磁碟的一個特殊部分,在FreeBSD區域的外面。
boot0非常簡單,在主引導區的程式可能只有512個位元組。如果已經安裝了FreeBSD的MBR,而且還安裝了多個作業系統,將會在啟動時看到一個比較熟悉的畫面。
boot0畫面類似下面
F1 DOS
F2 FreeBSD
F3 Linux
F4 ??
F5 Drive 1
Default: F2
其他作業系統如Windows,會用自己的MBR來改寫已存在的MBR。如果碰到這樣的事,或想替換成FreeBSD的MBR,可以使用下面的命令:
# fdisk -B -b /boot/boot0 device
device是用來啟動的設備,如第一個IDE磁碟ad0,在第二個IDE控制器上的第一個磁碟ad2,在第一個SCSI磁碟da0等等。
步驟1:/boot/boot1 步驟2:/boot/boot2
第1和第2個步驟是在磁碟同一個區域的同一個程式的兩個部分。由於磁碟空間限制,它們被分成了兩部分,但必須要將它們安裝在一起。
它們可以在啟動slice的啟動扇區找到。在/boot目錄中的檔案只是真實檔案的副本,而真實檔案是存儲在FreeBSD檔案系統外面的。
Boot1是非常簡單的,它也可能只有512位元組,只有FreeBSD的存儲有磁碟分區信息的磁碟標籤(Disklabel)比較清楚,找到它之後,就可以執行boot2。
Boot2稍微有點複雜,它記錄著FreeBSD的檔案系統以便於在它上面找到檔案,另外它也提供了一個選擇可運行的核心或引導程式的簡單接口。Loader還要複雜一點,它提供了一個易於使用的啟動配置信息,通常boot2之後就是運行它了,但以前它可以直接運行核心。
boot2畫面類似下面
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:
如果需要替換已安裝的boot1和boot2,可以使用disklabel。
# disklabel -B diskslice
diskslice是啟動系統的磁碟和slice的地方,如ad0s1,在第一個IDE磁碟的第一個slice上。
危險的模式:如果只使用磁碟名稱,如ad0,在disklabel命令中,將創建一個危險的磁碟,沒有slice。這可能不是想要做的,所以確定在鍵入RETURN之前,已反覆檢查了命令disklabel。
步驟3:/boot/loader
引導程式loader是三步中的最後一步,它在檔案系統的/boot/loader中。Loader使用一個易於使用的內建命令集來進行友好的配置,使用一個複雜的命令集,通過一個強大的接口來進行備份。
Loader的執行過程
初始化過程中,引導程式loader探測到一個控制台和一些磁碟,並且指出從哪個磁碟啟動。因此,它可以設定成可變化的,然後解釋程式就開始啟動,命令就會被解釋執行。
最後,默認情況下啟動程式停頓10秒鐘(當然可以按任意鍵繼續),然後啟動核心。如果進程被打斷了,用戶可以使用命令來調整參數,卸載或裝載模組,最後進入系統或重新啟動。一個更深入的技術討論,可以閱讀loader的在線上手冊。
Loader內建命令
這些命令集包括:
autoboot seconds
在規定的時間內不被打斷的話,繼續啟動核心。如果顯示一個倒計時,默認的時間是10秒鐘。
boot [-options] [kernelname]
直接配合所給的參數啟動核心。
boot-conf
在啟動時,使用自動的變數配置模組,這只在先用unload時才有意義,並改變一些變數,通常是kernel。
help [topic]
顯示來自/boot/loader.help的求助信息,如果所給的主題(topic)是索引(index),那就顯示所有的主題列表。
include filename ...
執行所給的檔案,這檔案將被讀入並一行一行地執行,一旦有錯誤發生就直接停止這個inlucde命令。
load [-t type] filename
載入kernel,kernel模組或原先指定的檔案類型,再接著檔案名稱。任何跟在檔案之後的參數都將會傳給這個檔案來執行。
ls [-l] [path]
列出在給定路徑中的檔案。如果沒有指定路徑,將顯示root目錄的檔案列表。如果有附加-l參數,那么將一起顯示檔案大小。
lsdev [-v]
列出所有可以載入模組的設備,如果指定-v參數,那么會列出更詳細的信息。
lsmod [-v]
顯示已被載入的模組,如果有指定-v參數,那么更詳細的信息會一起列出。
more filename
在顯示的每一行用一個終止符,顯示所指定的檔案內容。
reboot
直接重新啟動系統。
set variable, set variable=value
設定loader的環境變數。
unload
卸載所有已載入的模組。
Loader舉例
這裡就是一些loader使用的實際例子。
在單用戶模式下啟動普通核心:
boot -s
卸載普通核心和模組,然後僅僅引導舊(或另一個)核心:
unload
load kernel.old
可以使用kernel.GENERIC,這是安裝光碟上的通用kernel,或是kernel.old。
注意: 照著下列的步驟可以配合原先的模組來載入其他的kernel:
unload
set kernel=“kernel.old”
boot-conf
載入核心配置的腳本檔案 (這是一個自動的腳本檔案,用來執行在kernel啟動階段所要執行的命令):
load -t userconfig_script
/boot/kernel.conf
啟動過程中核心的調節
一旦核心通過loader (一般來說) 或boot2 (略過執行loader),核心將會檢查它的啟動標記,如果有,就開始按照標記做一些必要的調節。
核心啟動標記
這是一些啟動標記:
a
在核心初始化期間,詢問要使用哪一個設備作為root檔案系統。
C
從CDROM啟動。
c
運行UserConfig,啟動時的核心配置。
s
從單用戶模式啟動。
v
在核心啟動期間更詳細的信息。
Init:過程控制初始化
核心一旦啟動完成,它就把控制權轉交給用戶層命令init,它就在/sbin/init中,在loader中,程式路徑可以通過init_path指定。
自動重新啟動
這個程式會確定系統將要使用的檔案系統是存在的。如果不存在,那么fsck就不能正常地被執行去修復磁碟驅動器,接著init將把系統切換成單用戶模式,系統管理者就可以在這時候直接處理這個錯誤。
單用戶模式
這個模式能夠通過自動重新啟動順序來完成,或在用戶啟動時通過加上-s選項,或在loader中設定boot_single。它也可以不重新啟動通過呼叫shutdown來達到,或在多用戶模式下加上-h選項。如果系統控制台被設定成insecure,那在開始單用戶模式之前,系統就要求鍵入root密碼。
在/etc/ttys中設定一個控制台為insecure
# name getty type status comments
#
# This entry needed for asking password when init goes to single-user mode
# If you want to be asked for password, change “secure” to “insecure” here
console none unknown off insecure
注意: 一個insecure的控制台代表你的控制台的安全等級是insecure的,並且確定如果有人要進入單用戶模式,就要輸入root密碼。請注意,insecure不代表你的控制台是inscurely的。而是,如果你要多一點的安全防護,請選擇insecure,而不是secure。
多用戶模式
如果init正確地找到了檔案系統,或結束了單用戶模式,系統就會進入多用戶模式,並開始系統的資源配置。
資源配置
資源配置系統將先讀取默認的配置檔案/etc/defaults/rc.conf,和指定系統的詳細配置/etc/rc.conf,接著按照/etc/fstab來載入檔案系統,再激活網路服務,和其他的系統守護程式(daemon),最後,執行部分程式的起始腳本(script)檔案。rc在線上手冊是資源設定系統很好的參考。同樣,直接查閱那些腳本也是個好方法。
關機順序
使用shutdown可以控制系統進行關機,init將會執行/etc/rc.shutdown這個腳本檔案,然後傳送TERM信號和KILL信號給所有沒有及時終止的所有進程。