Skip to content

Instantly share code, notes, and snippets.

@brlin-tw
Created November 20, 2016 23:39
Show Gist options
  • Save brlin-tw/0fe11c6ebf2af585cbcd7940f404c7cf to your computer and use it in GitHub Desktop.
Save brlin-tw/0fe11c6ebf2af585cbcd7940f404c7cf to your computer and use it in GitHub Desktop.
# UEFI 開機模式之可開機可移除式媒體研究<br>Bootable Removable Media Research under UEFI Boot Mode
## 本作品採用之智慧財產授權條款<br>License
本作品採用 Creative Commons 姓名標示 - 相同方式分享授權條款第 4.0 版或其任意更近期版本釋出供任何人在授權範圍內自由使用。
授權範圍外之使用請先來信取得授權。
## UEFI 規範研究
## 美好的想像
底下我們先單純以對 UEFI 規範的理解來模擬該進行的操作
### 磁碟分割方式<br>Disk Partition Method
#### 磁碟分割表的選用<br>Choices of Disk Partition Table
* &lt; 2.2TiB 的磁碟分割表可選用 IBM PC-XT 相容磁碟分割表(其他稱謂:Master Boot Record(MBR)、MS-DOS)或 GUID 磁碟分割表
* &gt; 2.2TiB 的磁碟因為定址超過傳統 IBM PC-XT 相容磁碟分割表支援範圍的原因只能使用 GUID 磁碟分割表(GPT)
#### 切蛋糕<br>Partitioning
##### IBM PC-XT 相容磁碟分割表
```bash
# parted --script 〈磁碟路徑〉 -- \
mklabel msdos \
mkpart primary fat16 4MiB 104MiB \
set 1 esp on \
mkpart primary ext2 1MiB 4MiB \
mkpart primary fat16 104MiB 204MiB \
mkpart primary ext2 204MiB -1s
# parted --script 〈磁碟路徑〉\
unit MiB \
print
型號:JetFlash Transcend 64GB (scsi)
磁碟 〈磁碟路徑〉:60240MiB
磁區大小 (邏輯/物理):512B/512B
分割區:msdos
磁碟旗標:
編號 起始點 結束點 大小 類型 檔案系統 旗標
2 1.00MiB 4.00MiB 3.00MiB primary ext2 lba
1 4.00MiB 104MiB 100MiB primary fat16 lba, esp
3 104MiB 204MiB 100MiB primary fat16 lba
4 204MiB 60240MiB 60036MiB primary ext2 lba
```
1. 第一個 `parted` 命令中的 `--` 為使得後面的 `-1s` 不被解釋為命令列選項(command-line option) 之用,詳情請參考 GNU Parted 的使用手冊
1. 0MiB~1.00MiB 為 Master Boot Record(MBR) 、GRUB 在 IBM PC 相容平台開機載入程式(boot loader)所需要的,用來安裝第二階段開機程式的,Master Boot Record 後與(定址先後順序上的)第一個分區的**間隙**(post-MBR gap)
1. 1.00MiB~4.00MiB 為(定址先後順序上的)第一個分區,由於 flash 記憶體的抹除區塊電路設計與磁盤式硬碟的物理磁區大小的原因我們必須將其他分區對齊 4MiB(這是不同類型磁碟區塊大小的公倍數)單位的邊界才不會對效能與記憶體壽命造成負面影響,此分區可作為特殊小空間用途使用(例如寫入擁有者資訊與聯絡方式)
* 作為 Microsoft Windows 作業系統**只**支援存取外接式磁碟第一分區的迴避問題措施,本分區不設為 MBR 的第一分區
* 磁碟分割表操作工具警告分區邊界無最佳化為正常現象,因為這個區域本來就沒對齊。
1. 4MiB~104MiB 為 Microsoft Windows 作業系統唯一原生可直接存取的分區,裡面可以放 EXT 檔案系統的存取支援軟體
1. 104MiB~204MiB 為 UEFI 系統分區,用來放 UEFI 開機模式下的開機載入程式(boot loader)與 UEFi 應用軟體
* 需用支援的磁碟分割表操作工具將分區類型改為 EFI 系統分區(編號:0xef)
1. 204MiB~磁碟末端為 */Linux 作業系統以及您檔案主要的存放空間
##### GUID 磁碟分割表
## 安裝作業系統<br>Operating System Installation
### 使用作業系統的安裝程式安裝<br>Installation Using Operating System's Installer
#### Ubuntu 作業系統散佈版本<br>Ubuntu OS Distribution
直至目前撰文為止(2016/10/2),Ubuntu 所使用的 「Ubiquity 作業系統安裝程式」並不正確支援 UEFI 開機模式下安裝到可移除式(removable)磁碟的安裝方式,請在:
* 安裝 GRUB 的畫面中選擇該磁碟「整個裝置」的裝置檔案安裝(此步驟為安裝 IBM PC 相容開機模式的開機程式,**與 UEFI 開機模式無關**)
* 作業系統安裝完成後安裝程式會在 UEFI 韌體中寫入 Ubuntu 的開機選項,**這是錯誤的設定**(UEFI 開機模式下可開機可移除式磁碟並不會寫入任何開機選項),您可使用 `efibootmgr` 命令或是 UEFI 韌體的設定界面將該錯誤的開機選項移除。
### 使用 Debootstrap + Chroot 來安裝<br>Installation Using Debootstrap & Chroot
#### 已知問題<br>Known issues
Debootstrap 似乎在含空格的路徑下會執行失敗,此問題可以用 bind mountpoint 迴避
#### (相對於使用作業系統安裝程式)需要設定的項目<br>(Relative Than Using Operating System's Installer) Required Additional Settings
* 檔案系統掛載設定(/etc/fstab)
* 根目錄檔案系統(/)
* EFI 系統分區(/boot/efi)
* 目錄不存在要自己建
* 主記憶體分頁置換空間(選用)
* 主機名稱(/etc/hosts、/etc/hostname)
* /etc/apt/sources.list(Debootstrap 只會用 main 不會用 security 跟 updates 軟體來源)
* 語系設定(`/etc/default/locale`、`# dpkg-reconfigure locales`)
* 使用者設定(`adduser`、`usermod`)
## 安裝 Linux 作業系統核心<br>Install Linux Operating System Kernel
1. 安裝 linux-signed-generic 軟體包
## 安裝桌面版軟體<br>Install Desktop Edition Softwares
1. *-desktop 軟體包
## 安裝開機載入程式<br>Install Boot Loader
### Ubuntu 作業系統散佈版本<br>Ubuntu Operating System Distribution
1. 安裝 grub-efi-amd64、grub-efi-amd64-signed、grub-pc-bin 軟體包
1. 以 root 身份執行 `grub-install --uefi-secure-boot --removable --verbose` 命令安裝 UEFI 開機模式的 GRUB 開機載入程式
1. 以 root 身份執行 `grub-install --target=i386-pc --verbose 〈外接磁碟的區塊裝置檔案〉` 命令安裝 IBM PC 相容開機模式的 GRUB 開機載入程式
1. 以 root 身份執行 `update-grub` 命令重新產生 GRUB 設定檔
## 殘酷的現實
## 已知問題<br>Known Issues
### 華碩 S550CB 偵測不到 UEFI 開機模式開機選項
#### 原因
不遵從 UEFI 規範:它們偵測到(定址先後順序上的)第一個分區非 FAT 檔案系統或 EFI 系統分區時就將磁碟視為不可開機
#### 問題排解方式
將系統分區移動到 MBR 第一順位
### Microsoft Windows 作業系統僅能識別與掛載外接式磁碟 MBR 第一順位的分區
## 問題解決方案<br>Solution of Problems
## 參考資料<br>Reference
* [Using Compact Flash cards as SSD alternative](http://www.daniel-boehmer.de/thinkpad-cf/)
* [Flash memory [OpenWrt Wiki]](http://wiki.openwrt.org/doc/techref/flash)
* [Optimizing Linux with cheap flash drives [LWN.net]](http://lwn.net/Articles/428584/)
* UEFI 規範<br>UEFI Spec
* Protocols — Media Access/File System Format/System Partition/Directory Structure
* Boot Manager/Boot Mechanisms/Boot via the Simple File Protocol/Removable Media Boot Behavior
* 12.3.3 Number and Location of System Partitions
* 12.3.4.1 Removable Media
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment