聲明:本筆記並非原創,只是我個人的學習筆記!
很多的內容來自www.Linuxsir.com www.linuxfans.org www.linuxAID.com www.lslnet.com
非常感謝以上網站對我的學習提供的莫大的幫助,本著學習和分享的原則我貼出我的學習筆記,更希望兄弟們能給我指出其中錯誤的地方.謝謝!!!
學習這部分知識,首先要學到問題的思路,其次你還要記住一些東西,是死記硬背下來!你會發現這點東東的確是很有用的!
本文參考了大概有10來位作者(記得的有周迪,徐永久,鄭良,Albert,江永忠等)的文章,出自上面所列網站,所以我就不再單獨列出這些作者的名子了,請原諒!
盡管如此,本文檔歸屬linuxsir-probing!轉載請注明出處!更不能被用到商業用途上!
1 首先要了解的幾個概念
1.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個分區。這四個分區叫做主分區rimary prititions.假如它 們不夠用,可以設置所謂的擴展分區。擴展分區包含至少一個邏輯分區。擴展 分區的第一個扇區結構類似MBR,它的分區表的第一表項對應第一個邏輯分區。如果 存在第二個邏輯分區,那麼分區表的第二個表項就包含了一個指針。這個指針指向 第一個邏輯分區後面的一個地址。這個地址包含一個分區表。該分區表的第一表項 對應第二個邏輯分區。這樣就組成一個鏈表,從而擴展分區可以有任意多的邏輯分 區。
每一個主分區和擴展區都包含一個引導扇區。系統只能從這幾個地方之一啟動。 BOOT標志決定哪個區被引導。
原來,只有主分區,因此,MS-DOS的fdisk和大多數同類工具只能激活主分區.. MBR的代碼要作以下的操作:
1:確定活動分區。
2:使用BIOS,將活躍分區的啟動扇區讀入。
3:跳到啟動扇區的0位置。
MBR的空間足夠完成這些工作。如上所述,每個分區理論上包含一個引導扇區, 而且,存在的第二個硬盤也包含和第一個類似的結構。MBR完全可以容納一個復雜 的引導程序。即所謂的boot manager,動態的決定活動分區。Linux 為我們提供了lilo.
1.2LILO的引導機制
如上所述,計算機的最初啟動是由BIOS控制的,在對一些硬件(如:內存、鍵盤等)初始化之後,它會試圖加載硬盤的主引導記錄(MBR)或軟盤的引導扇區。
MBR可通過兩種方式運行,其一是定位到活動分區並加載相應的引導扇區,然後由引導扇區完成該分區內操作系統的基本組件的加載;其二是直接從一指定分區中加載信息,並通過它裝入任一分區的操作系統,諸如LILO、OS/2 boot loader及Partition Magic等引導加載程序都可以配置成這種方式。
軟盤的引導扇區相當於硬盤活動分區的引導扇區,它通常用於裝入軟盤上的操作系統。
由此可見,只要把LILO安裝在MBR、活動分區或者引導軟盤上,就能接管計算機的控制權,然後由LILO完成後繼的引導過程。LILO中建有一個引導表地址編碼,借此它的引導程序就能定位到Linux的內核文件,這種地址編碼既可以按照柱面/磁頭/扇區(CHS)模式,又可以采用LBA的線性塊號模式,因此,即使對某些SCSI控制程序LILO也能運轉良好。
當LILO定位到配置文件後,經過預引導過程,就顯示提示符:
LILO boot:
此時,系統允許選擇引導不同的操作系統或者不同的內核配置,按Tab鍵顯示可選項列表,然後輸入可選項或者直接回車選擇缺省配置,如果選擇了引導Linux,還可以直接傳遞參數到系統內核。
1.3LILO的特點
和其他系統的引導加載程序相比,LILO具有更大的靈活性,其引導方式也更豐富多彩。當然,GRUB也非常不錯,在本版中我們也曾經有過詳細的介紹.
● 當LILO被安裝在硬盤的MBR、活動分區或引導軟盤上時,作為原引導程序的替身,它能引導任一硬盤任一分區上的Linux和其他操作系統;
● 除了引導扇區,它沒有任何隱含文件,也不需要使用特定的分區,它的配置文件可以在任何分區、甚至是存放在與Linux毫不相干的DOS分區的某個子目錄下;
● 它能引導幾個不同的內核配置,甚至是幾個不同的內核;
● 它能引導同一機程序上的多個Linux版本;
● 它能從網絡上引導Linux。
● 新版LILO 0.21.4.2突破1024-cylinder限制,新版本最大的更新是通過使用EDD BIOS EXTENSIONS消除了1024-cylinder的限制,現在LILO能夠支持達2TB的硬盤。
Download: FTP://sd.dynhost.com/pub/linux/lilo/ (10691 hits)
Alternate Download: ftp://metalab.unc.edu/pub/Linux/system/boot/lilo/ (1762 hits)
Appindex Record: http://freshmeat.net/appindex/1998/12/04/912827201.Html
LILO的靈活性使得其配置變得相當復雜,當有多個系統共存時,建議先安裝其他操作系統,最後再裝Linux,這樣,設置LILO對其他系統的引導會相對簡單一些。
1.4什麼是LILO以及本文檔的一些約定
把這個問題放到最後來回答是因為在看了以上的內容後你可以深刻的理解了lilo而不是簡單的說lilo就是一個啟動管理器.
LILO(Linux Loader)是Linux自帶的一個優秀的引導管理器,使用它可以很方便地引導一台機器上的多個操作系統。與其他常用的引導加載程序相比,LILO引導方式顯得更具有藝術性,對其深入的理解,將有助於我們方便地處理多操作系統、網絡引導、大硬盤及大內存等諸多棘手的問題。
通常我們談到LILO,會涉及到兩個方面--LILO引導程序和LILO安裝命令/sbin/lilo。為了不至於混淆這兩個概念,本文將用LILO表示LILO引導程序,而lilo表示/sbin/lilo。
一般地,LILO使用一個文本文件/etc/lilo.conf作為其配置文件。lilo讀取lilo.conf,按照其中的參數將特定的LILO寫入系統引導區。任何時候,修改了/etc/lilo.conf,都必須重新運行lilo命令,以保證LILO正常運行。lilo.conf使用的配置參數很多,配置起來也相當復雜。下面以RedHat Linux為例作一些初步探討,RedHat的lilo程序包版本為0.20,可能這個版本相對來說老了,並且別的Linux發行版本可能會有所出入,但你要學會的不是簡單的按步就班的做,而是學會基本概念後有自己的思路,用自己的思路來解決問題。
lilo.conf文件中的配置參數分為兩部分,一部分是全局參數,另一部分是引導映像參數。與Linux系統其他的配置文件一樣,"#"號後的一行文字表示注釋。
LILO引導扇區包括一個分區表的空間,所以,LILO即可以安裝在MBR中,也可以安 裝在某個分區的引導扇區。LILO擁有DOS引導扇區的所有功能,而且,它還可以引導 邏輯扇區和第二硬盤分區。LILO還可以和另外的引導者合作(例如:NT loader),這樣, 用戶就可以有很多選擇。
2 LILO的調試
LILO 最大的好處就是它獨立於文件系統,可以啟動各種操作系統:從Microsoft、OS/2、SCO Unix、Unixware、PC-DOS到Linux等等。LILO 能處理最多16個不同的映像,LILO 寫入MBR 時就作為主引導程序,寫入擴展分區的引導扇區時就是第二引導程序。采用LILO,可以有多種組合方式啟動系統。我們先來看看引導過程,硬盤上的數據被准確的分配到對應的"磁道"和"扇區",硬盤上的數據分布首先是引導扇區,然後是文件分配表(FAT),接下來就是數據區。硬盤分區時,被分為基本分區和擴展分區。基本分區可以作為引導分區,可以通過任何引導程序標記為可引導。擴展分區可以分成好幾個邏輯分區,很多的BIOS 不允許從邏輯分區啟動。
Linux 最多支持4個基本分區,如果需要額外的分區,那麼就要其中的一個基本分區變成擴展分區,然後在擴展分區裡面,劃分邏輯分區。很重要的一點是有些邏輯分區的分區表不能被識別為設備的第一塊。分區表通常存放於分區的引導扇區,而且,通常只有整個盤的分區啟動扇區用作引導扇區,稱為主引導記錄(MBR)。
LILO 可以用於以下情形:
1、第一硬盤的引導扇區。
2、軟盤的引導扇區。
3、位於第一硬盤的Linux 文件系統分區上的引導扇區。
LILO 不能用於以下情形:
1、交換分區。
2、擴展分區中的邏輯分區的引導扇區。
所以,如果你在第二硬盤上安裝了Linux ,而不能啟動的話,可以采取在第一硬盤上建立/boot 的辦法來解決。
引導加載過程由很多程序組成,我們先來看看LILO 安裝時的各種不同程序:
MAP 安裝程序: 這個程序把LILO 的文件放到合適的位置並記錄這些信息(會在LILO 啟動時用到),這個程序就是/sbin/lilo ,每次配置文件有改動或者有新內核時,需要重新運行一遍。
/boot/*.*: 其他LILO 啟動時需要的文件存放在 /boot 目錄下,map 文件是十分重要的,map 安裝程序把新內核的位置記錄到這個文件。
引導加載程序: 這個程序無需多言是最重要的部件了。它被BIOS 調入內存,然後調用內核或者其他操作系統的引導扇區。
包含引導加載程序第一部分的引導扇區被調入內存,然後調用引導加載程序的第二部分,一般位於文件 /boot/boot.b,接下來就啟動內核。
如果從可引導軟盤啟動的話,BIOS 把軟盤的第一個扇區調入內存,一般,這個扇區包含一段程序來啟動對應的操作系統。和軟盤一樣,如果LILO 寫入MBR ,那麼,MBR 就被調入內存,執行對應的操作,給用戶提示選擇需要引導的操作系統。具體地說,MBR 的頭 446 個字節由引導加載程序利用,剩余的64 字節是分區表信息。還剩下的兩個字節就是分區激活標志"55 AA" 了。
在軟盤上備份 MBR 信息:
bash# dd if=/dev/hda of=/dev/fd0 bs=512 count=1
恢復:(萬一的情況下)
bash# dd if=/dev/fd0 of=/dev/hda bs=446 count=1
卸載LILO:
當LILO覆蓋了引導扇區時,它會保留一個引導扇區的備份在/boot/boot.xxyy中,其中xxyy是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
當然,若想完全卸掉Linux,必須用Linux的fdisk對Linux分區進行破壞,因為DOS的fdisk無法移去非DOS分區。
還可在DOS下用命令:
c:> fdisk /mbr
恢復 LILO:
重新安裝 Windows 以後,就會把LILO 干掉。無論什麼原因我們都應該知道怎樣恢復LILO。
最好手頭有一張安裝 CD ,這年頭,干淨並且確實好用的軟盤太少了。所以不推薦你使用軟盤。當然,如果你認為你的軟盤質量可靠,那麼可以從CD-ROM上建立應急啟動盤:
dd if=/cdrom/disks/rescue of=/dev/fd0
在 DOS 下面,采用:
rawrite image-name a:
也可以在 www.bootdisk.com上下載一個,按照說明制作一張啟動磁盤。
如果從 CD 啟動的話,各個不同的Linux 版本有不同的方法進入應急狀態。Red Hat 啟動後有一個應急模式,SuSE 的話,需要先進入安裝界面,然後按Ctrl+Alt+Fn 鍵找到shell 提示符,可以在這個提示符下來恢復。
下面介紹恢復步驟:
首先建立掛接點:
mkdir mount
然後把丟失的 Linux 掛接到這裡:
mount /dev/hda6 mount
如果 /boot 位於另外的分區,
需要把他掛接到 mount/boot 目錄下,例如:
mount /dev/hda1 mount/boot
使用 chroot 命令,把 mount 作為根目錄,cd /boot
命令實際上進入的是 "mount/boot" 目錄:
chroot mount
運行 /sbin/lilo ,這樣就把 LILO 安裝回了 MBR,重新啟動就會看到 LILO 提示符回來了。
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/had of=/backup/MBR bs=512 count=1
寫會使用命令:
# dd if=/backup/MBR of=/dev/had 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出錯退出,可以根據顯示來判斷系統的 出錯原因。
注意,如果磁盤發生瞬間故障,可能會在第一個字母"L"後插入一些十六進制數字(磁盤錯誤碼)。除非LILO停在那裡並不停地產生錯誤碼流,否則並不說明有嚴重問題。
沒有信息:LILO根本就沒有被讀入,沒安裝LILO,或LILO駐留的分區沒被激活。
L(number): LILO的第一部分被讀入並開始執行。但第二部分不能被讀入。後面 的數字表明出錯原因。這可能是由於硬盤的物理錯誤或不正確的物理結構信息。
LI: LILO的第一部分可以讀入第二部分,第二部分執行時出錯。這可能是不正確的物理結構信息或重裝了boot.b而沒有運行LILO重新安裝。
LIL:LILO的第二部分啟動起來了,但是不能從map文件讀入描述符表(descriptor tables).這說明不正確的物理結構信息或物理錯誤。
LIL?: LILO的第二部分被讀到不正確的地址。原因同LI
LIL-: descriptor tables有錯。這可能是不正確的物理結構信息或重裝了 map file而沒有運行LILO重新安裝。
LILO: LILO執行正確。
1010101010: 分區情況已經改變卻沒有重新安裝LILO,另外,超頻也可能會出這種情況。
磁盤錯誤碼 :
0x00:"內部錯誤"。 由LILO扇區讀取子程序產生。可能是因為被破壞的文件,重建map文件試試看。另一個原因也許是,當使用"linear"參數時去訪問超出1024的柱面。
0x01:"非法命令"。這意味著LILO訪問了BIOS不支持的硬盤。
0x02:"沒找到地址標記"。通常是介質問題,多試幾遍看看。
0x03:"寫保護錯"。 僅在寫操作時出現。
0x04:"扇區未找到"。典型的原因是硬盤參數錯誤。
0x06:"激活順序改變"。這應該是短暫的錯誤,再試一次。
0x07:"無效的初始化"。BIOS沒有適當地初始化硬盤,熱啟動一次或許有幫助。
0x08:"DMA超出限度"。這不應當發生,重新啟動。
0x09:"DMA試圖越過64kB邊界"。這不應當發生,建議忽略"compact"參數。
0x0C:"無效的介質"。這不應當發生,重新啟動看看。
0x10:"CRC錯誤"。檢測到介質錯誤。建議多啟動幾次,運行map安裝程序,把map文件從壞塊寫到正常的介質上。
0x11:"ECC糾正成功"。讀錯誤發生然後被糾正,但是LILO並不知道這個情況,終止了啟動過程。
0x20:"控制器錯誤"。一般不應發生。
0x40:"定位失敗"。這可能是介質問題,重新啟動試試。
0x80:"磁盤超時"。磁盤或驅動器沒有准備好。介質壞了或磁盤沒有轉,也有可能是從軟盤啟動而沒有關上軟驅門。
0xBB:"BIOS錯誤"。一般不應發生,如果反復發生,可考慮去掉"compact"參數或添加刪除"linear"參數。
如果在寫操作過程中發生錯誤,則在錯誤碼前有個前綴"w"。盡管寫錯誤並不影響啟動過程,但它們暗示了系統中存在某種錯誤,建議重新配置LILO成只讀格式(read-only)。
3 幾個重要的LILO引導參數
LILO的引導參數有很多,在此對一些比較重要的參數作一介紹。
1. "boot="
此參數指明包含引導扇區的設備名(如:/dev/had),若此項忽略,則從當前的根分區中讀取引導扇區。
2. "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:由網絡取得根文件系統的標志
3. "nfsroot="
若需通過NFS提供根文件系統來引導無盤工作站,此參數為內核指定了網絡根文件系統所在的機程序、目錄及NFS,其格式為:nfsroot=[〈server_ip〉:]〈root_dir〉[,nfs_options〉]
4. "nfsaddrs="
設定網絡通訊所需的各種網絡界面地址,如無此參數,則內核會試圖用反向地址解析協定(RARP)或啟動協定(BOOTP)找出這些參數,其格式為:
nfsaddrs=〈客戶端IP〉:〈服務端IP〉:〈網關IP〉:〈子網屏蔽〉:〈客戶端名稱〉:〈網絡設備名 〉:〈auto〉
5. "image="
指定Linux的內核文件。
6. "delay="
設定引導第一個映像前的等待時間。
7. "disk="
此參數為某一特殊的硬盤定義非標准參數。
8. "append="
為內核傳遞一個可選的參數行,其典型的應用是為不能完全由系統自動識別的硬盤指定參數,如: append = "hd=64,32,202"
9. "label="
此參數為每個映像指定一個名字,以供引導時選擇。
10. "read-only"
設定以只讀方式掛入根文件系統,用於文件系統一致性檢查(fsck)。
11. "install="
安裝一個指定文件作為新的引導扇區,缺省為/boot/boot.b。
12. "loader="
說明所使用的鏈加載程序(chain loader),缺省為/boot/chain.b,如果不是從首硬盤或軟盤啟動,那麼,此選項必須說明。
13. "table="
說明包含分區表的設備名,如果此參數忽略,引導加載程序將不能傳遞分區信息到已引導的操作系統。當此參數指向的分區表被修改時,必須重新運行/sbin/lilo。
14. "init="
內核初始化時執行的程序,通常過程為init、getty、rc和sh,版本1.3.43以來的Linux內核能夠執行/sbin/init說明的命令行,若在引導過程中出現問題,則可設置init=/bin/sh直接跳到Shell。
15. "ramdisk_start="
由於內核不能放在壓縮的內存文件系統映像內,為使內核映像能夠和壓縮的內存映像放在一張軟盤內,加入"ramdisk_start=〈offset〉",這樣內核才能開始執行。
16. "mem="
此參數的目的之一是為Linux指定使用的內存數量:如mem=96MB,目的之二是指定mem=nopentium告訴內核不要使用4MB分頁表。
17. "vga="
設置顯示模式,如80×50、132×44等。
4 LILO的全局參數
全局參數是全程有效的,它可以出現在文件lilo.conf中的任何地方。以下是具體的參數項:
1.backup=backup-file
在裝入LILO之前將原先的引導區備份到backup-file,而不是RedHat 缺省的/boot/boot.NNNN。也可以備份到一個設備上,如: /dev/null。注意:如果原先已有一個同名文件,該參數將被忽略。我們可通過這個備份恢復原先的引導扇區:
dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1
恢復原先的MBR。(注:雖然boot.NNNN有512字節,但只能恢復前446字節到MBR。)
2.boot=boot-device
指定一個用於安裝LILO的設備。通常LILO可安裝在如下幾個地方:
MBR:第一個硬盤的主引導區, 對應於/dev/hda、/dev/sda等。
Root:Linux根分區的超級塊(Super block), 對應於/dev/hda1、/dev/hda2、/dev/hda5、/dev/sda1、/dev/sda5等。
Floppy:LILO安裝在軟盤上,對應於/dev/fd0。
不指定時,lilo缺省安裝在根分區超級塊上。
3.compact
該參數用於優化LILO,產生一個更小的"map"文件。如果在軟盤上安裝LILO,強烈推薦使用此參數。
4.default=name
指定缺省引導的操作系統。如default=dos 表示將label為DOS的系統作為缺省引導的操作系統。如不指定該參數,排在lilo.conf中的第一個操作系統將作為缺省操作系統。
5.delay=tsecs
在沒有指定"prompt" 參數時,LILO將立即引導缺省的操作系統,"delay"參數在這之間插入一段延時,單位是1/10秒。
6.disk=device-name
為某些非標准硬盤定義參數。其內部還包括有幾個可選的子參數。
bios=〈bios_device_code〉: 設備號。十六進制數0x80表示第一硬盤;0x81表示第二硬盤,依此類推。
sectors=〈sectors〉:硬盤扇區數。
heads=〈heads〉:硬盤磁頭數。
cylinders=〈cylinders〉:硬盤柱面數。受系統BIOS限制,柱面數必須在1024以內。
partition=〈partition_device〉:用於物理定位特殊硬盤上的分區,有一個子參數start。
start=〈partition_offset〉:每一分區的起始扇區。
例如:
disk = /dev/sda
bios=0x80
#指定SCSI硬盤為第一硬盤
sectors = 32
heads = 64
cylinders=632
#硬盤參數為632/64/32
partition=/dev/sda1
start=2048
#第一分區起始扇區為2048
partition = /dev/sda2
start=204800
#第二分區起始扇區為204800
partition = /dev/sda3
start = 500000
partition = /dev/sda4
start = 900000
當機器上有兩塊硬盤,一塊為SCSI硬盤,另一塊為IDE硬盤時,LILO很有可能無法自動識別它們的主、從順序,這時可進行如下設置:
disk = /dev/sda
bios = 0x80
disk = /dev/hda
bios = 0x81
#SCSI硬盤為主硬盤,IDE硬盤為從硬盤
該參數是為Linux無法識別的硬盤准備的,一般Linux可以正確識別和使用大多數硬盤,除非最壞的情況,否則不用設置它。
7.force-backup=backup-file
類似"backup"參數,但是將覆蓋原有的同名文件。
8.ignore-table
通知lilo忽略無效的硬盤分區表。
9.install=boot-sector
LILO實際上包含有幾個部分,而這幾部分都存放在/boot/boot.b文件中。如果忽略"install"參數,則lilo認為install=/boot/boot.b。
10.linear
產生用於替換硬盤sector/head/cylinder地址(硬盤幾何參數)的linear扇區地址。linear地址在運行時產生並且不依賴於硬盤幾何參數。某些SCSI硬盤和一些以LBA方式使用的IDE硬盤可能會需要使用這個參數。注意,在將LILO安裝到軟盤上時不能使用"linear"參數。
11.lock
出現LILO提示後立即按最近一次的引導映像啟動計算機。也就是說,當我們在lilo.conf中加入了該參數,然後運行lilo安裝LILO,再重新啟動計算機,這時LILO會提示我們選擇引導哪一種操作系統,這一選擇將被LILO記錄下來,即"鎖定",下次啟動計算機時,LILO將忽略"delay"、"prompt"等參數及鍵盤輸入而直接跳轉到其"鎖定"的操作系統。
12.map=map-file
指定map文件。 沒有本項時缺省使用/boot/map,每次執行lilo命令都會產生一個新的map文件。
13.message=message-file
該命令用於指定一個包含注釋信息的文件,該文件將在系統打印出字符串"LILO"之前顯示。如果在LILO啟動時想獲取較多的信息,可以編輯一個文件,再使用該命令就可以了。文件中如果包含有ASCII碼為0xFF的字符(Ctrl+L)則表示清屏。注意,文件的大小不能超過65535個字節。每次文件改變之後,都必須重新運行lilo命令重建map文件,以保證其正常顯示。
14.optional
當用於啟動的引導映像不存在時,該參數使lilo忽略它。這對用於測試一個不長期存在的Linux核心是有用的。
15.password=password
為LILO設置口令保護,每次重新啟動計算機提示用戶輸入口令。設置了口令後,建議將lilo.conf的文件屬性改為600,以免讓非root用戶看到口令。
16.prompt
給出"boot:"提示,強制LILO等待用戶的鍵盤輸入,按下回車鍵則立即引導默認的操作系統,而按下Tab鍵則打印可供選擇的操作系統。當"prompt"被設置而"timeout"沒有被設置時,系統會一直處於等待狀態而不引導任何操作系統。不設置該參數時,LILO不給出"boot:"提示而直接引導默認操作系統,除非用戶按下了Shift、Ctrl、Alt三鍵中的任何一個。大多數情況下,如果你的硬盤上有多個操作系統,建議使用參數,它留給用戶一個選擇的余地。
17.restricted
與"password"聯用,使"password"僅作用於在LILO提示後有命令行輸入的時候。
18.serial=parameters
使用串行口控制。這將初始化指定的串口,並將使引導管理器能接受來自串口的輸入。從串口發送一個中斷信號相當於從控制台鍵盤上按下Shift鍵,它同樣會被LILO捕捉到。如果不能保證來自串口的訪問和控制台一樣安全,比方說有一個modem連在串口上,建議為每個引導映像加上口令保護(password)。參數串有如下語法:
〈port〉[,〈bps〉[〈parity〉[〈bits〉]]]
〈port〉:數字表示的串口號,0表示COM1,其余類推。所有四個串口都可被使用。
〈bps〉:串口速率,支持110、 150、300、600、1200、2400、4800和 9600 bps,缺省值為2400bps。
〈parity〉:設置串口校驗。一般情況下,LILO忽略奇偶校驗。n表示無校驗,e 表示偶校驗,o 表示奇校驗。
〈bits〉:字符位數,只能取7或8,缺省值是8。當有奇偶校驗時只能取7。
如果設置了"serial",即使沒有設置"delay",系統也會將"delay"項的值自動增加20。
19.timeout=tsecs
設置等待鍵盤輸入的時長,單位是0.1秒。超過這段時間沒有輸入則為超時,系統將自動引導缺省的操作系統。如果不設置本參數,缺省的超時時間長度為無窮大。
5 引導映像參數
引導映像參數作用於每一個引導映像區。如果某一引導映像參數(例如:password)與全局參數的定義相抵觸,則以該引導映像參數的定義為准,但僅限於該引導映像區。以下是具體參數項:
image=pathname
設置包含Linux核心引導映像的文件或設備。
other=pathname
設置包含非Linux操作系統,如DOS、SCO UNIX、Windows 95等系統引導映像的文件或設備。
range=start-end
如果"image"參數被設置為一個設備,則Linux核心引導映像的存放范圍必須被設置。
image = /dev/fd0
range = 1-512
# Linux核心引導映像存放在軟盤上的第一至512扇區
label=name
通過此參數來標識當前操作系統,即操作系統名。用戶可通過在LILO提示後輸入"標識"來決定引導哪一個操作系統。
alias=name
給當前操作系統起一別名。
lock
類似同名全局參數。
optional
類似同名全局參數。
password=password
類似同名全局參數。
restricted
類似同名全局參數。
以下兩個參數項用於非Linux操作系統:
loader=chain-loader
如果要引導第二塊硬盤上的非Linux操作系統或將LILO安裝到軟盤,這個參數是必需的。不指定時,缺省值是/boot/chain.b。如啟動第二塊硬盤上的MS-DOS或Windows 95,可定義loader=/boot/any_d.b;對於OS/2,則為loader=/boot/os2_d.b。
作為一個特殊的功能模塊,any_d.b已不合時宜,在0.20版以後的lilo程序包中已不再包含它並將其功能整合進chain.b,os2_d.b亦有所變動。它們的功能可用如下語句代替。
例:
other = /dev/hdb1
loader = /boot/any_d.b
替換為:
other = /dev/hdb1
map-drive = 0x80
to = 0x81
map-drive = 0x81
to = 0x80
對於os2_d.b:
other = /dev/hdb1
loader = /boot/os2_d.b
替換為:
other = /dev/hdb1
loader = /boot/os2_d.b
map-drive = 0x80
to = 0x81
map-drive = 0x81
to = 0x80
map-drive=〈bios_device_code〉
通知chain.b裝入重映射軟驅或硬驅的內存駐留驅動程序,使用它可以引導不同硬盤上的不同操作系統,條件只有一個, BIOS必須能訪問硬盤。"map-drive"後跟有變量"TO=〈盤設備號〉"。實際上,"map-drive"起到了"軟"交換兩個軟驅或硬驅主、從順序的作用,避免了手工接線的麻煩。
例:交換軟驅
map-drive = 0
to = 1
map-drive = 1
to = 0
交換硬驅(參看loader參數例)
table=device
指定包含非Linux系統分區的主設備。舉例來說,如果Windows 95在第一個IDE硬盤的第一個基本分區上,即/dev/hda1上,那麼必須定義table=/dev/hda 。
6 核心參數
如果LILO引導的是Linux系統,我們可用下面命令傳遞一些參數給Linux核心。除"literal"之外,它們也可用於全局參數區。
append=string
append傳遞一個特殊硬件的參數串string給Linux系統的核心。它常用來配置一些Linux不能正確測試到的硬件設備。例如:
append = "hd=64,32,202"
通知Linux核心,硬盤參數為64柱面、32磁頭、202扇區。具體的參數串設置可參看/usr/doc/HOWTO/BootPrompt-HOWTO文件。
literal=string
類似於"append",但它將撤消所有的其它核心參數(比如設置了root設備)。因為"literal"會不分青紅皂白地撤消一些必需的、重要的參數,所以不能將它設置在全局參數區。
ramdisk=size
指定RAM盤的大小。size為零時不建立RAM盤。忽略此參數時,RAM盤大小由Linux核心引導映像決定。
read-only
通知LILO以只讀方式載入根文件系統。通常我們在檢查根文件系統時需要將根文件系統以只讀方式載入。Linux系統在每次啟動時也會將根文件系統以只讀方式載入,待例行的文件系統檢查後再將其重新載入為讀寫方式。
read-write
通知LILO以讀寫方式載入根文件系統。
root=root-device
指定被安裝根文件系統硬盤分區設備。
vga=mode
指定引導Linux系統時的VGA模式。有以下取值:
normal:常規80×25文本模式
extended (or ext): 80×50文本模式
ask: 引導時詢問用戶使用哪一種VGA模式,這時敲回車鍵將顯示一個可分配的VGA模式表。
如果不指定VGA模式,系統將缺省地使用包含在系統核心裡的VGA模式值。
7 lilo.conf配置實例
有了這些基礎知識,我們可以很容易地按照自己的意圖配置LILO。請看一個lilo.conf文件的例子:
boot=/dev/hda #將LILO安裝在MBR。LILO作為主引導管理器
message=/boot/message #注釋為/boot/message
compact #產生一個更小的"map"文件
map=/boot/map #指定"map"文件為/boot/map
install=/boot/boot.b
password=zhoudi #設置口令
vga=normal #80x25文本模式
linear #使用"linear"地址
prompt #提示用戶鍵盤輸入
timeout=50 #超時時長為5秒
default=dos #缺省引導label為dos的操作系統
#設定Linux
image=/boot/vmlinuz-2.0.34-1
#設置Linux核心引導映像
label=linux #標識為linux
root=/dev/hda1 #設置根文件系統
read-only #LILO以只讀方式載入根文件系統
#設定MS-DOS或Windows 95
other=/dev/hda2 #DOS分區為第一個IDE硬盤的第二分區
label=dos #標識為dos
table=/dev/hda #主設備為第一個IDE硬盤
#設定SCO UNIX
注意:SCO分區必須設為活動(active)分區並將LILO安裝在MBR上。
other=/dev/hda3
label=sco
table=/dev/hda
這個例子中,LILO是作為主引導管理器來管理機器上所有操作系統的。LILO也可作為二級引導管理器,這只要將"boot"參數改為根分區就可做到。例如:
boot=/dev/hda1
以這種方式使用LILO時,Linux根分區必須用DOS或Linux的fdisk程序將其設置為活動分區,並且這種方式只對硬盤主分區(不是擴展或邏輯分區)有效。
LILO還可以啟動第二個以上的操作系統。在我的機器上有兩塊希捷硬盤,一塊硬盤為8.4GB,另一塊為1.2GB,都以LBA模式接在主IDE口上。8.4GB跳線為主盤,1.2GB跳線為從盤,Linux核心很容易地就將它們辨認出來並能正常使用,1.2GB的硬盤上安裝了MS-DOS 6.22。筆者是這樣設置lilo.conf的:
disk=/dev/hda
bios=0x80
#由於IDE硬盤存在雙硬盤問題,所以當啟動DOS系統時,會提示"無系統盤或系統盤錯!",需修改程序如下。
disk=/dev/hdb
bios=0x81
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
linear
prompt
timeout=50
default=dos
image=/boot/vmlinuz-2.2.11-1
label=linux
root=/dev/hda1
read-only
other=/dev/hdb1
label=dos
map-drive = 0x80
to = 0x81
map-drive = 0x81
to = 0x80
#交換兩硬盤主、從順序
table=/dev/hdb
配置好lilo.conf文件後,在root賬戶下執行lilo命令,新的LILO就被載入系統。上面第一個例子執行結果如下:
#lilo
Added linux
Added dos*
Added sco
(注:帶*號的表示其為缺省操作系統)
8 Linux啟動問題解決方法
8.1 Lilo失效有五種參考方法:
1、如果有啟動軟盤,用它啟動後,運行lilo,重啟。
2、紅旗下通過:用安裝光盤引導系統。在安裝向導開始後,我們即可溜到另一個控制台下(按Ctrl+Alt+F2),將看到bash#字樣。如果你Linux的/分區是對應/dev/hda3,所用的文件系統是ext2的。
注意:#開始的行是注釋行
mount -t ext2 /dev/hda3 /tmp
#(使用的reiser文件系統的用戶用reiserfs代替ext2)
chroot /tmp
/sbin/lilo
如果同時忘記了root口令,可在此用passwd修改
取出光盤,用硬盤啟動。
3、紅旗下通過:用Windows的啟動軟盤啟動進入DOS,假定光驅為g:,Linux安裝在/dev/hda3,將Linux安裝光盤放入光驅,在DOS提示符下運行以下三條命令:
g:
cddosutilsautoboot
..loadlin vmlinuz root=/dev/hda3 1 或者
..loadlin vmlinuz root=/dev/hda3 single 或者
..loadlin vmlinuz root=/dev/hda3 init=/bin/sh rw