2014年12月28日 星期日

探討現代作業系統在整合可延伸韌體介面 (UEFI)與GUID磁碟分割表(GPT)下的安裝及使用(A Survey on modern operating systems installed and used in integrated Extensible Firmware Interface (UEFI) and GUID partition table (GPT) )

電腦硬體的規格不斷的推陳出新,使得一些早期設計的硬體規格或標準逐漸不適用而需要被淘汰,例如儲存體的容量每年均一直不斷的往上攀升,市面上超過2 TB容量的硬碟早已隨處可見,因而使用者可能面臨舊式BIOS和磁碟分割架構已無法支援之窘境,為了解決這些問題,除了硬體廠商必要進行規格上的更新 ,系統工程師也必需學習如何在新系統上採用與整合新的硬體規格技術以便提供新功能來達到較佳的系統效能或安全性,本文將說明現代作業系統面臨新的電腦韌體介面--整合可延伸韌體介面 (UEFI)和新的磁碟分割架構--GUID磁碟分割表二項規格時,如何正確的安裝以及使用時相關的問題進行探討。

UEFI (整合可延伸韌體介面)

基本輸入輸出系統 (Basic Input/Output System;BIOS)為PC電腦已延用三、四十年之久的業界標準韌體介面(Firmware Interface),BIOS為電腦打開電源後所執行的第一個軟體,電腦利用BIOS來初始化、測試系統硬體元件,並且由主要儲存裝置載入開機載入程式或作業系統以完成電腦系統的啟動過程,但這項已應用於PC電腦數十年的傳統BIOS早就難以因應現代快速變動需求的PC電腦硬體規格,其主要的缺點與限制包括:

  • 傳統BIOS以16位元真實模式下啟動並執行硬體服務程式,定址空間有限。
  • 傳統BIOS植基於X86插斷(Interrupt)模式,以組合語言撰寫,只能應用於傳統PC架構。
  • 沒有明確定義廠商使用的介面。

UEFI (整合可延伸韌體介面) 是一種新的電腦標準韌體介面,用來定義作業系統與系統靭體之間的軟體介面以便可以取代傳統基本輸出入系統 (Legacy BIOS),UEFI目前是由超過數百家科技公司組成的 UEFI 協會所建立的標準,其設計的中心目的在於改善軟體互通性並且解決傳統 BIOS 的位址相關限制, 因此,UEFI 韌體的優點包含:

  • 擴充啟動磁碟區的能力
    UEFI 允許從大硬碟下開機,亦即能夠支援從大於2TB的硬碟上啟動電腦。
  • 加強電腦啟動時的安全性需求
    UEFI支援安全性啟動(Secure Boot)功能,用以確保開機時唯有受信任或授權的程式碼才能夠執行,當EUFI電腦開機時,韌體可以檢查每個啟動的程式碼是否有正確的簽署,以避免未經授權的韌體、驅動程式和作業系統並且防範惡意rootkit的執行。
  • 作業系統啟動前的網路能力
    UEFI提供並強化了網路程式介面,允許在作業系統啟動之前即可提供較豐富的網路能力,這包括了IPv4和IPv6堆疊,此外,UEFI 也允許伺服器利用多點傳送開機映像到許多單位。
  • 強化電腦啟動時的管理能力
    UEFI 提供完整的系統硬體資源的存取能力,讓IT人員在尚未載入作業系統前即可進行遠端診斷,
  • 遠端配置能力 (Remote provisioning)
    UEFI預先啟動的網路能力不僅可以讓機器直接連線到網站以下載驅動程式和韌體以執行更新,而且由遠端的備份或映像伺服器(重新)安裝系統變為更直接有彈性而可行。
  • 模組化的彈性設計
    UEFI使用C語言的模組化架構,比使用組合語言的傳統BIOS更有彈性,能夠在32或64位元處理器模式下運作,突破了傳統BIOS 16位元的定址限制。

下圖為UEFI的架構。

uefi

