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