class="22000">
作者: Andries Brouwer,
[email protected] 譯者: Asd L. Chen,
[email protected] v1.0, 26 June 1996 翻譯日期: 10-13 November 1997
--------------------------------------------------------------------------------
所有有關 disk geometry 及 1024 cylinder 的限制.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
1. 問題所在
假如你的磁碟超過 1024 個磁簇(cylinders). 還有, 假如你的作業系統使用基本輸出入系統(BIOS).那麽你會遇到一個問題, 因為一般磁碟輸出入/輸入所使用的 INT13 BIOS 介面以一個 10 位元(bit) 的欄位來操作磁簇, 所以無法存取第 1024 及之後的磁簇.
幸運的是, Linux 不使用 BIOS, 所以沒有問題.
話是這麽說, 但有兩件事例外:
(1) 當你在啟動系統時, Linux 還沒開始執行所以無法讓你避免這個問題.這對 LILO 以及類似的啟動載入程式(boot loaders)有些影響.
(2) 使用磁碟的所有作業系統必須同意分割區的位置.換句話說, 如果你在一顆磁碟上使用 Linux 以及, 例如 DOS, 那麽兩者必須以相同的方式解讀分割表的資料.這對 Linux 核心以及 fdisk 有些影響.
底下是對所有相關細節更詳細的描述.注意, 我使用 2.0.8 版核心原始程式做為參考.其它的版本可能有一點點出入.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
2. 啟動
當系統啟動時, BIOS 從第一個磁碟(或從軟碟)讀取磁區 0 (一般通稱的 MBR - Master Boot Record, 主啟動磁區)並跳至在該處的程式碼 - 通常是一些啟動載入程式(bootstrap loader).這些小小的啟動程式一般不會有自己的磁碟驅動程式而會使用 BIOS 所提供的服務.這意謂著只有整個 Linux 核心都位於開頭的 1024 個磁簇內時才能夠被啟動.
這個問題很容易解決: 確定核心(也許還包括其它啟動時用到的檔案, 像是 LILO map 檔) 是放在一個 BIOS 可以存取的到, 全都在開頭的 1024 個磁簇內的分割區裡 - 這可以(可能)是第一個或第二個磁碟.
另一點是啟動載入程式與 BIOS 必須同意彼此對磁碟邏輯(geometry)上的看法.給 LILO `linear' 這個選項參數可能會有些幫助.細節後述.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
3. 磁碟 geometry 以及分割區
如果你的磁碟上有好幾種作業系統, 每一種使用一個或多個分割區.那麽對於分割區位於何處不同的看法可能導致災難性的後果.
MBR 中包含一個分割表描述分割區(主分割區: primary) 在那裡.有四個表格給四個主要分割區使用, 它們看起來像
struct partition {
char active; /* 0x80: bootable, 0: not bootable */
char begin[3]; /* CHS for first sector */
char type;
char end[3]; /* CHS for last sector */
int start; /* 32 bit sector number (counting from 0) */
int length; /* 32 bit number of sectors */
};
(其中 CHS 是磁簇/磁頭/磁區: Cylinder/Head/Sector 的縮寫)
因此, 有項資訊是重覆的: 分割區的位置可以由 24 位元的 begin 以及 end 欄位, 和 32 位元的 start 以及 length 欄位給定.
Linux 只使用 start 以及 length 欄位, 故最多可以處理包含 2^32 個磁區的分割區, 也就是, 最大 2 TB 的分割區.這是現今磁碟機的兩百倍, 所以也許足夠往後十年的需求.
不幸的是, BIOS INT13 呼叫使用三個位元組的 CHS 編碼, 10 個位元作為磁簇號碼, 8 個位元作為磁頭號碼, 及 6 個位元作為磁軌上的磁區號碼.可能的磁簇號碼是 0-1023, 可能的磁頭號碼是 0-255, 而磁軌上可能的磁區號碼為 1-63(是的, 磁軌上的磁區是由 1 起算, 不是 0).以這 24 位元最多可以定址 8455716864 個位元組(7.875 GB), 這是 1983 年磁碟機的兩百倍.
更不幸的是, 標准的 IDE 介面容許 256 個磁區/磁軌, 65536 個磁簇以及 16 個磁頭.它自己本身可以存取 2^37 = 137438953472 個位元組(128 GB), 但是加上 BIOS 方面 63 個磁區與 1024 個磁簇的限制後只剩 528482304 個位元組(504 MB)可以定址的到.
這不足以應付現今的磁碟, 人們使用各種硬體或軟體上的方法來克服.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
4. 轉換與磁碟管理程式
沒有人對磁碟的'真實' geometry 有興趣.磁軌的磁區數通常是變動的 - 接近磁碟外圍的磁軌有比較多的磁區 - 所以沒有'真實'的每磁軌磁區數.對於使用者而言最好是把磁碟當作編號 0,1,..., 的磁區組合成的線性陣列, 讓控制器去找出磁區究竟位於磁碟的那裡.
此線性編號一般通稱為 LBA.對於 geometry 為 (C,H,S) 的磁碟而言屬(c,h,s) 的線性位址為 c*H*S+h*S+(s-1).所有 SCSI 控制器都使用 LBA, 某些 IDE 控制器也是.
如果 BIOS 把這 24 個位元(c,h,s) 轉換成 LBA 並□給懂得 LBA 的控制器, 那麽又可以定址到 7.875 GB .並不足以應付所有的磁碟, 但仍然是個改進.注意此處 BIOS 使用的 CHS, 它不再與'實體'有任何關系.
當控制器不懂何為 LBA 但是 BIOS 知道如何轉換時有些類似的方法可行.(在 BIOS 設定中通常稱為 'Large'.)現在 BIOS 將呈現 geometry 為(C',H',S')給作業系統, 而在與磁碟控制器溝通時則使用(C,H,S).通常 S=S', C'=C/N 而 H'=H*N, 其中 N 是確保 C'<=1024 之 2 的最小次方(所以 C'=C/N 時捨去的數浪費少許容量).再一次, 這允許存取最多達 7.875 GB.
如果 BIOS 不知道 'Large' 或是 'LBA', 那麽還是有軟體的解決方案.像是 OnTracker 或 EZ-Drive 這些個磁碟管理程式會以它們自己的函式(routines)替換掉 BIOS 的.通常這是藉由將磁碟管理程式放在 MBR 及其後幾個磁區(OnTrack 稱這些程式碼為 DDO: Dynamic Drive Overlay )來達成的, 所以它會在任何其它作業系統之前被啟動.這也就是為什麽在安裝磁碟管理程式後從軟碟啟動可能會出問題.
這影響可能多於或少於 BIOS 轉換 - 但特別是在相同的磁碟上跑數種不同的作業系統時, 磁碟管理程式可能引起許多問題.
Linux 從 1.3.14 版開始支援 OnTrack 磁碟管理程式, 從 1.3.29 開始支援 EZ-Drive .下面有些更進一步的資訊.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
5. 核心的 IDE 磁碟轉換
如果 Linux 偵測到 IDE 磁碟上有某些磁碟管理程式存在, 它將會試著使用與該磁碟管理程式相同的方式來重新對應磁碟, 所以 Linux 看到與, 例如 DOS 配合 OnTrack 或是 EZ-Drive 相同的磁碟分割.然而, 當你在指令列上指定 geometry 時, 就不會做任何的重新對應 - 所以一行 `hd=cyls,heads,secs' 指令列選項可能取消掉與磁碟管理程式的相容.
此重新對應的方式是嘗試 4,8,16,32,64,128,255 磁頭數(H*C 保持不變)直到 C <= 1024 或是 H = 255.
細節如下 - 小節的抬頭是出現在相對應之啟動訊息裡的字串.在此以及在這份文件任何其它地方中分割的型態都以十六進位數字表示.
5.1 EZD
偵測到 EZ-Drive , 因為第一個主要分割區型態為 55 .如上述重新對應 geometry, 且忽略從第 0 磁區讀入的分割表 - 以第 1 磁區的分割表取代.磁碟的區塊號碼(block numbers) 沒有改變, 但對磁區 0 的寫入會轉向磁區 1.此動作可以藉由修改在 ide.c 中的
#define FAKE_FDISK_FOR_EZDRIVE 0
並重新編譯核心來改變.
5.2 DM6:DDO
偵測到 OnTrack DiskManager(在第一個磁碟上), 因為第一個主要分割區型態為 54 .如上述重新對應 geometry 而且整個磁碟平移 63 個磁區. (所以舊的磁區 63 變成磁區 0)然後從新的第 0 磁區讀入新的 MBR (與分割表).此平移當然是為 DDO 留空間 - 這也就是為什麽其它磁碟不必平移.
5.3 DM6:AUX
偵測到 OnTrack DiskManager(在其它磁碟上), 因為第一個主要分割區型態為 51 或 53.如上述重新對應 geometry .
5.4 DM6:MBR
偵測到某舊版的 OnTrack DiskManager, 並非藉由分割區型態, 而是簽名(signature).(測試在 MBR 裡第 2,3 位元組的偏移值是否不大於 430,