1、一般的開機引導過程。 在PC機上,最初的啟動由BIOS完成。當開機自我測試 (POST)結束時(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/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,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引導的配置從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重新安裝。 ——摘自:北京LINUX iamafan |