深入理解LILO(轉)

post0發表於2007-08-11
深入理解LILO(轉)[@more@]

Linux的引導可以採用多種方式,其載入器LILO(Linux Loader)是一個靈活的引導載入程式,與其他常用的引導載入程式相比,LILO引導方式顯得更具有藝術性,對其深入的理解,將有助於我們方便地處理多重系統、網路引導、大硬碟及大記憶體等諸多棘手的問題。

  一、LILO的引導機制

  眾所周知,計算機的最初啟動是由BIOS控制的,在對一些硬體(如:記憶體、鍵盤等)初始化之後,它會試圖載入硬碟的主開機記錄(MBR)或軟盤的引導扇區。

  MBR可透過兩種方式執行,其一是定位到活動分割槽並載入相應的引導扇區,然後由引導扇區完成該分割槽內作業系統的基本元件的載入;其二是直接從一指定分割槽中載入資訊,並透過它裝入任一分割槽的作業系統,諸如LILO、OS/2 boot loader及Partition Magic等引導載入程式都可以配置成這種方式。

  軟盤的引導扇區相當於硬碟活動分割槽的引導扇區,它通常用於裝入軟盤上的作業系統。

  由此可見,只要把LILO安裝在MBR、活動分割槽或者引導軟盤上,就能接管計算機的控制權,然後由LILO完成後繼的引導過程。LILO中建有一個引導表地址編碼,藉此它的載入程式就能定位到Linux的核心檔案,這種地址編碼既可以按照柱面/磁頭/扇區(CHS)模式,又可以採用LBA的線性塊號模式,因此,即使對某些SCSI控制程式LILO也能運轉良好。

  當LILO定位到配置檔案後,經過預引導過程,就顯示提示符:

  LILO boot:

  此時,系統允許選擇引導不同的作業系統或者不同的核心配置,按Tab鍵顯示可選項列表,然後輸入可選項或者直接回車選擇預設配置,如果選擇了引導Linux,還可以直接傳遞引數到系統核心。

  和其他系統的引導載入程式相比,LILO具有更大的靈活性,其引導方式也更豐富多彩。

  ●當LILO被安裝在硬碟的MBR、活動分割槽或引導軟盤上時,作為原載入程式的替身,它能引導任一硬碟任一分割槽上的Linux和其他作業系統;

  ●除了引導扇區,它沒有任何隱含檔案,也不需要使用特定的分割槽,它的配置檔案可以在任何分割槽、甚至是存放在與Linux毫不相干的DOS分割槽的某個子目錄下;

  ●它能引導幾個不同的核心配置,甚至是幾個不同的核心;

  ●它能引導同一機程式上的多個Linux版本;

  ●它能從網路上引導Linux。

  LILO的靈活性使得其配置變得相當複雜,當有多個系統共存時,建議先安裝其他作業系統,最後再裝Linux,這樣,設定LILO對其他系統的引導會相對簡單一些。

  

  二、幾個重要的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〉(,nfserials_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等。

  

  三、LILO典型配置方法

  通常情況下,Linux的安裝程式自身就可以完成LILO的安裝配置,從而較好地解決多重系統的引導問題,如果系統不能自動完成這種配置,則可以透過手工修改配置檔案/etc/lilo.conf來實現不同條件下的引導。

  1.當系統能自動完成配置時

  對於這種情況只有一個建議:將LILO安裝到Linux分割槽的根上,而不是MBR這個多事地帶。假設當前hda1中裝有DOS/Windows,hda2中安裝了Linux,則/etc/lilo.conf的內容大致如下:

  boot=/dev/hda2#指定引導位置compact delay=50#延時5秒root=current

#根在當前分割槽image=/boot/vmlinuz#指定linux的核心檔案  label=linux

#用linux為代表名稱 other=/dev/hda1#其他作業系統所在的分割槽table=/dev/hda

#指定包含分割槽表的硬碟label=dos#用dos為代表名稱

  2.當系統無法自動完成配置時

  系統無法自動完成配置的情況不外乎兩種:

  (1)BIOS不能直接看到Linux的根分割槽;

  (2)BIOS只能讀寫標準IDE硬碟的前504MB。

  這時,必須遵循一個最基本的原則:建立一個BIOS能存取的較小的Linux分割槽,其中包含核心檔案、對映檔案及鏈載入程式等必要內容,而根則可以是另外一個獨立的分割槽。至於配置上的其他細節,我們透過以下例項來進行說明。

  例1:主硬碟為IDE介面,第二硬碟為SCSI介面,根檔案在SCSI上。

  對策:在IDE硬碟上劃分一個較小的Linux分割槽(/dev/hda2),其中包含基本檔案,掛接到/u2下,其配置檔案/etc/lilo.conf的主要內容為:

  boot=/dev/hda#lilo裝在主ide的mbr install=/u2/etc/lilo/boot.b

#從boot.b安裝lilo引導記錄map=/u2/etc/lilo/map#安裝程式建立此對映檔案,告訴引導載入程式核心塊的位置compact timeout=50 image=/u2/vmlinuz

#核心檔案應事先複製到/u2下label=linux root=/dev/sda1#告訴核心根系統在scsi硬碟上read-only other=/dev/hda1 loader=/u2/etc/lilo/chain.b

#指明載入程式label=dos

  例2:一個標準的IDE大硬碟需安裝Linux和DOS/Windows。

  對於大硬碟問題,很多人只知道低於1024個柱面的限制,而不知為什麼標準的IDE硬碟只能認前504MB。

  其實,BIOS的int13呼叫是採用三個位元組的CHS編碼,10位為柱面號,8位為磁頭號,6位為扇區號。可能的柱面號碼是0~1023,可能的磁頭號碼是0~255,而磁軌上可能的扇區號碼是1~63,以這24位最多可以定址8455716864個位元組(7.875GB)。

  但不幸的是,標準的IDE介面容許256個扇區/磁軌、65536個柱面及16個磁頭。它自己本身可以存取237= 137438953472(128 GB),但是加上BIOS方面63個扇區與1024個柱面的限制後只剩528482304(504MB)可以定址得到。

  對策:在硬碟的前500MB中劃分350MB(/dev/hda1)給DOS,150MB(/dev/hda2)給Linux,在相應的配置檔案中應說明硬碟的引數。

  boot=/dev/hda

  ... ...

  disk=/dev/hda

  bios=0x80

  sectors=63

  heads=16

  cylinders=2100

  image=/vmlunuz

  append="hd=2100,16,23"

  root=/dev/hda2

  label=linux

  四、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分割槽。

  關於LILO值得探討的問題還有很多,但只要懂得了其內部機制,對更復雜的實際情況也能較圓滿地解決

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

相關文章