這件事我已經預謀很久了,然后我終于付出了行動。雖然我現在把操作系統換成Ubuntu并不是件明智的事,但是我那顆Geek的心已經等不了了。
這次操作系統分區我先是依照的《鳥哥的私房菜》分區的:
分區就和這張圖類似。之后就出現這個問題:
這我就很蒙了,我明明按照教程來的怎么能錯呢?
還是百度大法好總,我在這里找到了點啟示:http://forum.ubuntu.org.cn/viewtopic.php?t=465188
沒錯:我就是uefi開機,莫非和uefi開機有關系,尤其是那個繁體字的那幾句話還要gpt分區,這又是個什么鬼。
好吧情急之下只能再次開啟百度大法,我在這里找到了啟示:http://blog.163.com/yangz_ranma/blog/static/121054460201601912253287/
然后按照他的操作總算是把Ubuntu給裝上了
好吧,雖然把操作系統給裝上了但還是有諸多疑惑,于是我就又去《鳥哥的私房菜》來尋求答案了。
我們先來認識下硬盤的結構如圖:
整個磁碟盤上頭好像有多個同心圓繪制出的圓形圖,而由圓心以放射狀的方式分割出磁碟的最小儲存單位,那就是磁區(Sector), 在物理組成分面,每個磁區大小為512Bytes,這個值是不會改變的。而磁區組成一個圓就成為磁軌(track), 如果是在多碟的硬盤上面,在所有磁碟盤上面的同一個磁軌可以組成一個磁柱(Cylinder), 磁柱也是一般我們分割硬盤時的最小單位了!
硬盤這部分鳥哥是這么說的:
整個磁碟盤上頭好像有多個同心圓繪制出的圓形圖,而由圓心以放射狀的方式分割出磁碟的最小儲存單位,那就是扇區(Sector), 在物理組成分面,每個磁區大小為512Bytes,這個值是不會改變的。而磁區組成一個圓就成為磁道(track), 如果是在多碟的硬盤上面,在所有磁碟盤上面的同一個磁道可以組成一個柱面(Cylinder), 磁柱也是一般我們分割硬盤時的最小單位了!
在計算整個硬盤的儲存量時,簡單的計算公式就是:『header數量 * 每個header負責的磁柱數量 * 每個磁柱所含有的磁區數量 * 磁區的容量』,單位換算為『header * cylinder/header * secter/cylinder * 512bytes/secter』,簡單的寫法如下: Head x Cylinder x Sector x 512 Bytes。 不過要注意的是,一般硬盤制造商在顯示硬盤的容量時,大多是以十進位來編號,因此市售的500GB硬盤, 理論上僅會有460GBytes左右的容量喔
注釋:Heads就是磁頭數
接下來我們談MBR分區:
早期的 Linux 系統為了相容于 Windows 的磁盤,因此使用的是支持 Windows 的
MBR(Master Boot Record, 主要開機紀錄區) 的方式來處理開機管理程序與分區表!而開
機管理程序紀錄區與分區表則通通放在磁盤的第一個扇區, 這個扇區通常是 512Bytes 的大
小 (舊的磁盤扇區都是 512Bytes 喔!),所以說,第一個扇區 512Bytes 會有這兩個數據:
主要開機記錄區(Master Boot Record, MBR):可以安裝開機管理程序的地方,有446
Bytes
- 分區表(partition table):記錄整顆硬盤分區的狀態,有64 Bytes
-
由于分區表所在區塊僅有64 Bytes容量,因此最多僅能有四組記錄區,每組記錄區記錄了該區
段的啟始與結束的柱面號碼。 若將硬盤以長條形來看,然后將柱面以直條圖來看,那么那64
Bytes的記錄區段有點像下面的圖示:
Diskdivide.jpg
由于分區表就只有64 Bytes而已,最多只能容納四筆分區的記錄, 這四個分區的記錄被稱為
主要(Primary)或延伸(Extended)分區。 根據上面的圖示與說明,我們可以得到幾個重
點信息: - 其實所謂的“分區”只是針對那個64 Bytes的分區表進行設置而已!
- 硬盤默認的分區表僅能寫入四組分區信息
- 這四組分區信息我們稱為主要(Primary)或延伸(Extended)分區
- 分區的最小單位“通常”為柱面(cylinder)
- 當系統要寫入磁盤時,一定會參考磁盤分區表,才能針對某個分區進行數據的處理
MBR邏輯分區:
既然分區表只有記錄四組數據的空間,那么是否代表我一顆硬盤最多只能分區出四個分區?
當然不是啦!有經驗的朋友都知道, 你可以將一顆硬盤分區成十個以上的分區的!那又是如
何達到的呢?在Windows/Linux系統中, 我們是通過剛剛談到的延伸分區(Extended)的方
式來處理的啦!延伸分區的想法是: 既然第一個扇區所在的分區表只能記錄四筆數據, 那我
可否利用額外的扇區來記錄更多的分區信息?實際上圖示有點像下面這樣:
Tips 實際上延伸分區并不是只占一個區塊,而是會分佈在每個分區的最前面幾個扇區來記載
分區信息的!只是為了方便讀者記憶, 鳥哥在上圖就將他簡化了!有興趣的讀者可以到下面
的鏈接瞧一瞧實際延伸分區的紀錄方式: http://en.wikipedia.org/wiki/Extended_boot_record
在上圖當中,我們知道硬盤的四個分區記錄區僅使用到兩個,P1為主要分區,而P2則為延伸
分區。請注意, 延伸分區的目的是使用額外的扇區來記錄分區信息,延伸分區本身并不能被
拿來格式化。 然后我們可以通過延伸分區所指向的那個區塊繼續作分區的記錄。
如上圖右下方那個區塊有繼續分區出五個分區, 這五個由延伸分區繼續切出來的分區,就被
稱為邏輯分區(logical partition)。 同時注意一下,由于邏輯分區是由延伸分區繼續分區出
來的,所以他可以使用的柱面范圍就是延伸分區所設置的范圍喔! 也就是圖中的101~400
啦!
MBR 主要分區、延伸分區與邏輯分區的特性我們作個簡單的定義啰:
- 主要分區與延伸分區最多可以有四筆(硬盤的限制)
- 延伸分區最多只能有一個(操作系統的限制)
- 邏輯分區是由延伸分區持續切割出來的分區;
- 能夠被格式化后,作為數據存取的分區為主要分區與邏輯分區。延伸分區無法格式化;
- 邏輯分區的數量依操作系統而不同,在Linux系統中SATA硬盤已經可以突破63個以上的
分區限制;
GPT分區:
因為過去一個扇區大小就是 512Bytes 而已,不過目前已經有 4K 的扇區設計出現!為了相容
于所有的磁盤,因此在扇區的定義上面, 大多會使用所謂的邏輯區塊位址(Logical Block
Address, LBA)來處理。GPT 將磁盤所有區塊以此 LBA(默認為 512Bytes 喔!) 來規劃,
而第一個 LBA 稱為 LBA0 (從 0 開始編號)。
與 MBR 僅使用第一個 512Bytes 區塊來紀錄不同, GPT 使用了 34 個 LBA 區塊來紀錄分區
信息!同時與過去 MBR 僅有一的區塊,被干掉就死光光的情況不同, GPT 除了前面 34 個
LBA 之外,整個磁盤的最后 33 個 LBA 也拿來作為另一個備份!這樣或許會比較安全些吧!
詳細的結構有點像下面的模樣:
- LBA0 (MBR 相容區塊)
與 MBR 模式相似的,這個相容區塊也分為兩個部份,一個就是跟之前 446 Bytes 相似的
區塊,儲存了第一階段的開機管理程序! 而在原本的分區表的紀錄區內,這個相容模式
僅放入一個特殊標志的分區,用來表示此磁盤為 GPT 格式之意。而不懂 GPT 分區表的
磁盤管理程序, 就不會認識這顆磁盤,除非用戶有特別要求要處理這顆磁盤,否則該管
理軟件不能修改此分區信息,進一步保護了此磁盤喔! - LBA1 (GPT 表頭紀錄)
這個部份紀錄了分區表本身的位置與大小,同時紀錄了備份用的 GPT 分區 (就是前面談
到的在最后 34 個 LBA 區塊) 放置的位置, 同時放置了分區表的檢驗機制碼
(CRC32),操作系統可以根據這個檢驗碼來判斷 GPT 是否正確。若有錯誤,還可以通
過這個紀錄區來取得備份的 GPT(磁盤最后的那個備份區塊) 來恢復 GPT 的正常運
行! - LBA2-33 (實際紀錄分區信息處)
從 LBA2 區塊開始,每個 LBA 都可以紀錄 4 筆分區紀錄,所以在默認的情況下,總共可
以有 432 = 128 筆分區紀錄喔!因為每個 LBA 有 512Bytes,因此每筆紀錄用到 128
Bytes 的空間,除了每筆紀錄所需要的識別碼與相關的紀錄之外,GPT 在每筆紀錄中分
別提供了 64bits 來記載開始/結束的扇區號碼,因此,GPT 分區表對於單一分區來說,
他的最大容量限制就會在“ 264 512Bytes = 263 1KBytes = 233TB = 8 ZB ”,要注意 1ZB=230TB
啦! 你說有沒有夠大了?
現在 GPT 分區默認可以提供多達 128 筆紀錄,而在 Linux 本身的核心設備紀錄中,針對單一
磁盤來說,雖然過去最多只能到達 15 個分區,不過由于 Linux kernel 通過 udev 等方式的處
理,現在 Linux 也已經沒有這個限制在了! 此外,GPT 分區已經沒有所謂的主、延伸、邏輯
分區的概念,既然每筆紀錄都可以獨立存在, 當然每個都可以視為是主分區!每一個分區都
可以拿來格式化使用喔!
BIOS+MBR/GPT搭配啟動情況
在計算機概論里面我們有談到那個可愛的BIOS與CMOS兩個東西, CMOS是記錄各項硬件參
數且嵌入在主板上面的儲存器,BIOS則是一個寫入到主板上的一個固件(再次說明, 固件就
是寫入到硬件上的一個軟件程序)。這個BIOS就是在開機的時候,計算機系統會主動執行的
第一個程序了!
接下來BIOS會去分析計算機里面有哪些儲存設備,我們以硬盤為例,BIOS會依據使用者的設
置去取得能夠開機的硬盤, 并且到該硬盤里面去讀取第一個扇區的MBR位置。 MBR這個僅
有446 Bytes的硬盤容量里面會放置最基本的開機管理程序, 此時BIOS就功成圓滿,而接下
來就是MBR內的開機管理程序的工作了。
這個開機管理程序的目的是在載入(load)核心文件, 由于開機管理程序是操作系統在安裝
的時候所提供的,所以他會認識硬盤內的文件系統格式,因此就能夠讀取核心文件, 然后接
下來就是核心文件的工作,開機管理程序與 BIOS 也功成圓滿,將之后的工作就交給大家所
知道的操作系統啦!
簡單的說,整個開機流程到操作系統之前的動作應該是這樣的:
- BIOS:開機主動執行的固件,會認識第一個可開機的設備;
- MBR:第一個可開機設備的第一個扇區內的主要開機記錄區塊,內含開機管理程序;
- 開機管理程序(boot loader):一支可讀取核心文件來執行的軟件;
- 核心文件:開始操作系統的功能...
第二點要注意,如果你的分區表為 GPT 格式的話,那么 BIOS 也能夠從 LBA0 的 MBR 相容
區塊讀取第一階段的開機管理程序碼, 如果你的開機管理程序能夠認識 GPT 的話,那么使用
BIOS 同樣可以讀取到正確的操作系統核心喔!換句話說, 如果開機管理程序不懂 GPT ,例
如 Windows XP 的環境,那自然就無法讀取核心文件,開機就失敗了!
第二點要注意,如果你的分區表為 GPT 格式的話,那么 BIOS 也能夠從 LBA0 的 MBR 相容
區塊讀取第一階段的開機管理程序碼, 如果你的開機管理程序能夠認識 GPT 的話,那么使用
BIOS 同樣可以讀取到正確的操作系統核心喔!換句話說, 如果開機管理程序不懂 GPT ,例
如 Windows XP 的環境,那自然就無法讀取核心文件,開機就失敗了!
UEFI+GPT搭配啟動情況:
我們現在知道 GPT 可以提供到 64bit 的尋址,然后也能夠使用較大的區塊來處理開機管理程
序。但是 BIOS 其實不懂 GPT 耶!還得要通過 GPT 提供相容模式才能夠讀寫這個磁盤設備
~而且 BIOS 僅為 16 位的程序,在與現階段新的操作系統接軌方面有點弱掉了! 為了解決這
個問題,因此就有了 UEFI (Unified Extensible Firmware Interface) 這個統一可延伸固件界
面的產生。
UEFI 主要是想要取代 BIOS 這個固件界面,因此我們也稱 UEFI 為 UEFI BIOS 就是了。
UEFI 使用 C 程序語言,比起使用組合語言的傳統 BIOS 要更容易開發!也因為使用 C 語言
來撰寫,因此如果開發者夠厲害,甚至可以在 UEFI 開機階段就讓該系統了解 TCP/IP 而直接
上網! 根本不需要進入操作系統耶!這讓小型系統的開發充滿各式各樣的可能性!
另外,與 BIOS 模式相比,雖然 UEFI 可以直接取得 GPT 的分區表,不過最好依舊擁有
BIOS boot 的分區支持, 同時,為了與 windows 相容,并且提供其他第三方廠商所使用的
UEFI 應用程序儲存的空間,你必須要格式化一個 vfat 的文件系統, 大約提供 512MB 到 1G左右的容量,以讓其他 UEFI 執行較為方便。