硬盤分區的陷阱及應對
之所以想到寫這篇,是因為本人在折騰 Linux 系統的過程中,有多次掉入硬盤分區的陷阱的經歷。最近幾天,再一次掉入坑中,折騰了兩天才從坑中爬出來。經過多方查詢資料,終於弄明白了硬盤分區的一些概念。下面將其記錄下來,以警示來者。
說起我自己掉坑的經歷,無不與 WinXP 和 Linux 的激烈碰撞有關。多年前,我就開始在一台電腦上同時安裝WinXP 和 Linux,只要遵守先安裝 WinXP 再安裝 Linux 的順序,就不會出問題,Linux 的安裝程序會自動識別多系統,安裝完成后可順利啟動多系統。有一天,我覺得單用 Linux 就夠了,於是就格了整個硬盤安裝了 Linux。又有一天,我覺得還是要用 WinXP,於是就重新安裝 WinXP(不要對我說虛擬機,多年前我的電腦還只有 256M 內存,虛擬機根本跑不動),結果發現,WinXP 的安裝程序沒辦法對硬盤進行分區了。這個坑是由 Linux 中的 LVM 引起的,WinXP 識別不了 LVM 分區,那個時代的 WinPE、DOS 工具箱中的所有工具都沒辦法識別 LVM,而那時我對Linux 的了解又只停留在只會在安裝系統的時候分區,根本不知道 Linux 系統中還有 fdisk、parted 這樣的工具,所以折騰了許久才從坑里面爬出來。多年后的現在,我又一次掉入了坑中。我工作時用的電腦是 WinXP 系統(天朝國情,你懂的),為了干點私活,我又裝了個 Ubuntu 上去了,這兩個系統一直相安無事。直到有一天,我把 Ubuntu 系統又折騰掛了,於是重裝,因為在分區的時候不小心選擇了默認的“清除整個盤並安裝Ubuntu”,然后硬盤就被整個格掉了,WinXP 就沒有了。我當時想,這多大點兒事,我再裝個 WinXP 不就完了嗎。但是問題來了,無論我怎么安裝,WinXP 系統就是啟動不了。后來才整明白,這個坑是硬盤采用了 GPT 分區引起的。那為什么我讓 Ubuntu 自動分區它就分成了 GPT 分區呢?這也怪這台惠普的工作用機比較奇葩,它即支持 legacy BIOS,也支持 EFI,當原來 WinXP 存在時,它用的當然是 MBR 分區(msdos分區),所以安裝 Ubuntu 時就是使用的 MBR 分區,而后來 Ubuntu 自動分區時,它看到主板支持 EFI,就自動把硬盤整成 GPT 分區了。我也是折騰了幾天才明白這個道理,最后終於在 Ubuntu LiveCD 的 parted 程序的幫助下,使用一個 mklabel msdos 命令把硬盤從 GPT 分區更改為 MBR 分區,然后再按順序安裝 WinXP 和 Ubuntu,才算是從坑里面爬出來。
對於那些長期管理大型機房和大存儲容量的服務器的朋友,對於硬盤分區,他們肯定是早就做好了功課。不會像我這樣,直到碰到問題才會去學習相關的知識。對於硬盤分區的這些知識,我總結如下(只是簡單總結,具體內容請大家自行搜素):
1、傳統的 BIOS 只支持從 MBR 分區的硬盤啟動。MBR 分區的分區表保存在硬盤的第一個扇區,而且只有 64 字節,所以最多只能有四個表項。也就是說,我們只能把硬盤分為 4 主分區,或者分成小於等於 3 個主分區再加一個擴展分區。擴展分區又可以分為多個邏輯分區。MBR 分區的優點就是簡單,大家都用,所以大家都懂的嘛,很多操作系統都可以從 MBR 分區的硬盤啟動。缺點就是 MBR 分區不能識別大於 2T 的硬盤空間,也不能有大於 2T 的分區;
2、GPT 分區的硬盤可以解決以上 MBR 分區的所有缺點,它沒有 4 個主分區的限制,想分幾個主分區就可以分幾個主分區,它可以識別大於 2T 的硬盤空間,每個分區的大小也可以超過 2T。但是它的缺點是需要操作系統支持。比如只有 WinXP 64 位、Win Vista、Win 7 和 Win 8 和比較新的 Linux 發行版支持 GPT 分區的硬盤。而且,如果沒有 EFI 的支持的話,以上系統也只能將 GPT 分區的硬盤當成數據盤,不能從 GPT 分區的硬盤啟動;
3、要從 GPT 分區的硬盤啟動,則主板使用 EFI、硬盤使用 GPT 分區、操作系統支持 GPT 和 EFI 這三個條件缺一不可。目前比較新的 64 位 Linux 系統和 Win8 系統都是支持 EFI 的,所以都是需要從 GPT 分區的硬盤啟動的。現在的電腦主板已經逐漸拋棄 legacy BIOS,而只支持 EFI了。(像我的工作機這樣的過渡產品將越來越少。)目前很多預裝 Win8 的筆記本的主板幾乎都只支持 EFI 了。所以,學習 GPT 和 EFI 的相關知識勢在必行;
4、以上分區策略都是固定分區。硬盤分區一旦完成,則分區的大小不可改變,如果要改變分區的大小的話,只有重新分區。而且由於沒有辦法把多個硬盤分到一個區,所以再怎么分,每個分區的大小都有限。所以我們需要一種動態分區的東西。LVM 就是這樣一個東東,它叫邏輯卷管理。使用 LVM 的機制是這樣的:首先把硬盤分區或者整塊硬盤標記為一個物理卷(PV),然后再創建一個卷組(VG),把一個或多個物理卷加入卷組,最后對卷組進行分區,每一個分區稱為一個邏輯卷(LV)。LVM的優點就是可以隨時向卷組中添加物理卷擴展卷組的大小,以可以動態調整邏輯卷的大小。這在服務器中尤其有用,比如說有一個原本有100個用戶的服務器,其 /home 目錄下就會有100個用戶的主目錄,如果給他們每人分配 20G 的空間的話,就會占滿一個 2T 的硬盤,如果這時再來 100 個用戶怎么辦?如果使用 LVM 就可以順利解決這個問題,我們可以再加一個 3T 的硬盤,然后把這個硬盤加入卷組就可以擴大卷組的大小,然后再調整 /home 所在的邏輯卷的大小即可。LVM 既可以搭配 MBR 使用,也可以搭配 GPT 使用。
下面通過 Ubuntu 14.04 安裝過程中自動分區的策略來驗證以上知識點。首先,對於只支持 legacy BIOS 的電腦,安裝 Ubuntu 時分區選項如下:
這時,不選擇啟動 LVM 的選項。安裝完操作系統后,使用 parted 程序查看硬盤分區,通過查看 /etc/fstab 文件來了解哪個分區對應哪個文件系統,如下圖:
通過上面圖片中 parted 程序中的 print 命令的輸出可以看出,硬盤的分區表類型為 msdos,也就是 MBR 分區。硬盤分為一個主分區 sda1 和一個擴展分區 sda2,主分區 sda1 占 20.4G,擴展分區 sda2 只有 1072M,擴展分區中只有一個邏輯分區 sda5。通過 /etc/fstab 可以看出主分區 sda1 掛載到根目錄,邏輯分區 sda5 為交換空間。
上面的分區方案是最簡單最常用的一種。下面來看看啟用 LVM 是什么效果。在選擇分區方案的界面選擇開啟 LVM 的選項,如下圖:
安裝完操作系統后,還是通過 parted 程序和 /etc/fstab 來查看硬盤的分區及使用情況,如下圖:
從圖中可以看出,分區表的類型還是 msdos。硬盤還是只分了一個主分區 sda1 和一個擴展分區 sda2,但是主分區 sda1 只有 255M,擴展分區 sda2 倒是有 21.2G,同樣擴展分區只分為一個邏輯分區 sda5,邏輯分區 sda5 占用擴展分區中全部的 21.2G 空間,而且 sda5 的標志是 lvm,說明該分區被標記為一個物理卷(PV),它肯定是被加入到了一個卷組(VG)中。通過 /etc/fstab 文件可以看出,主分區 sda1 掛載到 /boot,而根目錄和交換空間掛載的是兩個邏輯卷(LV)。
通過 lvm 命令可以查看系統中卷組、物理卷和邏輯卷的信息,如下圖:
通過 pvs 和 pvdisplay 命令,可以看到系統中只有一個物理卷,那就是 /dev/sda5,該物理卷加入到了卷組 ubuntu-vg 之中。通過 vgs 和 vgdisplay 命令可以看到系統中只有一個卷組,那就是 ubuntu-vg,該卷組被分為兩個邏輯卷。
再看下圖:
通過 lvs 和 lvdisplay 命令可以看到卷組分為兩個邏輯卷,它們分別掛載到根目錄和交換空間。
通過 lvm 命令還可以進行更多的操作,比如創建新的卷組,將新的物理卷加入到卷組,增大或減小邏輯卷的大小等等。具體用什么命令,一個 help 即可搞定。
最后,來看看在主板只支持 EFI 的情況下,Ubuntu 如何分區。安裝的啟動界面如下:
這個安裝界面和 legacy BIOS 系統下的安裝界面是不同的,傳統的安裝界面如下:
在 EFI 模式下,還是選擇自動分區。安裝完操作系統后,使用 parted 和 /etc/fstab 來查看硬盤的分區和使用情況,如下圖:
通過以上圖片可以看出,硬盤的分區表類型為 gpt,硬盤分為三個區,都是主分區。其中第 1 個分區 sda1 的大小是 537M,文件系統是 fat32,其掛載的路徑是 /boot/efi,而另外兩個分區一個掛載到根目錄,一個為交換空間。從上面的信息我們不難推斷:只支持 EFI 的主板只能從 GPT 分區的硬盤啟動,而且該硬盤第 1 個分區必須為 fat32 文件系統,該文件系統中存放的是 EFI 需要的各種文件。
如果在安裝 Ubuntu 系統的時候不是選擇自動分區,而是選擇最后那個“其它選項”來自定義分區,會發現其實Ubuntu 提供的自定義分區功能很有限。它沒辦法讓人選擇是使用 MBR 分區還是使用 GPT 分區,也沒有辦法選擇是否啟用 LVM。如果需要更靈活的管理的話,還是只有點擊“試用Ubuntu”按鈕,進入 LiveCD 的 Ubuntu 系統后,使用 parted 命令和 lvm 命令手動管理硬盤分區。
延伸閱讀:
除了硬盤分區,平常還有可能用到的硬盤管理功能有以下一些:
1、創建 RAID,可以使用 mdadm 程序;
2、查看個分區或各文件夾的空間占用 ,使用 df 和 du 程序;
3、指定磁盤配額,使用 quota 軟件包;
4、查看各分區的文件系統、UUID、卷標,使用 blkid 程序。
(京山游俠於2014-07-13發布於博客園,轉載請注明出處。)
最新進展
前文提到,我使用的惠普工作站比較奇特,既支持 Legacy BIOS,又支持 EFI。后來我自己又更新過幾台電腦,包括自己組裝的台式機和更換過幾台筆記本,發現其實不是我碰到的惠普工作站奇特,而是在支持 EFI 的主板上,都普遍支持 Legacy BIOS,可以在 BIOS 里面設置啟動方式來選擇是從 Legacy BIOS 啟動還是從 EFI 啟動。
使用 EFI 模式安裝的 Linux 系統無法從 Legacy BIOS 模式啟動,反之亦然。知道了這個原理以后,這個坑就再也坑不到我了。在不同的機器、不同的介質上安裝 Linux 系統,甚至安裝多系統,就再也難不倒我了。
(京山游俠於2016-08-20更新於博客園,轉載請注明出處。)