相容性支援模組(Class Support Module;CSM)與平台等級 (Platform Class)

為了提供回溯相容性,大部份UEFI韌體廠商會透過相容性支援模組(CSM)來讓機器可以由傳統BIOS模式開機以啟動MBR磁碟,這主要是兼顧了傳統BIOS之相容性。

UEFI論壇則是根據相容性支援模組是否存在與否而定義出四種平台等級(類型),即是等級0到等級3,如下圖所示:

ueficlass

  • 等級 0:等級0 乃是指純粹的舊式BIOS平台,完全不支援UEFI平台 。
  • 等級 1:只有UEFI CSM的平台系統,只能在UEFI上執行舊式的BIOS介面,使用軟體插斷 INT10、INT13等。
  • 等級 2:具有混合UEFI和CSM雙介面的平台系統,此等級提供最彈性的硬體選擇,可依據支援舊式介面或UEFI介面的擴充ROM來提供介面服務,因此,等級2可以支援新和舊二種開機程序並且仍可以使用額外的UEFI的預先啟動功能(如Shell和UEFI應用程式) 。
    csm1
  • 等級 3:這是完全排除舊式BIOS介面的平台,亦即在等級2中移除了CSM,因此只能啟動於唯有UEFI支援的BIOS,UEFI開機載入程式,UEFI作業系統。

一般而言,為了提供最大的使用彈性和相容性,目前大部份韌體廠商目前均支援等級2,但允許使用者自行設定停用或啟用此支援模組功能。下圖為一電腦的UTFI BIOS中設計的相容性支援模組的選項,使用者可以自行啟用或停用此相容性支援模組。

uefibioscsm

EFI 系統分割區 (EFI System Partition)

EFI 系統分割區 (ESP)為一個EFI頁腦開機時所必要的 FAT32 格式的實體分割區,雖然不同的系統劃分的大小不同,但通常會小於512MB,ESP這個區域位置主要是讓UEFI韌體用以啟動UEFI開機載入程式和應用程式,其次,ESP也是一個與作業系統無關的EFI 機器必備分割區,必需標示為EF00 或 ef00 分割類型以及設定啟動9boot)旗標。

Linux系統上的ESP通常使用/boot/efi 目錄為掛載點,一旦Linux系統正常啟動後即可透過此目錄存取其內容。

GUID磁碟分割表

1983年PC DOS 2.0所推出的主開機記錄 (Master Boot Record;MBR)磁碟分割架構在PC電腦歷史上具有重要的地位,但隨著硬碟容量越來越大的情況下,早期設計的MBR磁碟分割架構早已顯著不敷使用並有著嚴重限制:

  • 定址能力只到「2TB」容量
    由於MBR原始設計上採用32位元來代表邏輯磁區(Logical sector),而每個磁區大小為512位元組,因此磁碟定址大小受限於2TB ( 232 × 512 ) 位元組。
  • MBR磁碟分割只允許建立最多4個主要分割區,或是3個主要分割區搭配1個延伸分割區。

因此,GUID分區表(GPT)被引入做為整合延伸韌體介面(UEFI)計劃的一部分,使用新的GPT分割架構主要的特性和優點為:

  • 64 位元邏輯區塊定址(LBA)
    GPT 不再採用傳統的磁柱-磁頭-磁區(cylinders-heads-sectors;CHS)定址模式,而採用64位元的邏輯區塊位址(Logical Block Address, LBA),因此不再受到2TB的大小限制,最大理論空間為8 ZB
  • 改進的分割技術
    GPT可以支援的分割數量不再受限於四個,預設上可支援高達128個分割區。
    傳統的MBR只設計一個位元組來定義分割類型,
    GPT則利用16個位元組(128位元)的GUID來辨識每個分割區,並採用GUID和屬性定義分割類型,有效的降低的分割類型的識別衝突。
    每個GPT分割區的名稱可利用一個36字元(72位元組)長度,支援萬國碼(unicode)的友善名稱來表達。
  • 強化容錯能力
    採用主要和備援表格以支援容錯能力,將GPT資料結構儲存於開頭以及結尾二份,另一方面,利用32位元的CRC檢查總和提升標頭和分割欄位的資料完整性。

總之,GPT提供了一個遠比舊式MBR來的更有彈性的磁碟分割方式。

現代作業系統支援GPT的方式並不盡相同,例如 Windows 與 OS/X只支援從啟動UEFI開機模式下的電腦使用GPT分割硬碟來開機,而大部份Linux則可以支援BIOS或UEFI啟動電腦均可以使用GPT硬碟來開機。

一個GPT格式的磁碟機,其分割的架構如下圖:

gptstructure

GPT包含了下列重要的邏輯分割區塊:

  • Protective MBR (LBA 0):這是為了相容性考量而設計的第一個邏輯磁區(LBA 0),包含一個0xEE 類型的主要分割欄位以定義整個磁碟大小,主要設計目的在用來避免那些不支援GPT的硬碟管理工具由於錯誤識別而破壞硬碟中的資料,因此稱為保護MBR。
  • Primary GPT Header (LBA 1):包括了一個唯一的磁碟GUID,主要分割表的位置,分割表的可用欄位數量,本身的CRC32值和次要GPT標頭的位置 (Secondary GPT Header)。
  • Primary GPT Table :包括128個分割區欄位,每個欄位有128位元組長度,包含了16位元組的Partition type GUID和另一個16位元組的Unique partition GUID,以及第一個與最後一個邏輯磁區位址(First and Last LBA)。
  • Secondary GPT Table:備援與容錯之用,一旦主要的GPT表格毀損,可藉以恢復。
  • Secondary GPT Table (LBA -1):備援容錯之用,假如主要的GPT表格毀損,可利用來恢復。

Windows 作業系統

微軟Windows作業系統從Windows Server 2008和Vista SP1的64位元版本開始支援UEFI,其後,從Windows 8和Windows Server 2012 作業系統後的版本更進一步開始支援UEFI 安全性開機(Secure Boot)功能。

Windows作業系統將啟動於UEFI模式的電腦必需使用GPT磁碟分割綁定,反之,若啟動於傳統BIOS則需採用傳統的MBR分割架構。使用者若對於手邉的Windows 系統採用何種韌體啟用和分割架構並不清楚,可以簡單的執行 "msinfo32" 指令來啟動『系統資訊』程式,並且檢視『BIOS模式』項目的值是 "UEFI" 或是 "舊版"(legacy) ,如果為 "UEFI"則表示系統啟動於UEFI-GPT 模式,若是"舊版" 則代表機器開機於 BIOS-MBR 模式。

msinfo32

安裝 Windows 時,Windows 安裝程式強制根據啟動電腦的韌體類型來決定所要採用的分割類型,倘若機器啟動於傳統BIOS模式就會採用 MBR分割類型,相反的,若啟用 UEFI模式的電腦就會採用GPT分割類型,一旦電腦設定錯誤的啟動模式,則執行 Windows 安裝程式時可能會無法安裝 Windows,例如下圖為使用者在一部啟動於UEFI模式的電腦,且手動或預先建立MBR分割磁碟上安裝Windows Server 2012,當選擇MBR分割區安裝時因而發生無法安裝的錯誤。

install_uefi1

 

另一方面,若在一部啟動於UEFI模式的電腦上安裝Windows 時,則Windows 安裝程式會將一個空白磁碟機上建立如下的GPT分割區:

uefi_winpart

 總之,Windows 官方目前只支援UEFI-GPT boot 或 BIOS-MBR 模式,而不支援UEFI-MBR or BIOS-GPT 設定模式。

上圖由Windows 安裝程式所自動建立的 GPT分割區的內容說明如下表:

分割區描述

順序 大小 分割類型 檔案系統格式

標籤

GUID 用途

修復磁碟分割

1 300MB 主要(Primary) NTFS 修復 de94bba4-06d1-4d40-a16a-bfd50179d6ac

