關於LiLo--原理篇(轉)

post0發表於2007-08-11
關於LiLo--原理篇(轉)[@more@]

1一般的開機引導過程。

在PC機上,最初的啟動由BIOS完成。當開機自檢結束時(Power-On Self Test,POST),

BIOS嘗試讀入軟盤的第一個扇區,把它看作引導扇區。若沒有軟盤,則嘗試讀入硬碟

的第一個扇區。新的BIOS可以改變這種次序,先從硬碟啟動。甚至從光碟啟動。由於

大多數BIOS不提供SCSI支援,若要從SCSI磁碟啟動,SCSI介面卡要提供他自己的

BIOS.如果什麼都找不到,老的BIOS會啟動內建的ROM BASIC,或直接列印"NO

ROM-BASIC".

作業系統的啟動分幾步完成。由於引導扇區比較小,通常它主要任務是讀入第二

個loader,第二個loader再讀入第三個loader,直到整個作業系統被完全讀入。

DOS 引導區:

OFFSET

0x000 JMP xx Near jump into the program code

0x003 Disk parameters

0x03E Program code loading the DOS kernel

0x1FE 0xAA55 Magic number for BIOS

可見,引導區的結構相對比較簡單。它的長度總是512位元組。以上,磁碟引數

只對DOS有意義。重要的是引導區從0開始,以BIOS的magic number 結束。

從軟盤啟動比較簡單,因為只有一個引導扇區:第一個扇區。硬碟則困難一些,

它被分成很多分割槽。但是,BIOS根本不管分割槽資訊,它象對待軟盤一樣對待硬碟,

仍讀入第一個分割槽,叫作:master boot record.(MBR).

所以MBR也應該和上面介紹的結構一樣:從0開始,以BIOS的magic number 結束

在MBR的最後部分,有分割槽表。如下圖:

OFFSET Length

0x000 0x1BE code loading and starting the boot sector of the active

partitian

0x1BE 0x010 partition1

0x1CE 0x010 partition2

0x1DE 0x010 partition3

0x1EE 0x010 partition4

0x1FE 0x0012 0xAA55 Disk parameters

每個分割槽資訊佔16位元組,結構如下:

1 BOOT Boot flag: 0=not active ,0x80 active

1 HD Begin:head number

2 SEC CYL Begin:sector and cylinder number of boot sector

1 SYS System Code:0x83 linux , 0x82 linux swap etc.

1 HD End:head number

2 SEC CYL End: sector and cylinder number of boot sector

4 low byte high byte Relative sector number of start sector

4 low byte high byte Number of sectors in the partition

所以硬碟可以有4個分割槽。這四個分割槽叫做主分割槽:primary prititions.假如它

們不夠用,可以設定所謂的擴充套件分割槽。 擴充套件分割槽包含至少一個邏輯分割槽。擴充套件

分割槽的第一個扇區結構類似MBR,它的分割槽表的第一表項對應第一個邏輯分割槽。如果

存在第二個邏輯分割槽,那麼分割槽表的第二個表項就包含了一個指標。這個指標指向

第一個邏輯分割槽後面的一個地址。這個地址包含一個分割槽表。該分割槽表的第一表項

對應第二個邏輯分割槽。這樣就組成一個連結串列,從而擴充套件分割槽可以有任意多的邏輯分

區。

每一個主分割槽和擴充套件區都包含一個引導扇區。系統只能從這幾個地方之一啟動。

BOOT標誌決定哪個區被引導。

原來,只有主分割槽,因此,MS-DOS的fdisk和大多數同類工具只能啟用主分割槽..

MBR的程式碼要作以下的操作:

1:確定活動分割槽。

2:使用BIOS,將活躍分割槽的啟動扇區讀入。

3:跳到啟動扇區的0位置。

MBR的空間足夠完成這些工作。如上所述,每個分割槽理論上包含一個引導扇區,

而且,存在的第二個硬碟也包含和第一個類似的結構。MBR完全可以容納一個複雜

的載入程式。即所謂的boot manager,動態的決定活動分割槽。Linux 為我們提供了lilo

2 LILO:the linux loader

LILO引導扇區包括一個分割槽表的空間,所以,LILO即可以安裝在MBR中,也可以安

裝在某個分割槽的引導扇區。LILO擁有DOS引導扇區的所有功能,而且,它還可以引導

邏輯扇區和第二硬碟分割槽。LILO還可以和另外的引導者合作(例如:NT loader),這樣,

使用者就可以有很多選擇。

(注:以下幾個標題,為防止引起歧義,用原文)

2.1 LILO started by MS-DOS MBR

如果系統至少有一個linux主分割槽,(非交換區,且在第一硬碟上),那麼LILO就可

