FreeBSD handbook中文版 7 FreeBSD 的啟動過程
2024-07-26 00:29:05
供稿:網友
目錄
7 FreeBSD 的啟動過程
7.1 概要
7.2 啟動中的問題
7.3 MBR,啟動步驟1、2 和3
7.4 啟動時內核的調節
7.5 Init: 進程控制初始化
7.6 關機程序
=============================================================
第7 章FreeBSD 啟動過程
=============================================================
(翻譯中出現的任何問題或錯誤,請廣大讀者及時反饋給我:freebsdhandbook@163.com)
7.1 概要
啟動一個電腦和加載操作系統的過程被叫做“bootstrap PRocess”或簡單地叫
“booting”。FreeBSD 的啟動過程提供了許多彈性來適應實際的變化,允許你選擇啟動在
同一臺電腦上安裝的不同操作系統,或是同一操作系統的不同版本。
這章將比較細致地對你可能會涉及到的配置選項和如何定制FreeBSD 的啟動過程作一
個描述。這包括內核啟動前會發生的每一件事情,探測設備,啟動init。如果你不十分有
把握的話,當你的屏幕的文本顏色由白變灰的時候,你就可以看到系統檢測信息了。
閱讀完這章,你將了解到:
FreeBSD 的bootstrap 系統有哪些組件,它們如何互相影響。.
在啟動FreeBSD 時你可以給組件哪些選項來控制啟動過程。.
注意: 這章將只描述運行在Intel x86 系統上的啟動過程。
7.2 啟動過程中的問題
打開電腦和啟動操作系統似乎會引起一個兩難的選擇。根據定義,電腦在操作系統啟動
之前是不知道如何做事的。這包括從磁盤運行程序。所以如果電腦沒有操作系統就不能運行
程序,那操作系統是如何啟動的呢?
在x86 系統中,主要由基本輸入輸出系統(BIOS)來負責加載操作系統。BIOS 首先檢
查磁盤的主引導區(MBR),它是在磁盤的一個比較特殊的地方。BIOS 加載和運行MBR,而
MBR 能完成加載操作系統以外的任務。
如果你只有一個操作系統安裝在電腦上,那標準的MBR 將起作用。這個MBR 會搜索磁盤
上的啟動slice,然后在這個slice 上運行代碼來加載引導操作系統的余下的部分程序。
第1 頁FreeBSD 使用手冊
如果你在磁盤上安裝了多個操作系統,你可以安裝一個不同的MBR,MBR 可以顯示一個
不同操作系統的列表,允許你選擇一個啟動。FreeBSD 使用這樣的MBR,其他操作系統也會
提供其它的MBR。
FreeBSD 的bootstrap 系統的其余部分被分成三個階段。第一個階段是運行MBR,它只
知道把電腦帶入一個特殊的狀態,然后運行第二階段。第二階段要執行的程序要多一點。第
三階段就完成加載操作系統的任務。這個工作被分成三個階段是因為PC 的標準限制了程序
的大小。這一系列串起來的任務允許FreeBSD 提供一個比較靈活的加載程序。
內核啟動后,就會探測設備并對它們進行初始化,一旦內核啟動過程完成,內核就把控
制權交給用戶處理進程init,它可以確定磁盤是否處于可用狀態。Init 接著就啟動用戶級
資源配置來加載文件系統,設置網卡來激活網絡,接著就啟動所有的通常在FreeBSD 一運行
就啟動的進程。
7.3 MBR 啟動步驟1、2 和3
7.3.1 MBR, /boot/boot0
FreeBSD MBR 是駐留在/boot/boot0。這是MBR 的一個拷貝,因為真正的MBR 必須被放
置在磁盤的一個特殊部分,在FreeBSD 區域的外面。boot0 非常簡單,在主引導區的程序可
能只有512 個字節。如果你已經安裝了FreeBSD 的MBR,而且還安裝了多個操作系統,你將
會在啟動時看到一個比較熟悉的畫面。
例7-1. boot0 畫面
F1 DOS
F2 FreeBSD
F3 linux
F4 ??
F5 Drive 1
Default: F2
第2 頁FreeBSD 使用手冊
其它操作系統,如windows 95,會用自己的MBR 來改寫已存在的MBR。如果碰到這樣的
事,或你想替換FreeBSD 的MBR,你可以使用下面的命令:
# fdisk -B -b /boot/boot0 device
這兒的device是你用來啟動的設備,如第一個IDE 磁盤ad0,在第二個IDE 控制器上的
第一個磁盤,在第一個SCSI 磁盤da0 等等。
7.3.2 步驟1, /boot/boot1, 步驟2, /boot/boot2
Boot1 可以在引導分區的引導扇區上找到,它無論是在boot0 上,或是在MBR 上的其它
程序都能找到這樣的程序繼續啟動進程。
Boot1 是非常簡單的,它也可能只有512 字節,只是表明了FreeBSD 的存儲有磁盤分區
信息的磁盤標簽(Disklabel),找到它之后,就會執行boot2。
Boot2 稍微有點復雜,它記錄著FreeBSD 的文件系統以便于在它上面找到文件,另外它
也提供了一個選擇可運行的內核或引導程序的簡單接口。Loader 還要復雜一點,它提供了
一個易于使用的啟動配置信息,通常boot2 之后就是運行它了,但以前它可以直接運行內核。
例7-2. boot2 畫面
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:
如果你需要替換已安裝的boot1 和boot2,可以使用disklabel。
# disklabel -B diskslice
diskslice是啟動系統的磁盤和slice 的地方, 如ad0s1,在第一個IDE 磁盤的第一個
slice 上。
危險的模式:如果你使用了剛才的磁盤名稱,如ad0,在disklabel 命令中,你將創建
一個危險的磁盤,沒有slices。這可能不是你想要做的,所以確定你在鍵入RETURN 之前,
第3 頁FreeBSD 使用手冊
你已反復檢查了命令disklabel。
7.3.3 步驟3,/boot/loader
引導程序loader 是三步中的最后一步,它可能在/boot/loader。Loader 有一個非常友
好的配置方法,使用一個易于使用的內建命令,通過一個強大的接口來備份。
7.3.3.1 Loader 的執行過程
初始化過程中,引導程序探測到一個控制臺和一些磁盤,計算出從哪個磁盤啟動。因此,
它可以設置成可變化的,然后解釋程序就開始啟動,命令就會被解釋執行。
最后,默認情況下啟動程序停頓10 秒鐘(當然你可以按任意鍵繼續),然后啟動內核。
如果進程被打斷了,用戶可以使用命令來調整參數,卸載或裝載模塊,最后啟動或重新啟動。
一個更深入的技術討論,你可以閱讀loader 的聯機手冊。
7.3.3.2 Loader 內建命令
這些命令集包括:
autoboot seconds
在規定的時間內不被打斷的話,繼續啟動內核。如果顯示一個倒計時,默認的時間
是10 秒鐘。
boot [-options] [kernelname]
直接配合所給的參數加載內核。
boot-conf
在啟動時,使用自動的變量配置模塊,這只在你先用unload 時才有意義,并改變一
些變量,通常是kernel。
help [topic]
第4 頁FreeBSD 使用手冊
顯示來自/boot/loader.help 的求助信息,如果所給的主題(topic)是index,那就
顯示所有的主題列表。
include filename ...
執行所給的文件,這文件將被讀入并一行一行地執行,一旦有錯誤發生就直接停止
這個inlucde 命令。
load [-t type] filename
加載kernel,kernel 模塊或原先指定的文件類型,再接著文件名。任何跟在文件之
后的參數都將會傳給這個文件來執行。
ls [-l] [path]
列出在給定路徑中的文件。如果沒有指定路徑,將顯示root 目錄的文件列表。如果
有附加-l 參數,那么將一起顯示文件大小。
lsdev [-v]
列出所有可以加載module 的設備,如果指定-v 參數,那么會列出更詳細的信息
lsmod [-v]
顯示已被加載的module,如果有指定-v 參數,那么更詳細的信息會一起列出。
more filename
顯示所指定的文件內容,并在每LINES (環境變量) 暫停。
reboot
直接重新啟動機器。
set variable, set variable=value
第5 頁FreeBSD 使用手冊
設置loader 的環境變量。
unload
卸載所有被加載的module。
7.3.3.3 Loader 舉例
這里就是一些loader 使用的實際例子。
1,在單用戶模式下啟動你的普通內核:
boot -s
2,卸載你的普通內核和模塊,然后僅僅引導你的舊(或另一個)內核:
unload
load kernel.old
3,你可以使用kernel.GENERIC,這是安裝光盤上的通用kernel,或是kernel.old,
這是你上一個安裝的kernel (如果你有升級或重新配置你自己的kernel 的話)。
注意: 照著下列的步驟可以配合原先的module 來加載其它的kernel:
unload
set kernel=”kernel.old”
boot-conf
4,加載內核配置的script 文件(這是一個自動的script 文件,用來執行你在kernel
啟動階段所要執行的命令):
load -t userconfig_script
/boot/kernel.conf
7.4 啟動時內核的調節
一旦kernel 通過loader (一般來說) 或boot2 (略過執行loader),kernel 將會
檢查它的啟動標記,如果有,就開始按照標記做一些必要的調節。
7.4.1 內核啟動標記
這兒是一些啟動標記:
a
在內核初始化期間,詢問要使用哪一個設備作為root 文件系統
第6 頁FreeBSD 使用手冊
C
從CDROM 啟動
c
運行UserConfig,啟動時的內核配置
s
從單用戶模式啟動
v
在內核啟動期間更詳細的信息
7.5 Init:過程控制初始化
內核一旦啟動完成,它就把控制權轉交給用戶層命令init,它就在/sbin/init 中,在
loader 中,程序路徑可以通過init_path 指定。
7.5.1 自動重新啟動
這個程序會確定系統將要使用的文件系統是存在的。如果不存在,那么fsck 就不能正
常地被執行去修復磁盤驅動器,接著init 將把系統切換成單用戶模式,系統管理者就可以
在這時候直接處理這個錯誤。
7.5.2 單用戶模式
這個模式能夠通過自動啟動順序來延伸,或用戶啟動時通過加上-s 選項,或在loader
中設置boot_single。它也可以不重新啟動通過呼叫shutdown 來達到,或在多用戶模式下
加上-h 選項。如果系統控制臺console 被設置成insecure,那在開始單用戶模式之前,系
統就要求鍵入root 密碼。
例如7-3. 在/etc/ttys 中設置一個console 為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 的console 代表你的console 的安全等級是insecure 的,并且
確定如果有人要進入單用戶模式,就要輸入root 密碼,請注意,insecure 不代表你的
第7 頁FreeBSD 使用手冊
console 是inscure 的,而是,如果你要多一點的安全防護,請選擇insecure,而不是secure。
7.5.3 多用戶模式
如果init 正確地找到了你的文件系統,或結束了單用戶模式,系統就會進入多用戶模
式,并開始系統的資源配置。系統將先執行默認的配置文件/etc/defaults/rc.conf,和系
統的詳細配置/etc/rc.conf,接著按照/etc/fstab 來加載文件系統,再激活網絡服務,和
其它的系統守護程序(daemon),最后,執行部分程序的起始script 文件。rc 是個參考資源
設置系統的好地方,同樣,直接查閱那些scripts 也是個好方法。
7.6 關機程序
使用shutdown 可以控制系統進行關機,init 將會執行/etc/rc.shutdown 這個script
文件,接著輸出終止(terminate) 信號給所有的程序,這時如果有無法終止的程序,那么就
使用kill 來殺死信號。
第8 頁