存放Windows RE等修復工具,一鍵重設復原映像

EFI 系統磁碟分割 (ESP) 2 100MB EFI FAT32 系統 c12a7328-f81f-11d2-ba4b-00a0c93ec93b

啟動系統所需要的檔案,如NTLDR、HAL、Boot.txt和啟動時需必需的驅動程式

MSR 磁碟分割 3 128MB MSR     E3C9E316-0B5C-4DB8-817D-F92DF00215AE
  • 未配置的保留空間,做為未來特定用途之用

  • 磁碟管理員工具看不到,但可使用diskpart命令列檢視之
Windows 主要分割 4 其餘 主要(Primary) NTFS     安裝作業系統和程式資料

 

Linux 作業系統

新近版本的Linux系統大多支援UEFI與GPT規格與技術,某些時候還允許在傳統BIOS下使用GPT(不建議),這相較起Windows系統較有彈性。

判斷或檢查 Linux系統的啟動韌體和分割區類型

若您並不知道目前的手上的已安裝的 Linux系統是開機於EFI或傳統BIOS軔體,一個簡單的檢查方法是查看是否存在 /sys/firmware/efi 此目錄,若此目錄存在,則表示目前的系統應是EFI軔體啟動,若否,則應是開機在傳統BIOS模式下。

linuxuefi

假若您的機器已安裝parted套件,則使用下列指令亦可以確認目前的Linux機器是否啟動於EUFI以及採用GPT分割類型:

 parted /dev/sda print

下圖的 parted 指令所顯示內容中,由『分割區 :』後的字串可得知目前此部Linux電腦是採用何種分割方式,若是 msdos  則代表是傳統的MBR 分割方式,若是 gpt 則是採用GPT分割類型,其次,若分割表中開頭存有一個啟用 "啟動(boot)" 旗標的FAT檔案系統(通常小於1024MB大小),則代表此為UEFI韌體所啟動之機器所需的ESP,因此下圖中的第一張圖例為一部採用BIOS/MBR的傳統電腦,第二部電腦則是一部採用UEFI/GPT類型的Linux機器。

parted2

在此以CentOS 7 Linux 為例,預設安裝時建立了200MB大小的 /dev/sda1 分割區並且格式化為fat16檔案系統以做為ESP,此 ESP亦被掛接於 /boot/efi目錄,每次EFI韌體的機器開機時就會固定載入 /boot/efi/EFI/BOOT目錄下的BOOTX64.EFI 以啟動 EFI 開機應用程式。

Linux 支援UEFI與GPT的三個軟體層面分析

Linux系統大多透過三個不同的軟體層次來支援UEFI與GPT規格與技術:作業系統核心、開機載入程式 (Boot Loader)以及低階磁碟工具。

  • Linux核心支援
    首先,您的Linux 核心必需支援UEFI/GPT, 大部份新版的Linux發行版本,預設編譯的核心應已加入了EFI/GPT功能的支援,如果您日後自行編譯您的Linux核心,請確認核心 .config檔已經勾選 『Processor type and features –> EFI stub support』和『Enable the block layer –>Partition Types –> EFI GUID Partition support』選項以便讓核心具備EFI和GPT能力。
    linuxkernel
  • 開機載入程式 (Boot Loader)
    其實Linux核心3.3版後包含了一項EFISTUB (EFI BOOT STUB)啟動功能,這項核心功能允許EFI韌體直接載入核心為可執行元件,因此並無需額外的開機載入程式,不過,若需要採用額外的Linux 開機管理程式則必需留意其是否有支援GPT。
    早期Linux發行版本預設採用的LILO與GRUB開機管理程式並不支援GPT分割類型,唯有 GRUB2 才可以支援UTFI/GPT,不過GRUB2已重新改寫,與前版的GRUB設定方式大不相同。
  • 低階磁碟工具
    系統所使用的低階磁碟管理工具亦要能夠認得並支援管理GPT磁碟,下列為目前常見的Linux磁碟分割工具支援GPT之狀況。
    • fdisk、cfdisk、sfdisk
      Linux系統最普遍使用的磁碟分割管理工具--fdisk(來自util-linux套件)只有部份支援GPT,相關的cfdisk、sfdisk工具則尚未支援GPT,因此使用者應該盡量少使用這些尚未完整支援GPT的工具來管理GPT磁碟分割,以避免不當的破壞GPT標頭與分割表
    • GPT fdisk
      GPT fdisk是一群編輯管理GPT磁碟的文字模式工具,包括了一個互動模式的gdisk(類似 fdisk工具)、一個命令列適用於撰寫指令檔的sgdisk以及一個以 curses程式庫為基礎所撰寫的互動文字模式工具(類似 cfdisk)。
      gfdisk

    • parted :
      GNU Parted是另一套可以支援GPT分割型態的分割區管理工具 (名稱是由「PARTition」與「EDitor」兩字組合一塊),可以用於建立、移除、搬移動分割和調整分割大小等操作。另一個 由GNOME桌面環境提供的 gparted 程式則為使用GNU Parted函式庫的圖形介面前端程式。
      gparted