以安裝在這些分割槽中的一個。當 LILO對應分割槽被啟用後,引導過程如下:

BIOS 讀入 MBR

MBR 讀入 活躍主分割槽:LILO所在的分割槽。

LILO 引導Linux或另外的作業系統。

要引導其它OS且不用LILO很簡單,啟用那個分割槽。Linux分割槽沒有任何變化,非常安全。

2.2 LILO started by a boot manager

假如使用者不想刪除老的boot manager,或者某個OS LILO不能引導,可以考慮該途徑。

1. 假如boot manager可以引導擴充套件區,那兒是LILO的好去處。

2. 假如 boot manager 可以引導第二硬碟分割槽,linux可以裝在第二硬碟上。

3 有些 boot manager 甚至可以引導邏輯分割槽,那LILO就可以裝在邏輯分割槽上。

當然,也要注意以下情況:

1 某些作業系統直接改寫MBR,這會將原來的boot manager破壞。

2 重新分割槽會破壞擴充套件分割槽的引導扇區,這是LILO可能要重灌。

當安裝新的系統時,是否要重新安裝(linux)依靠新的boot manager,要麼LILO引

導扇區被登出,要麼boot manager 為它提供一個引導項。重新分割槽或分割槽格式化會將

LILO和linux全部刪除。

2.3 LILO佔據MBR

假如整個linux系統都在第二硬碟上,且第一硬碟沒有擴充套件分割槽,那麼,LILO只有裝

在MBR上。這樣,會將老的MBR衝去,所以,在安裝LILO前,要將老的MBR(包括分割槽

表)做一個備份。DOS下有很多工具可以完成這個任務。在linux下,這樣備份:

# dd if=/dev/hda of=/backup/MBR bs=512 count=1

寫會使用命令:

# dd if=/backup/MBR of=/dev/hda bs=446 count=1

這樣,原來的MBR就被寫會但不包括分割槽表。如果分割槽表也要恢復,那麼bs=512.

注意,這樣,新的分割槽表會被破壞!

2.4 LILO 檔案

與LILO有關的檔案通常放在/boot/下,配置檔案lilo.conf在/etc/下。包含實際

引導系統資訊的對映檔案有/sbin/lilo安裝。對於任何LILO安裝,配置檔案應該被定

置以適合個人需要。

The configuration file:配置檔案

基本上,配置檔案是一些變數賦值。每一行包含一個標誌變數或一個變數賦值.

配置檔案被特殊的變數賦值分成幾個區,每個區引導一個linux或其它OS.

下面解釋常見的行:

boot = device

說明那一個裝置或哪一個分割槽包含引導扇區。假如沒有給boot賦值,取當前預設值。

compact

啟用一種模式,在此模式下,LILO一次向BIOS請求讀入相鄰的幾個分割槽。這極大的

縮短了裝載時間,特別是從軟盤啟動。

delay=tenths

以10秒為單位,規定LILO在引導第一個引導配置前應等待使用者的時間。若沒有定義,則

直接引導。

Linear

使LILO生成線性地址,而不使用通常的Sector/Head/Cylinder機制。Linux地址機制

可以不依賴磁碟的物理結構。

install = boot sector

使用指定的boot sector寫入引導扇區,預設用/boot/boot.b

disktab=disktab

使用指定的disktab,預設使用/boot/disktab.disktab儲存了硬碟物理結構資訊。

map=map file

說明對映檔案的路徑。

message=file 指

定一個檔案,該檔案的內容將會在LILO引導是被顯示。假如沒有說明該檔案,那麼就

只會出現"LILO"。

verbose=level

說明LILO的除錯級別。從0(不顯示任何資訊)到5(所有的狀態資訊)。

backup = backup file

以前引導扇區內容的備份檔案。預設使用/boot/boot.device number

force-backup=backup file

和backup 相同,當時假如備份檔案存在,被覆蓋。

prompt

指定要使用者透過鍵盤選擇要引導的核心。不會預設選擇。

timeout=tenths

設定一個超時值,在此時間內必須有鍵盤輸入,否則用第一個配置。類似,假如超

時,就不能再輸入密碼。一般情況下,該取預設值,無窮大。

注:delay 與 timeout的區別(joe 認為),delay 是"LILO"出現後使用者必須有

輸入的最長時間。timeout 是使用者在按了任意鍵後,系統等待選擇,使用者

兩次擊鍵的最大間隔時間。

serial=port, bps parity bits

設定串列埠引數。如果LILO會從該檔案獲取串列埠引數的話。如果其中之一無效,

那所有三個引數都無效。Port從四個標準串列埠選擇一個:0對應COM1 或者

/dev/ttyS0.。支援的波特率範圍為:100-9600。所有校驗設定都支援

(n:none,e:even,odd)

