LINUX LILO若干問題探討 (轉)
LINUX LILO若干問題探討 (轉)[@more@] LILO若干問題探討
Linux的引導可以採用多種方式,其載入器LILO(Linux Loader)是一個靈活的引導載入,與其他常用的引導載入程式相比,LILO引導方式顯得更具有藝術性,對其深入的理解,將有助於我們方便地處理多重、引導、大及大等諸多棘手的問題。
一、LILO的引導機制
眾所周知,的最初啟動是由控制的,在對一些(如:記憶體、鍵盤等)初始化之後,它會試圖載入硬碟的主開機記錄(MBR)或的引導扇區。
MBR可透過兩種方式執行,其一是定位到活動分割槽並載入相應的引導扇區,然後由引導扇區完成該分割槽內的基本的載入;其二是直接從一指定分割槽中載入資訊,並透過它裝入任一分割槽的作業系統,諸如LILO、OS/2 boot loader及Partition Magic等引導載入程式都可以成這種方式。
軟盤的引導扇區相當於硬碟活動分割槽的引導扇區,它通常用於裝入軟盤上的作業系統。
由此可見,只要把LILO在MBR、活動分割槽或者引導軟盤上,就能接管計算機的控制權,然後由LILO完成後繼的引導過程。LILO中建有一個引導表地址編碼,藉此它的載入程式就能定位到Linux的核心,這種地址編碼既可以按照柱面/磁頭/扇區(CHS),又可以採用LBA的線性塊號模式,因此,即使對某些控制程式LILO也能運轉良好。當LILO定位到配置檔案後,經過預引導過程,就顯示提示符:
LILO boot:
此時,系統允許選擇引導不同的作業系統或者不同的核心配置,按Tab鍵顯示可選項列表,然後輸入可選項或者直接回車選擇預設配置,如果選擇了引導Linux,還可以直接傳遞引數到系統核心。和其他系統的引導載入程式相比,LILO具有更大的靈活性,其引導方式也更豐富多彩。
●當LILO被安裝在硬碟的MBR、活動分割槽或引導軟盤上時,作為原載入程式的替身,它能引導任一硬碟任一分割槽上的Linux和其他作業系統;
●除了引導扇區,它沒有任何隱含檔案,也不需要使用特定的分割槽,它的配置檔案可以在任何分割槽、甚至是存放在與Linux毫不相干的DOS分割槽的某個子目錄下;
●它能引導幾個不同的核心配置,甚至是幾個不同的核心;
●它能引導同一機程式上的多個Linux版本;
●它能從網路上引導Linux。
LILO的靈活性使得其配置變得相當複雜,當有多個系統共存時,建議先安裝其他作業系統,最後再裝Linux,這樣,設定LILO對其他系統的引導會相對簡單一些。
二、幾個重要的LILO引導引數
LILO的引導引數有很多,在此只對一些比較重要的引數作一介紹 。
1."boot="此引數指明包含引導扇區的裝置名(如:/dev/had),若此項忽略,則從當前的根分割槽中讀取引導扇區。
2."="此引數告訴核心啟動時以哪個裝置作為根檔案系統使用,其設定值為構造核心時根檔案系統的裝置名,可用的裝置名有:
(1)/dev/hdaN~/dev/hddN:ST-506相容硬碟,a到d上的N個分割槽
(2)/dev/sdaN~/dev/sdeN:SCSI相容硬碟,a到e上的N個分割槽
(3)/dev/xdaN~/dev/xN: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="設定網路通訊所需的各種網路介面地址,如無此引數,則核心會試圖用反向地址解析協定(R)或啟動協定(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直接跳到。
15."risk_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/,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/had #指定包含分割槽表的硬碟
label=d#用dos為代表名稱
2.當系統無法自動完成配置時
系統無法自動完成配置的情況不外乎兩種:
(1)BIOS不能直接看到Linux的根分割槽;
(2)BIOS只能讀寫標準硬碟的前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(504 MB)可以定址得到。
對策:在硬碟的前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的解除安裝
如果出於某些原因想要從硬碟上刪除Linux,可以從新格式化硬碟。然而LILO仍將保留在那裡,並且每次啟動硬碟時都將試圖引導Linux(甚至所有的檔案被刪除了也是這樣)。這種情況只發生在把LILO寫到了MBR的情況。有兩種刪除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
在DOS下執行fdisk,並用下列命令清除MBR
c:fdisk/MBR
該命令將完全重新整理MBR,去掉LILO。另外可以用Linux的fdisk對Linux分割槽進行破壞。
關於LILO值得探討的問題還有很多,但只要懂得了其內部機制,對更復雜的實際情況也能較圓滿地解決
閱讀:349次
來源:china-pub
Linux的引導可以採用多種方式,其載入器LILO(Linux Loader)是一個靈活的引導載入,與其他常用的引導載入程式相比,LILO引導方式顯得更具有藝術性,對其深入的理解,將有助於我們方便地處理多重、引導、大及大等諸多棘手的問題。
一、LILO的引導機制
眾所周知,的最初啟動是由控制的,在對一些(如:記憶體、鍵盤等)初始化之後,它會試圖載入硬碟的主開機記錄(MBR)或的引導扇區。
MBR可透過兩種方式執行,其一是定位到活動分割槽並載入相應的引導扇區,然後由引導扇區完成該分割槽內的基本的載入;其二是直接從一指定分割槽中載入資訊,並透過它裝入任一分割槽的作業系統,諸如LILO、OS/2 boot loader及Partition Magic等引導載入程式都可以成這種方式。
軟盤的引導扇區相當於硬碟活動分割槽的引導扇區,它通常用於裝入軟盤上的作業系統。
由此可見,只要把LILO在MBR、活動分割槽或者引導軟盤上,就能接管計算機的控制權,然後由LILO完成後繼的引導過程。LILO中建有一個引導表地址編碼,藉此它的載入程式就能定位到Linux的核心,這種地址編碼既可以按照柱面/磁頭/扇區(CHS),又可以採用LBA的線性塊號模式,因此,即使對某些控制程式LILO也能運轉良好。當LILO定位到配置檔案後,經過預引導過程,就顯示提示符:
LILO boot:
此時,系統允許選擇引導不同的作業系統或者不同的核心配置,按Tab鍵顯示可選項列表,然後輸入可選項或者直接回車選擇預設配置,如果選擇了引導Linux,還可以直接傳遞引數到系統核心。和其他系統的引導載入程式相比,LILO具有更大的靈活性,其引導方式也更豐富多彩。
●當LILO被安裝在硬碟的MBR、活動分割槽或引導軟盤上時,作為原載入程式的替身,它能引導任一硬碟任一分割槽上的Linux和其他作業系統;
●除了引導扇區,它沒有任何隱含檔案,也不需要使用特定的分割槽,它的配置檔案可以在任何分割槽、甚至是存放在與Linux毫不相干的DOS分割槽的某個子目錄下;
●它能引導幾個不同的核心配置,甚至是幾個不同的核心;
●它能引導同一機程式上的多個Linux版本;
●它能從網路上引導Linux。
LILO的靈活性使得其配置變得相當複雜,當有多個系統共存時,建議先安裝其他作業系統,最後再裝Linux,這樣,設定LILO對其他系統的引導會相對簡單一些。
二、幾個重要的LILO引導引數
LILO的引導引數有很多,在此只對一些比較重要的引數作一介紹 。
1."boot="此引數指明包含引導扇區的裝置名(如:/dev/had),若此項忽略,則從當前的根分割槽中讀取引導扇區。
2."="此引數告訴核心啟動時以哪個裝置作為根檔案系統使用,其設定值為構造核心時根檔案系統的裝置名,可用的裝置名有:
(1)/dev/hdaN~/dev/hddN:ST-506相容硬碟,a到d上的N個分割槽
(2)/dev/sdaN~/dev/sdeN:SCSI相容硬碟,a到e上的N個分割槽
(3)/dev/xdaN~/dev/xN: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="設定網路通訊所需的各種網路介面地址,如無此引數,則核心會試圖用反向地址解析協定(R)或啟動協定(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直接跳到。
15."risk_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/,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/had #指定包含分割槽表的硬碟
label=d#用dos為代表名稱
2.當系統無法自動完成配置時
系統無法自動完成配置的情況不外乎兩種:
(1)BIOS不能直接看到Linux的根分割槽;
(2)BIOS只能讀寫標準硬碟的前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(504 MB)可以定址得到。
對策:在硬碟的前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的解除安裝
如果出於某些原因想要從硬碟上刪除Linux,可以從新格式化硬碟。然而LILO仍將保留在那裡,並且每次啟動硬碟時都將試圖引導Linux(甚至所有的檔案被刪除了也是這樣)。這種情況只發生在把LILO寫到了MBR的情況。有兩種刪除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
在DOS下執行fdisk,並用下列命令清除MBR
c:fdisk/MBR
該命令將完全重新整理MBR,去掉LILO。另外可以用Linux的fdisk對Linux分割槽進行破壞。
關於LILO值得探討的問題還有很多,但只要懂得了其內部機制,對更復雜的實際情況也能較圓滿地解決
閱讀:349次
來源:china-pub
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989154/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 探討系統中?錢的精度問題
- 工業機器人振動控制問題探討機器人
- Android APP安全問題應對辦法的探討AndroidAPP
- 簡單探討sum()函式返回null的問題函式Null
- Elasticsearch 線上實戰問題及解決方案探討Elasticsearch
- 土製Excel匯入匯出及相關問題探討Excel
- 關於Redis的問題探討(二):Range方法返回的物件是LinkeHashMap以及轉換辦法Redis物件HashMap
- 未來網路若干問題思考
- C# Task若干問題淺析C#
- Promise探討Promise
- 多次執行mysql_fetch_array()的指標歸位問題探討MySql指標
- 深入探討 UndefinedUndefined
- 深入探討HBASE
- OPCUA 探討(一)
- 簡單探討C#中GUI程式設計的標準事件問題C#GUI程式設計事件
- 演算法隨筆——樹上問題若干演算法
- Linux挖礦木馬的技術演進探討Linux
- 中國 GPL 訴訟第一案:關於 GPL 問題的探討
- Spring 下,關於動態資料來源的事務問題的探討Spring
- Springboot 加密方案探討Spring Boot加密
- px em rem 探討REM
- 關於 js 物件 轉 字串 和 深拷貝 的 探討JS物件字串
- 車路協同若干痛點問題的思考
- Chaos 測試下的若干 NebulaGraph Raft 問題分析Raft
- Swift 踩坑筆記 —— UITableView Cell初始化和重新整理的問題探討Swift筆記UIView
- 探討NET Core資料進行3DES加密或解密弱金鑰問題3D加密解密
- Netty URL路由方案探討Netty路由
- 深入探討單例模式單例模式
- JavaScript原型鏈汙染探討JavaScript原型
- Oracle Freelist和HWM原理探討及相關效能優化(轉)Oracle優化
- iOS-靜態庫聯調中的若干問題iOS
- 話題探討:GitHub不用分散式,能說明什麼?Github分散式
- 探討丨傳統行業必須數字化轉型嗎?行業
- 不知道有沒有大佬加群一起來探討 go 相關的問題Go
- python建立elasticsearch索引的探討PythonElasticsearch索引
- SQL優化器探討(zt)SQL優化
- 探討.NET Core的未來
- 深入探討ROP 載荷分析
- oracle 雙機部署模式探討Oracle模式