總之,新版的Linux發行版本大多已支援UTFI和GPT規格,並且開始包含支援GPT的開機載入程式和工具程式。

 

OS X 作業系統

蘋果電腦從 Mac OS X 10.4(代號Tiger)的Intel版本便已經開始支援EFI,Apple 於OS X 10.4版後的Intel版本更是在預設及正式上只支援安裝在UEFI韌體啟動的機器上,雖然技術上可以經由一些修補來將OS X安裝在傳統的BIOS上,但這並非官方正式支援的方式,另一方面預設安裝上亦採用可支援超過2TB限制的 GPT分割配置方式,所以OS X可說是一個完全(唯有)採用 UEFI-GPT 規格的系統。一般而言,購買MAC 電腦的使用者購買時機器上的系統均已安裝完成,因此使用者完全不需要了解或手動處理UEFI韌體設定或GPT分割區問題,日後新版OS推出後,亦只需要直接由 App Store下載安裝更新即可,通常只有您需要將OS X安裝在一般PC或虛擬機器上才會需要留意應該設定UEFI韌體架構方式才能進行安裝作業。

為了驗證OS X的磁碟分割區架構,使用者可以前往OS X的『工具程式』內啟動『磁碟工具程式』,就可以看到如下圖的安裝時的啟動磁碟機建立系統時自動採用GPT分割區格式。

diskutilgui

不過圖型介面的磁碟工具並無法看到隱藏性的分割區,所以若您希望看到完整的磁碟分割全貌,則可在終端機上輸入 "diskutil list" 指令,則可顯示所有磁碟的所有分割區,由下圖顯示畫面中,可知第一個200MB的分割區即是UEFI韌體下必需存在的EFI 系統分割區 (ESP),第三個分割區則為OS X 10.7 Lion版本後才會存在的650MB大小之修復用分割,而OS X系統本身則安裝於第二個分割區。

diskutillist

總之,目前的 Apple OS X為僅支援 UEFI-GPT規格的作業系統,除非您需要從頭開始自行安裝OS X,否則購買 MAC 電腦時應已安裝完成,一般使用者並無需特別處理與設定。

Hypervisor 對UEFI介面的支援

近年來,由於伺服器虛擬化的普遍及廣泛使用,越來越多作業系統被安裝在虛擬機器,因此虛擬化軟體是否支援 EUFI和GPT分割磁碟亦日益重要,底下說明微軟的Hyper-V、VMWare的ESXi與VMware Workstation支援EFI的情況。

Hyper-V

Windows Server 2012 R2的Hyper-V 支援新舊兩代虛擬機器,亦即第 1 代和第 2 代。建立Hyper-V虛擬機器時若選擇第 2 代虛擬機器將會支援整合可延伸韌體介面 (UEFI) 韌體,而不是 BIOS 韌體,並且將大部分的傳統裝置從第 2 代虛擬機器中移除,不過Hyper-V虛擬機器一旦建立後,就無法變更其世代。