bits為7或者8。預設為serial=0,2400n8.

Ignore-table

讓LILO忽略被破壞的分割槽表。

fix-table

允許LILO將每個分割槽的(sector/head/cylinder)地址轉化為線性地址。通常,

分割槽地址從cylinder boudary開始。某些作業系統,會改變這一點。由於LILO只能

將它的啟動扇區寫於兩種地址都一致的分割槽上,不正確的3D地址可以用fix-table

來糾正。但是,這種糾正不能被保證是永遠的,所以重分割槽以保證對齊cylinder

boudary 是最好的選擇。

password=password

為引導配置設定password

restricted

放鬆對password的限制。只有使用者想傳附加的啟動引數給核心時才需要password

optional

允許配置的幾個核心有錯誤的,或者不存在,如果不說明optional,LILO遇到這種

情況就會列印一些錯誤資訊然後退出。

每個從LILO引導的配置從image行開始。

Image = kernel

Label = name

Image包含要引導的核心。Label是給使用者選擇用的。Image行通常指向一個裝置,

例如/dev/fd0,可以找到核心的範圍用range來註明。

range = range

range可以用start sector -end sector 或者 start sector + length 表示。例如:

image = /dev/fd0

label = floppy

range = 1+512

以下變數賦值有可能出現:

append=string

將string作為引導引數傳給核心。例如,硬體引數。

literal=string

和append查不多。但是,他會沖掉原來的設定。所以不能被全域性說明。

ramdisk=size

設定RAM disk的大小。

read-only

read-write

設定根檔案系統的訪問方式。

root=device

設定根檔案系統存在的裝置。

vga=mode

螢幕設定。可能模式為:normal,extended 和ask. 。

以下設定是針對別的作業系統的:

loader=loader

說名用來引導作業系統的檔案。預設為 /boot/chain.b . 另外,LILO包含以

下的loader:

os2_d.b 可以從第二硬碟上引導os/2

any_d.b 在引導作業系統之前試圖將兩個硬碟的次序顛倒,從而可以引導第二硬碟

上的os.

table=device

說明一個裝置,該裝置的某個分割槽上存放要引導的os.假如沒有說明table,

LILO就不會將該資訊傳給要引導的osunsafe

關掉對要引導的os的檢查。只有要從軟盤引導時,才使用該設定。沒有該設定,

每次map installer開始執行時,引導盤都要插入軟碟機。

The disktab file

disktab檔案包含LILO要引導的裝置的物理結構資訊。通常,這些資訊可以從裝置驅

動程式獲取。所以,只有這種方法不行時才會用到disktab 檔案。在此情況下,如

果檔案不能用,LILO報告錯誤資訊:

geo_query_dev HDIO_GETGEO(dev …)

或者

HDIO_REQ not supported for your SISI controller

Please use /boot/disktab

然後,物理結構資訊就必須手工地輸入。

# /boot/distab-LILO parameter table

#

#This table contains the geometry parameters for SCSI and

# IDE disks,which can not be recognized automatically

# Entries in this table overwrite recognized parameters!

#

# Dev. BIOS Secs/ Heads/ Cylin - Par.

# num. Code track cyLin. Ders. Offset

(optional)

#0x800 0x80 32 64 202 0 # /dev/sda

各個域含義如下:

0x800

裝置號.由主副裝置號組成。

裝置號.由主副裝置號組成。

0x80

裝置的BIOS 碼。0x80程式碼系統的第一個硬碟。0x81第二個,。。。。

所有同一硬碟上的分割槽該值相同。

32,64,203

sector 數目(每個track)

heads 數目

cylinders 數目

0

分割槽的開始。也可以從分割槽表中讀,所以可以不說明。

2.5 LILO 啟動資訊

在啟動過程中,LILO會顯示'LILO',如果LILO出錯退出,可以根據顯示來判斷系統的

出錯原因。

沒有資訊:LILO根本就沒有被讀入,沒安裝LILO,或LILO駐留的分割槽沒被啟用。

Lnumber : LILO的第一部分被讀入並開始執行。但第二部分不能被讀入。後面

的數字表明出錯原因。這可能是由於硬碟的物理錯誤或不正確的物理結構資訊。

LI: LILO的第一部分可以讀入第二部分,第二部分執行時出錯。這可能是不正

確的物理結構資訊或重灌了boot.b而沒有執行LILO重新安裝。

LIL:LILO的第二部分啟動起來了,但是不能從map檔案讀入descriptor tables.

這說明不正確的物理結構資訊或物理錯誤。

LIL?: LILO的第二部分被讀到不正確的地址。原因同LI

LIL-: descriptor tables有錯。這可能是不正確的物理結構資訊或重灌了

map file而沒有執行LILO重新安裝

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章