Linux 啟 動 分 析 專 題
第一部分 背景知識簡介
幾乎所有編寫代碼的人都有這種體會︰如今在計算機這個行業中,許多技術不是你不懂,而是你不知道。所以,在分析之前有些背景知識是必須要知道的。
一. 硬碟架構簡介
1. 硬碟參數釋疑
到目前為止, 人們常說的硬碟參數還是古老的 CHS (Cylinder/Head/Sector)參數. 那麼為什麼要使用這些參數, 它們的意義是什麼? 它們的取值範圍是什麼? 很久以前, 硬碟的容量還非常小的時候, 人們採用與軟碟類似的架構生產硬碟,也就是硬碟盤片的每一條磁道都具有相同的扇區數,由此產生了所謂的3D參數 (Disk Geometry)。既磁頭數(Heads), 柱面數(Cylinders), 扇區數(Sectors),以及相應的尋址模式。
其中: 磁頭數(Heads) 表示硬碟總共有幾個磁頭,也就是有幾面盤片, 最大為 255 (用 8 個二進製位存儲); 柱面數(Cylinders) 表示硬碟每一面盤片上有幾條磁道, 最大為 1023(用 10 個二進製位存儲); 扇區數(Sectors) 表示每一條磁道上有幾個扇區, 最大為 63 (用 6個二進製位存儲); 每個扇區一般是 512個位元組(理論上講這不是必須的, 但好像都取此值)。
據此,磁片最大容量為: 255 * 1023 * 63 * 512 / 1048576 = 8024 MB ( 1M = 1048576 Bytes ) 或硬碟廠商常用的單位: 255 * 1023 * 63 * 512 / 1000000 = 8414 MB ( 1M = 1000000 Bytes )
在 CHS 尋址模式中, 磁頭, 柱面, 扇區的取值範圍分別為 0 到 Heads - 1,0 到 Cylinders - 1, 1 到 Sectors (注意是從 1 開始)。
2. 基本 Int 13H 調用簡介
BIOS Int 13H調用是 BIOS 提供的磁片基本輸入輸出中斷調用, 它可以完成磁片(包括硬碟和軟碟)的複位, 讀/寫, 校驗, 定位, 診斷, 格式化等功能。它使用的就是 CHS 尋址模式, 因此最大只能訪問 8 GB 左右的硬碟 ( 本文中如不作特殊說明, 均以 1M = 1048576 位元組為單位). 而更不幸的是,標準的IDE界面容許256個扇區/磁道、65536個柱面及16個磁頭。它自己本身可以存取 137438953472(128 GB),但是加上BIOS方面63個扇區與1024個柱面的限制後,就只剩528482304(1024*16*63 = 504MB)可以定址得到,這就是所謂標準IDE硬碟只認前504MB問題。
3. 現代硬碟架構簡介
在老式硬碟中, 由於每個磁道的扇區數相等 (與軟碟一樣), 所以外道的記錄密度要遠低於內道, 因此會浪費很多磁片空間。為了解決這一問題, 進一步提升硬碟容量, 人們改用等密度架構生產硬碟, 也就是說, 外圈磁道的扇區比內圈磁道多。採用這種架構後, 硬碟不再具有實際的3D參數, 尋址模式也改為線性尋址, 即以扇區為單位進行尋址。 為了與使用3D尋址的老軟體兼容 (如使用BIOS Int13H界面的軟體), 在硬碟控制單元內部安裝了一個位址翻譯器, 由它負責將老式3D參數翻譯成新的線性參數。這也是為什麼現下硬碟的3D參數可以有多種選擇的原因 (不同的工作模式對應不同的3D參數, 如 LBA, LARGE, NORMAL)。
4. 擴展 Int 13H 簡介
雖然現代硬碟都已經採用了線性尋址, 但是由於基本 Int 13H 的制約, 使用 BIOS Int 13H 界面的程式, 如 DOS 等還是只能訪問 8 G 以內的硬碟空間。為了打破這一限制, Microsoft 等幾家公司製定了擴展 Int 13H 標準(Extended Int13H,詳見附錄A), 採用線性尋址模式存取硬碟,所以突破了 8 G 的限制,而且還加入了對可拆卸介質 (如活動硬碟) 的支援。
二. Boot Sector 架構簡介
1. Boot Sector 的組成
Boot Sector 也就是硬碟的第一個扇區, 它由 MBR (Master Boot Record),DPT (Disk Partition Table) 和 Boot Record ID(Magic Number) 三部分組成。
MBR 又稱作主引導記錄,佔用 Boot Sector 的前 446 個位元組 ( 0 to 0x1BD ),包含了硬碟的一系列參數和一段系統主引導程式。引導程式主要是用來在系統硬體自檢完後負責從活動分區中裝載並營運系統引導程式(引導作業系統)。它的最後一條執行語句是一條JMP指令,跳到作業系統的引導程式去。這裡往往是引導型病毒的注入點,也是各種多系統引導程式的注入點。但是由於引導程式本身完成的功能比較簡單,所以我們完全可以判斷該引導程式的合法性(比如看JMP指令的合法性),因而也易於修復。象命令fdisk/mbr可以修復MBR和KV300這類軟體可以查殺任意類型的引導型病毒,就是這個道理。 DPT 即主分區表,佔用 64 個位元組 (0x1BE to 0x1FD),記錄了磁片的基本分區訊息。主分區表分為四個分區項, 每項 16 位元組, 分別記錄了每個主分區的訊息(因此最多可以有四個主分區)。 Boot Record ID 即引導區標記,佔用兩個位元組 (0x1FE and 0x1FF), 對於合法引導區, 它等於 0xAA55, 這是判別引導區是否合法的標誌. Boot Sector 的具體架構如下圖所示:
2. 主分區表的架構
主分區表由四個分區項構成, 每一項的架構如下:
BYTE State : 分區狀態, 0 = 未激活, 0x80 = 激活 (注意此項) BYTE StartHead : 分區起始磁頭號 WORD StartSC : 分區起始扇區和柱面號, 低位元組的低6位為扇區號,高2位為柱面號的第 9,10 位, 高位元組 為柱面號的低 8 位 BYTE Type : 分區類型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此項未用 BYTE EndHead : 分區結束磁頭號 WORD EndSC : 分區結束扇區和柱面號, 定義同前 DWORD Relative : 線上性尋址模式下的分區相對扇區位址 (對於基本分區即為絕對位址) DWORD Sectors : 分區大小 (總扇區數)
注意︰在 DOS / Windows 系統下, 基本分區必須以柱面為單位劃分( Sectors * Heads 個扇區), 如對於 CHS 為 764/255/63 的硬碟, 分區的最小尺寸為 255 * 63 * 512 / 1048576 = 7.844 MB。
3. 擴展分區簡介
由於主分區表中只能分四個分區, 有時無法滿足需求, 因此設計了一種擴展分區格式。 基本上說, 擴展分區的訊息是以鏈表形式存放的, 但也有一些特別的地方。 首先,主分區表中要有一個基本擴展分區項, 所有擴展分區都隸屬於它,也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中。 對於DOS / Windows 來說, 擴展分區的類型為 0x05。 除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放, 後一個擴展分區的數據項記錄在前一個擴展分區的分區表中, 但兩個擴展分區的空間並不重疊。 擴展分區類似於一個完整的硬碟, 必須進一步分區才能使用。但每個擴展分區中只能存在一個其他分區, 此分區在 DOS/Windows 環境中即為邏輯盤。因此每一個擴展分區的分區表 (同樣存儲在擴展分區的第一個扇區中)中最多只能有兩個分區數據項(包括下一個擴展分區的數據項)。 擴展分區和邏輯盤的示意圖如下︰
三. 系統啟動過程簡介
系統啟動過程主要由一下幾步組成(以硬碟啟動為例)︰
1. 開機; 2. BIOS 加電或按reset鍵後都要進行系統複位,複位後指令位址為 0ffff:fff0,這個地方只有一條JMP指令, 跳轉到系統自檢 ( Power On Self Test -- POST )程式處; 3. 系統自檢完成後,將硬碟的第一個扇區 (0頭0道1扇區, 也就是Boot Sector)讀入內存位址 0000:7c00 處; 4. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於則轉去嘗試其他啟動介質, 如果沒有其他啟動介質 則顯示 "No ROM BASIC" 然後當機; 5. 跳轉到 0000:7c00 處執行 MBR 中的程式; 6. MBR程式 首先將自己複製到 0000:0600 處, 然後繼續執行; 7. 在主分區表中搜索標誌為活動的分區,如果沒有發現活動分區或有不止一個活動分區, 則轉停止; 8. 將活動分區的第一個扇區讀入內存位址 0000:7c00 處; 9. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於則 顯示 "Missing Operating System" 然後停止, 或嘗 試軟碟啟動或; 10. 跳轉到 0000:7c00 處繼續執行特定系統的啟動程式; 11. 啟動系統...
以上步驟中 2,3,4,5 步是由 BIOS 的引導程式完成. 6,7,8,9,10步由MBR中的引導程式完成.
一般多系統引導程式 (如 SmartFDISK, BootStar, PQBoot 等)都是將標準主引導記錄替換成自己的引導程式, 在營運系統啟動程式之前讓用戶選擇要啟動的分區。 而某些系統自帶的多系統引導程式 (如 lilo, NT Loader 等)則可以將自己的引導程式放在系統所處分區的第一個扇區中, 在 Linux中即為 SuperBlock (其實 SuperBlock 是兩個扇區)。
注︰以上各步驟中使用的是標準 MBR, 其他多系統引導程式的引導過程可能與此不同。
下面簡要說明一下系統複位後的指令位址0ffff:fff0(物理位址0x0fffffff0)︰ 在實位址模式下,內存有兩個保留區域︰系統初始化區和中斷向量表區。位址0x00000~0x003ff 是為中斷向量保留的,256個可能的中斷,每一個保留4位元組的跳轉向量;位址0xfffffff0~0xffffffff是為系 統初始化保留的,此處一般只有一條JMP指令,跳到系統初始引導程式。 系統複位後,cs = 0x0f000、eip = 0x0000fff0,而系統初始引導程式安排在 0x0ffff0000~0x0ffffffff, 一般為ROM固件,使初始引導程式工作於內存實際位址空間以外的另一存儲段中。此區域的16~31位都 應為1,cs及eip的初值已保證位址線的16~19位為1,而20~31位,即位址線的高12位,則須由硬體強製置 1,這由一個標誌正反器在系統每次複位時置位實現觸發。而由於段間轉移指令要重新裝入cs暫存器, 因此,每當執行段間轉移指令時,此標誌正反器複位,以後,再次訪問時,不再向高12位位址線提供“1”信號,程式從此正常地工作於前1MB的位址空間。
第二部分 硬碟MBR主引導代碼分析
一.程式流程
(引導扇區是指硬碟相應分區的第一個扇區,是和作業系統有關的,作業系統的引導是由它來完成的;而MBR主引導程式並不負責引導作業系統,MBR是和作業系統無關的,他的任務是把控制權轉交給作業系統的引導程式.)
1 將程式代碼由0:7C00H移動到0:0600H(注,BIOS把MBR放在0:7C00H處) 2 搜索可引導分區,即80H標誌 成功︰goto 3 失敗︰跳入ROM BASIC 無效分區表︰goto 5 3 讀引導扇區 失敗︰goto 5 成功︰goto 4 4 驗証引導扇區最後是否為55AAH 失敗︰goto 5 成功︰goto 6 5 列印錯誤進入無窮循環 6 跳到0:7C00H進行下一步啟動工作
二.代碼註釋
下面將用組合語言寫出這一段代碼,並進行說明。
;MBR.ASM ; MASM MBR ; LINK MBR ; EXE2BIN MBR
.MODEL tiny .CODE
;設定暫存器及堆棧值
org 0 Head: Start: cli xor ax,ax mov ss,ax mov sp,7C00H ;ss:sp=0:7C00H mov si,sp push ax pop es push ax pop ds ;es=ds=0 sti
;將程式代碼由0:7C00H移動到0:0600H處
cld mov di,600H mov cx,100H ;100H Words=512 Bytes,即一個扇區大小 repne movsw db 0EAH ;這個是FAR JUMP的機器碼 dw offset Continue+600H, 0000H ;這個是跳轉到達站址,即0:061DH
;搜索可引導分區
Continue:
mov si,600H+1BEH ;si指向分區表 mov bl,4 ;四個分區
FindBoot:
cmp byte ptr[si],80H je SaveRec ;讀扇區位置 cmp byte ptr[si],0 jne Invaild ;無效分區 add si,10H dec bl jnz FindBoot int 18H ;進入ROM BASIC
;讀取引導分區的扇區,柱面號
SaveRec:
mov dx,[si] mov cx,[si+2] mov bp,si
;檢查其餘分區表
FindNext:
add si,10H dec bl jz SetRead cmp byte ptr[si],0 ;是否存在非法分區 je FindNext
Invaild:
mov si,offset ErrMsg1+600H
;字元串輸出次程序
PrintStr:
lodsb cmp al,0 je DeadLock push si mov bx,7 mov ah,0EH ;輸出字符 int 10H pop si jmp short PrintStr ;下一字符
DeadLock:
jmp short DeadLock ;無窮循環,也可以寫成jmp $
;讀引導扇區
SetRead:
mov di,5 ;讀取次數
ReadBoot:
mov bx,7C00H mov ax,201H push di int 13H ;cx,dx已經在SaveRec處得到 pop di jnc GoBoot ;成功則啟動 xor ax,ax int 13H ;reset驅動器,然後再讀取 dec di jnz ReadBoot
mov si,offset ErrMsg2+600H jmp short PrintStr 失敗輸出訊息,並進入無窮循環
;檢查讀入的引導扇區
GoBoot:
mov si,offsetErrMsg3+600H mov di,7C00H+1FEH cmp word ptr[di],0AA55H jne PrintStr ;非AA55標誌則輸出錯誤訊息 mov si,bp ;si指向可啟動分區 db 0EAH,0,7CH,0,0 ;跳轉至0:7C00H
ErrMsg1 db 'Invaild partition table',0 ErrMsg2 db 'Error loading operating system',0 ErrMsg3 db 'Missing operating system',0
Tail:
FillNum equ 1BEH-(Tail-Head) ;計算填0數目 db FillNum dup(0)
;四個分區表項數據,跟分區情況有關,詳細含義另解
PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0 db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0 db 20H dup(0)
ID dw 0AA55H
end start
;如果開始試用org 600H,那麼訪問數據時就不必加上600H,如mov si,offset ErrMsg2+600H ;可寫為mov si,offset ErrMsg2,這時就不能用exe2bin得到數據,必須試用debug ;debug mbr.exe ;-nmbr.bin ;-rcx 200 ;-wcs:600 ;-q
在硬碟的第一個扇區上儲存著分區訊息,即主分區表,共有四項,讀取分區表必須使用bios的int 13h,一般使用debug就可以了︰
debug -a xxxx:0100 mov ax,201 mov bx,200 mov cx,1 mov dx,80 ;如果是第二個硬碟則是81... int 13 int 20 xxxx:???? -g=100
這時xxxx:0200開始的512位元組就是分區表所在的扇區,前面一部分為MBR,在debug中用-d3be l40就可以看到64位元組的分區表訊息,16個位元組為一項,用-e命令就可以修改,改完後可以重新寫回去,只要把前面代碼中的mov ax,201改為mov ax,301即可,或者直接把102處的2改成3,比如︰
-e 102 xxxx:0102 02.3 -g=100
這樣就寫回去了,不過修改硬碟的第一個扇區須非常謹慎。
下面說一下分區表項的具體意義,取其中一項舉個例子︰
80 01 01 00 0B 3F FF 00 3F 00-00 00 81 4F 2F 00
1 (80)引導標誌,80代表可引導,00代表不可引導,一般必須且只能有一個分區表項的引導標誌為 80,除非你自己修改MBR 2 (01)分區開始磁頭 3,4 (01 00)=(0,1)分區開始柱面和扇區(後面後詳解) 5 (0B)分區類型(後面有詳解) 6 (3F)=(63)分區結束磁頭 7,8 (FF 00)=(768,63)分區結束柱面和扇區(同上) 9-12 (3F 00 00 00)=(63)此分區前扇區總數,即相對扇區數 13-16 (81 4F 2F 00)=(002F4F81H=3100545)此分區扇區總數
柱面和扇區共用兩個位元組表示,而柱面號為10位,最大1023,扇區號為6位,最大63,具體各位分佈如下圖︰ 扇區號 _____|____ | | ( 7 6 5 4 3 2 1 0 ) ( 7 6 5 4 3 2 1 0 ) |__| |___________| |___________________| | 柱面號
關於分區類型,常見的有︰
00 未用,Unused 01 DOS-12(FAT 12) 02 XENIX 04 DOS-16(FAT 16)(分區<32M的,應該已沒有了) 05 EXTEND(DOS擴展分區) 06 BIGDOS(>32M)(這個才是現下常說的FAT 16) 07 HPFS(OS/2)(NTFS也是這個標記,好像是) 0B FAT 32 0F 這個一時不確定 50 DM 63 386/ix(unix) 64 NET286(Novell) 65 NET386(Novell) 82 Linux swap 83 Linux native FF BBT(UNIX Bad Block Table)
下面有幾個算式用來計算分區參數︰
1)第一分區參數
扇區總數=(結束柱面+1)*磁頭數*每柱面扇區數-相對扇區數,例如︰3100545=(768+1)*64*63-63
2)其它分區參數
扇區總數=(結束柱面-起始柱面+1)*磁頭數*每柱面扇區數,如下例︰ 00 00 C1 01 05 3F FF FD C0 4F-2F 00 C0 90 0F 00 000F90C0H=1020096,(FF FD)=(1021,63),(C1 01)=(769,1),1020096=(1021-769+1)*64*63
3)第一分區相對扇區=每柱面扇區數 其它分區相對扇區=上一分區相對扇區+上一分區扇區總數
擴展分區訊息是一個鏈狀架構,在刪除分區時,把前面的分區刪掉會導致後面的分區也找不到,原因就在於此,我們從主分區表中取出擴展分區項進行一下分析,如下︰
00 00 01 C0 05 FE BF 6E C0 10-2F 00 EF A6 69 00
由此我們可以得到數據︰ 開始磁頭︰00 開始柱面扇區︰01 C0=(192,1)
用debug
debug -a100 xxxx:0100 mov ax,201 mov bx,200 mov cx,c001 ;開始柱面扇區號 mov dx,80 ;dh中為開始磁頭號,這裡為0 int 13 int 20 xxxx:???? -g=100 -d3be l10
讀出的扇區中有兩個16位元組的分區表項和最後的一個55AA標誌,這兩個分區表項為︰
00 01 01 C0 06 FE 7F 97 3F 00-00 00 99 F2 34 00 00 00 41 98 05 FE BF 6E D8 F2-34 00 17 B4 34 00
第一個分區類型為6,其實這是第一個邏輯分區,含義和主分區表項相同 第二個分區類型為5,這其實是指向下一個擴展分區表的 從這裡我們可以得到︰ 開始磁頭︰0 開始柱面扇區︰41 98=(408,1)
繼續用debug讀出(mov cx,9841)得到
00 01 41 98 06 FE BF 6E 3F 00-00 00 D8 B3 34 00
只有一個表項,是第二個邏輯盤,而且是邏輯盤鏈的最後一個。 可以看到,主分區表是非常重要的,所以除了小心操作外,還應當進行備份,最安全的備份模式就是用筆抄下來,當然,每次重新進行分區後還應當及時更新。從前面可以看出,分區表裡最重要的還是柱面號,其它比如磁頭號都是0或者1或者最大值,扇區號都是1或63(最大值),扇區總數什麼的也都能算出來,所以分區時最好把各分區的柱面號記下來,這樣一旦分區訊息被破壞就可以進行恢復了。 如果主分區表不幸丟失或者邏輯分區鏈被破壞,那麼只要從硬碟上找出還存在的分區訊息,就有可能部分恢復分區訊息,甚至全部可以恢復,不過這樣的麻煩大家還是應盡量避免。 在Linux裡有一種方法可以恢復主引導扇區(包括主分區表),用如下的命令︰ dd if=/boot/boot.NNNN of=/dev/hda bs=512 count=1 其中︰boot.NNNN 是我們在安裝Linux之前整個主引導扇區的備份,NNNN是分區的主次設備號;bs(buffer size)是指重寫的位元組數。如只是為了修復主引導記錄MBR(比如,想把LILO卸載掉),而不是恢復整個主引導扇區,則用如下的命令︰ dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1 只把主引導扇區的備份檔案boot.NNNN的前446個位元組重寫入主引導扇區。
下一頁
<返回前頁> 文︰ 劉淵
了生活要向前看 理解生活要後看................
文章選項︰ beyond_wyc (enthusiast) 03-12-10 19:45 [精華] [zt]LILO 詳解 [re: beyond_wyc]
LILO 詳解
一台電腦從加電到進入操作界面是經過了一系列複雜的操作的。基本的工作是由BIOS完成的。當POST(自檢)結束後,BIOS嘗試讀入BIOS設定的第一個啟動設備的第一個扇區,把它看作引導扇區(原先的BIOS總是先嘗試軟碟的),然後讀入裡面的訊息來引導系統。 我們先來看看DOS的系統引導區︰ OFFSET 0x000 JMP xx ; 近距離跳轉到xx代碼段 0x003 ; 磁片參數 0x03E ; 載入DOS系統核心的代碼段 0x1FE 0xAA55 ; 這是BIOS的幻數 DOS的引導區總是從0開始,以BIOS的magic number 結束,總共512位元組。從軟碟啟動比較簡單,因為只有一個引導扇區:第一個扇區。而硬碟雖然有很多分區,但是,BIOS根本不去檢視分區訊息,它象對待軟碟一樣對待硬碟,仍讀入第一個分區:master boot record (MBR). 所以MBR也應該從0開始,以BIOS的magic number 結束。在MBR的最後部分儲存了分區表。 每個分區訊息占16位元組,定義了硬碟可以有4個Primary Partition。如果這些不夠用,可以設定所謂的擴展分區。擴展分區包含至少一個邏輯分區。擴展分區的第一個扇區架構類似MBR,它的分區表的第一表項對應第一個邏輯分區。如果存在第二個邏輯分區,那麼分區表的第二個表項就包含了一個指標。這個指標指向第一個邏輯分區後面的一個位址。這個位址包含一個分區表。該分區表的第一表項對應第二個邏輯分區。這樣就組成一個鏈表,從而擴展分區可以有任意多的邏輯分區。 每一個主分區和擴展區都包含一個引導扇區。系統只能從這幾個地方之一啟動。BOOT標誌決定哪個分區的引導扇區被引導。 MS-DOS的fdisk和大多數同類工具只能激活主分區。 MBR的代碼要作以下的操作︰ 1︰確定活動分區(Active Partition) 2︰使用BIOS,將活躍分區的啟動扇區讀入 3︰跳到啟動扇區的0位置。 MBR的空間足夠容納一個引導程式來動態的決定活動分區。LILO就是這樣一個引導程式。
LILO(LInux LOader) LILO引導扇區包括一個分區表的空間,所以,LILO即可以安裝在MBR中,也可以安裝在某個分區的引導扇區。 1.LILO可以佔據MBR,但是會將老的MBR沖去,出於安全起見,最好在在安裝LILO前,將老的MBR(包括分區表)做一個備份。可以透過鍵入 # dd if=/dev/hda of=/backup/MBR bs=512 count=1 來備份原來的MBR訊息, 如果要將MBR寫回,可以鍵入︰ # dd if=/backup/MBR of=/dev/hda bs=446 count=1 這樣,原來的MBR就被寫回但不包括分區表。如果分區表也要恢復,那麼設定bs=512。
2.透過MS-DOS MBR被引導 LILO就可以安裝在這些分區中的一個。當 LILO對應分區被激活後,引導過程如下︰ BIOS 讀入 MBR MBR 讀入 活躍主分區︰LILO所在的分區; LILO 引導Linux或另外的作業系統。 要引導其它OS且不用LILO很簡單,激活那個分區。Linux分區不會有任何變化。
3.LILO也可以被其他的系統引導程式(Boot Manager)引導 1. 假如boot manager可以引導擴展區,Linux可以裝在擴展區上; 2. 假如 boot manager 可以引導第二硬碟分區,linux可以裝在第二硬碟上; 3. 有些 boot manager 甚至可以引導邏輯分區,那LILO就可以裝在邏輯分區上。 但是對於系統引導程式要特別注意的是︰某些作業系統直接改寫MBR,這會將原來的boot manager破壞。
配置LILO 與LILO有關,即有關係統引導的檔案通常放在/boot/下,配置檔案是/etc/lilo.conf下。合理的配置lilo. conf對於系統的正常高效營運有著非常重大的意義,可以透過man lilo.conf來檢視配置的注意事項 下面是一些重要常用的選項︰ "boot=" 指明包含引導扇區的設備名(如︰/dev/had),若此項忽略,則從當前的根分區中讀取引導扇區。 "root=" 告訴內核啟動時以哪個設備作為根檔案系統使用,其設定值為構造內核時根檔案系統的設備名,可用的設備名有︰ (1)/dev/hdaN~/dev/hddN︰ST-506兼容硬碟,a到d上的N個分區 (2)/dev/sdaN~/dev/sdeN︰SCSI兼容硬碟,a到e上的N個分區 (3)/dev/xdaN~/dev/xdbN︰XT兼容硬碟,a到b上的N個分區 (4)/dev/fdN︰軟碟,A︰(N=0)或B︰(N=1) (5)/dev/nfs︰由網路取得根檔案系統的標誌 "nfsroot=" 若需透過NFS提供根檔案系統來引導無盤工作站,此參數為內核指定了網路根檔案系統所在的機程式、目錄及NFS,其格式為︰nfsroot=(〈server_ip〉:)〈root_dir〉(,nfs_options)) "nfsaddrs=" 設定網路通訊所需的各種網路界面位址,如無此參數,則內核會試圖用反向位址解析協定(RARP)或啟動協定(BOOTP)找出這些參數,其格式為︰ nfsaddrs=〈客戶端IP〉:〈服務端IP〉:〈通訊閘IP〉:〈子網屏蔽〉: 〈客戶端名稱〉:〈網路設備名 〉:〈auto〉 "image=" 指定Linux的內核檔案。 "delay=" 以10毫秒為單位,設定引導第一個映像前的等待時間。 "disk=" 某一特殊的硬碟定義非標準參數。 "append=" 為內核傳遞一個可選的參數行,其典型的應用是為不能完全由系統自動識別的硬碟指定參數,如︰append = "hd=64,32,202",還有為一些無法自動識別大內存的低版本內核傳遞參數,方法是append="mem=128M".mem後邊是數字+單位,這個單位可以是byte/M等等
"label=" 為每個映像指定一個名字,以供引導時選擇。 "read-only" 設定以只讀模式掛入根檔案系統,用於檔案系統一致性檢查(fsck) "install=" 安裝一個指定檔案作為新的引導扇區,缺省為/boot/boot.b。 "loader=" 說明所使用的鏈加載程式(chain loader),缺省為/boot/chain.b,如果不是從首硬碟或軟碟啟動,那麼,此選項必須說明。 "table=" 說明包含分區表的設備名,如果此參數忽略,引導加載程式將不能傳遞分區訊息到已引導的作業系統。當此參數指向的分區表被修改時,必須重新營運/sbin/lilo。 "init=" 內核初始化時執行的程式,通常過程為init、getty、rc和sh,版本1.3.43以來的Linux內核能夠執行/sbin/init說明的命令行,若在引導過程中出現問題,則可設定init=/bin/sh直接跳到Shell。 "ramdisk_start=" 由於內核不能放在壓縮的內存檔案系統映像內,為使內核映像能夠和壓縮的內存映像放在一張軟碟內,加入"ramdisk_start=〈offset〉",這樣內核才開始執行。 "vga=" 設定顯示模式,如80×50、132×44等。 "compact" 激活一種模式,在此模式下,LILO一次向BIOS請求讀入相鄰的幾個分區。這極大的縮短了裝載時間,特別是從軟碟啟動。 "Linear" 使LILO生成線性位址,而不使用通常的Sector/Head/Cylinder機製。Linux位址機製可以不倚賴磁片的物理架構。 "install = boot sector" 使用指定的boot sector寫入引導扇區,缺省用/boot/boot.b "map=" 說明映射檔案的路徑。 "message=[File]" 指定一個檔案,該檔案的內容將會在LILO引導是被顯示。假如沒有說明該檔案,那麼就只會出現"LILO"。 "verbose=[level]" 說明LILO的調試級別。從0(不顯示任何訊息)到5(所有的狀態訊息)。 "backup = [backup file]" 以前引導扇區內容的備份檔案。缺省使用/boot/boot.device number "force-backup=[backup file]" 和backup 相同,當時假如備份檔案存在,被覆蓋。 "prompt" 指定要用戶透過鍵盤選擇要引導的內核。不會缺省選擇。 "timeout=" 設定一個超時值,在此時間內必須有鍵盤輸入,否則用第一個配置。類似,假如超時,就不能再輸入密碼。一般情況下,該取缺省值,無窮大。 "serial=port, bps parity bits" 設定串口參數。如果LILO會從該檔案獲取串口參數的話。如果其中之一無效,那所有三個參數都無效。Port從四個標準串口選擇一個︰0對應COM1 或者/dev/ttyS0.。支援的波特率範圍為︰100-9600。所有校驗設定都支援(n:none,e:even,o: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引導過程 每個從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
LILO 啟動訊息 缺省設定的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重新安裝。
LILO的卸載 LILO裝在MBR以後,它會保留一個MBR的備份在系統的/boot/boot.xxyy中,其中xyy是16進製的設備主/次號碼(major/minor numbers),利用命令"ls -l /dev/device"就可獲得硬碟或分區的主/次號碼。如果這些備份檔案已經存在,那麼,當你重新安裝LILO時,它將不再生成此檔案,這就保證了此備份檔案是最原始的引導扇區。 若要卸載LILO,你只需恢復初始的引導扇區就可以了。例如︰LILO安裝在/dev/had,對應的備份檔案為/boot/boot.0300,使用下面的命令即可︰ # dd if=/boot/boot.0300 of=/dev/had bs=446 count=1 LILO是現下Redhat Linux、TurboLinux等許多Linux distribution缺省的引導程式,正如上面所介紹的,擁有很強大的功能,更詳細的內容可以在lilo安裝的README檔案中發現。最重要的是在良好的備份意識指導下,多多實踐,這樣才能得到最佳的效果。
文︰ 劉穩
|