hvuefi

第二代虛擬機器除了支援UEFI韌體後,還提供了一些新的功能: 使用標準網路介面卡的 PXE 開機、 從 SCSI 虛擬硬碟開機、 從 SCSI 虛擬 DVD 開機、安全開機 (預設為啟用)。

由於 Hyper-V的第二代虛擬機器預設啟用安全開機功能,這可能會導致無法安裝大部份的作業系統,因此安裝前經常需先於韌體設定頁中關閉這項功能才能夠順利安裝。

disablesecureboot

VMware

VMware 的型二(Type 2) Hypervisor – VMware Workstation 於10版(含)前雖然有支援UEFI,不過所建立的虛擬機器的預設組態檔均是採用傳統的BIOS韌體,而且10版前的 VMware Workstation 並沒有提供圖形介面可以啟用UEFI功能,因此您需要手動編輯虛擬機器的組態檔 .VMX檔案,加入如下的一行才能夠讓您的虛擬機器支援UEFI。

  firmware = "efi"

不過從VMware Workstation 11版開始後,使用者建立某些作業系統的虛擬機器時可選用EUFI韌體並且提供圖型介面的設定,選擇建立較新版本的Windows64位元作業系統的虛擬機器時,例如Windows 8 X64,就會顯示如下的韌體選擇畫面。

vmfireware

如果所選擇要安裝的作業系統於建立虛擬機器時精靈程式並無出現如下的Firmware Type設定頁,則11版的虛擬機器允許您建立後再行變更韌體類型,VMware Workstation 11版的虛擬機器組態設定對話方塊中的『Options』設定頁,『進階』選項内亦有一項 "Boot with EFI instead of BIOS" 核選方塊可以更改目前虛擬機器的韌體類型,不過一旦變更已安裝作業系統的虛擬機器韌體類型恐導致無法順利開機。

vmfireware1

另一方面,Vmware的型一(Type 1) Hypervisor- ESXi 5版後亦可支援UEFI韌體,不但可以將ESXi主機直接安裝在啟動UEFI的電腦上,日後所建立虛擬機器亦可啟用UEFI韌體功能,使用者可於尚未安裝作業系統前可藉由虛擬機器的內容對話方塊,第二個『Options』設定頁中的『Boot Options』來設定開機使用的韌體類型。

esxifireware

其餘的虛擬機器軟體,如 VirtualBox或Linux KVM亦均已開始支援UEFI規格的開機方式,使用者可自行查閱相關網站的資料。

結語

UEFI 設計用來取代傳統的BIOS,GPT用來取代傳統的MBR磁碟分割方式,對一般使用者而言,採用UEFI/GPT 最直覺的好處在於可以支援大於2TB的硬碟開機,對系統管理員而言,UEFI/GPT提供並強化了一些管理上的彈性,包括可以不再需要使用額外的開機管理程式,UEFI易於軟體模擬,具有網路啟動、遠端診斷等遠端管理能力,且目前主流作業系統及虛擬化軟體均已支援,對嵌入式系統開發人員而言,UEFI提供了更有效率、彈性及安全的硬體介面,一般而言,除非您是開發或使用嵌入式系統或負責撰寫作業系統低階程式碼,否則對於UEFI/GPT新規格的電腦及系統只需有基本認識,並且知道如何根據需求在韌體上加以設定、啟用或關閉,當安裝作業系統時確認採用UEFI或BIOS,採用MBR或GPT分割方式即可,一旦系統安裝完成,UEFI/GPT的採用對於使用者而言並不會有太大的不同,亦不會產生額外的管理與設定工作。

在可預見的未來,大部份PC電腦上使用UEFI韌體開機在GPT分割架構的硬碟上將成為預設且唯一的方式,因些假以時日,UEFI-GPT亦將成為大家越來越熟悉而具備的技術。