2020年8月28日 星期五

GPT 硬碟切割, 以及如何 「模擬傳統 BIOS」 的方式開機 (legacy boot)

切割硬碟有兩種方式。 已沿用幾十年的舊式 MBR 分割方式 最多只能切成 3+1 個主分割區且只支援容量 2T 以下的硬碟。 較新的 GPT 分割方式則可切成最多 128 個分割、 支援硬碟容量是 MBR 限制的 2^32 倍 (約 40 億倍)。

另一方面, 主機板的韌體也有新舊之分。 二十世紀的板子採用 BIOS; 近十年來的板子幾乎都是較新的 UEFI。 新舊不同方式切割的硬碟, 搭配新舊不同的主機板韌體, 會產生四種組合。 本文關心其中一種組合 (表格左下角) 的 linux 開機設定方式。 (表格畫法參考 這篇)

主機板
BIOS/模擬 BIOS UEFI
硬碟 MBR 2TB 限制 檔案放在
正確位置
即可
GPT 要設定分割屬性

因為硬碟越來越大, 現在買硬碟, 切割方式勢必得選 GPT。 但是新的 UEFI 韌體真的有比較好嗎? 大推 巴哈姆特上的名詞與觀念解釋教學文。 簡單地說, UEFI 的效能與圖形介面等等各方面確實較佳; 但是 UEFI 其中有一個 secure boot 機制, 其實是大廠逐步奪權的陰謀: 它讓硬體廠商可以沒收你的開機鑰匙, 還企圖說服你 棄權比較安全。 還好目前不需要啟動 secure boot 也還是可以 從 UEFI 模式啟動隨身碟

理論上關掉 secure boot 也就可以用 grub2 => linux 自由開機了。 可惜我的 grub2 程度只夠實現 開機光碟蒐集狂人 的野心。 較熟悉習慣的 extlinux 最近才開始支援 UEFI, 還來不及學 :-) 所以今天要介紹的是表格左下角: 在新主機板上, 用 UEFI 模擬 BIOS, 並啟動 GPT 分割硬碟上的 linux 作業系統。

首先, 在 UEFI 裡面必須設定: 關閉 secure boot、 啟用 csm (compatibility support module)、 啟用 legacy boot (傳統開機方式)。 這樣才能模擬傳統的 BIOS 開機。

再來, 用 gdisk 切割硬碟。 其實也根本用不到 128 個分割。 自從用慣空間可以靈活彈性分配的 lvm 之後, 現在我的切割方式變成:

  1. /dev/sdx1: type 為 "ef00" 的 512 MB 分割, 保留給 (將來如果改採表格右下角的) UEFI 模式開機時使用。
  2. /dev/sdx2: 至少 1G 或 2G, 多版 linux 共用的 boot 分割, 用來安裝 extlinux, 及很多個版本的 vmlinuz 與 initrd.img 。
  3. /dev/sdx3、 /dev/sdx4、 ...: 幾個 20G 左右的 ext4 (有必要的話甚至也可以格式化成為 ext3 或 ext2) 分割, 為防萬一, 要讓很舊版本的 linux 也可以安裝、 開機。
  4. 剩下全部空間分給一很大個 lvm 分割。 各個較新版本的 linux 在裡面各佔一個 logical volume。 另外也可以有一個或數個 logical volume 用來放置 live CD 的 root.squashfs -- 但這還需要搭配 以 live-media 選項指定它位於哪個 logical volume

再來指定要從哪個分割區開機, 並且安裝 extlinux:

  1. ls -l /usr/lib/syslinux/mbr/gptmbr.bin 確認一下檔案只有 440 bytes 大小, 然後安裝 gptmbr: dd </usr/lib/syslinux/mbr/gptmbr.bin > /dev/sdx (注意: sdx 後面沒有數字)
  2. 假設硬碟已切成 6 個分割區, 而 extlinux 即將裝在 /dev/sdx2。 先用 sgdisk /dev/sdx --attributes=2:set:2 設定第二分割區可以開機。 set 之前的 2 是分割區代號; set 之後的 2 是固定不變的 「開機屬性欄位代號」。 意思跟以前的 fdisk 裡面的 "a" (active) 指令一樣。 再用 for i in 1 2 3 4 5 6 ; do sgdisk /dev/sdx --attributes=$i:show ; done 確認只有 /dev/sdx2 可以開機。
  3. 掛載 /dev/sdx2、 把 /usr/lib/syslinux 複製過去, 用 extlinux -i /掛載點/syslinux 安裝 syslinux。

以上主要參考 archlinux 文件gentoo 文件。 對照一下更清楚: 我寫的 mbootuz.py 只支援 mbr 硬碟; 以上三個動作作用於 gpt 硬碟, 就相當於 mbootuz.py mkboot /dev/sdx 作用於 mbr 硬碟。

快拿一顆空的大容量硬碟來玩玩看吧! 對了, 如果要用 kvm 虛擬機 測試的話, 每次動過硬碟之後, 卸載所有分割區還不夠, 可能還必須 partprobe /dev/sdx 把更底層的 cache 寫出去, 這樣虛擬機才會看得到最新的變化。 照著本文製作 gpt 開機硬碟/隨身碟, 如果失敗的話, 歡迎留言, 記得要貼貼畫面截圖的網址或錯誤訊息文字。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。