#topicpath
* 河豚板のUEFI/GPT対応 [#td0364db]
RIGHT:EBUG 第68回会合 ~
2019年2月23日、(有)銀座堂 ~
川俣吉広、kaw@on.rim.or.jp

**発端 [#q0089df3]
Twitterでの[[このtweet>https://twitter.com/ao_kenji/status/1073836123934183424]]がきっかけ。

このやりとりが発端となり、[[河豚板のUEFI対応>https://twitter.com/yoshi_kaw/status/1074110733577637888]]を開始する。

**UEFIとGPT [#a6e0bc70]
:UEFI (Unified Extensible Firmware Interface)|OSとファームウェアとの間のソフトウェアインタフェースを定義する仕様([[Wikipedia>https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface]])~
従来のBIOS (Legacy BIOS)による起動方法からの置換えを意図している。~
・UEFI用のパーティション(ファイルシステムとしてはFAT)を持つ。~
・そのパーティション内に起動用の実行バイナリが格納されている。このバイナリファイルは*.EFIの拡張子を持ち、UEFIアプリケーションと呼ばれる。

:GPT (GUID (Globally Unique Identifier) Partition Table)|ストレージデバイス上のパーティションテーブルの配置に関する標準規格([[Wikipedia>https://ja.wikipedia.org/wiki/GUID%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB]])~
Legacy BIOSで用いられてきたMBR (Master Boot Record)に替わるものとしてUEFIの一部として定義されている。~
・MBRが扱えるのは最大2TBのディスクを4区画まで~
・GPTでは最大8ZBを128区画までパーティショニング可能

OpenBSDの場合に現状で考えられる起動方法とパーティショニングのパターンを以下に示す。

***Legacy BIOS / MBR [[(参考)>http://caspar.hazymoon.jp/OpenBSD/]] [#r1743fb3]
#ref(MBR2.png,wrap,around,right,,50%)
UEFI登場以前から用いられてきた方法

-ハードウェア上のファームウェアがHDDのセクタ0にあるMBRブートコードを実行する。

-MBRブートコードは、ブートフラグがONになっているパーティションの先頭セクタにあるPBR (Partition Boot Record)に実行を移す。
--OpenBSDでは、PBRは/usr/mdec/biosbootが用いられる。

-PBRはOpenBSDのルートファイルシステム上にある/bootを実行する。
--この/bootが「boot>」プロンプトを表示し、カーネル起動に関するユーザからの指定を受け付ける。

-bootは指定にしたがって、該当するカーネルを起動する。

-なお、OpenBSD用と設定された区画(右図の例ではentry 3)は、同時にdisklabelユティリティによる管理範囲(OpenBSD Area)として設定される。
OpenBSD Areaの中にdisklabelによるBSDパーティションが作成され、ファイルシステムやスワップ領域として使われる(参考:[[他のBSDユーザのためのOpenBSD管理入門>http://fuguita.org/index.php?EBUG%CA%D9%B6%AF%B2%F1%2F20171118_OpenBSD%B4%C9%CD%FD%C6%FE%CC%E7#lde54a06]])。
#img(,clear)

***UEFI / GPT [#bd88fd91]
#ref(GPT2.png,wrap,around,right,,50%)
起動にUEFI、ディスクパーテショニングにGPTを用いるパターン

-ハードウェア上のファームウェアがGPT内でGUID=xxxxxxxxx-xxxxxxxx-xxxxxxxxx-xxxxxxxxxxxxxxx (EFI Sys)となっているパーティションを探し、この中に \efi\BOOT\BOOT*.EFIという実行ファイル(EFIアプリケーション)があれば実行する。~
このファイル名は、
--i386ではBOOTIA32.EFI
--amd64はBOOTX64.EFI
--arm64はBOOTAA64.EFI

>となっている。

-OpenBSDのEFIアプリケーションは、「boot>」プロンプトを表示し、カーネル起動に関するユーザからの指定を受け付ける。~
これは、MBR起動の場合の/bootに相当する。

-EFIアプリケーションは指定にしたがって、該当するカーネルを起動する。

-なお、GPTの場合にも先頭セクタの部分に、従来のMBRとの互換性を考慮してprotective MBR (保護MBR)というものが書き込まれている。これはfdiskなどのMBRを扱うユティリティが誤ってMBRを書き換えないようにするためのものである。

-OpenBSD Area内の管理については、MBRの場合と同じ。
#img(,clear)

***UEFI / MBR [#ffe7005b]
#ref(ARM64.png,wrap,around,right,,50%)
UEFIとしてEFIアプリケーションがロードされるが、パーテショニングとしてMBRが使われるパターン。GPTは存在しない。~
amd64のインストールメディアやarm64で使われている。

amd64のインストールメディアとarm64とでは細かい箇所で異なっている部分がある(右図はarm64)。

-arm64ではUEFI用のパーティションIDは0C (FAT32L)、amd64インストーラではEF (EFI Sys)。

-arm64ではUEFI用のパーティション内にはU-BOOTも書き込まれている。

-amd64インストーラではMBR boot code、PBR、/bootもセットアップされる。
#img(,clear)

***Hybrid MBR [#d8c49092]
#ref(Hyb2.png,wrap,around,right,,50%)
MBRとGPTの両方に同じパーテショニング情報を書込み、ブートローダもLegacy BIOS, UEFI共にセットアップしたもの。

-非標準。規格上は定義されていない方法。

-MBRとGPTとを同時に変更するツールが現状ではないため、パーテショニングを後で変更することが困難。
#img(,clear)

**OpenBSDでのUEFI実装 [#k481c6c6]
2015年にIIJの安岡さんにより[[実装された>https://marc.info/?l=openbsd-cvs&m=144115942223734&w=2]]。

***fdisk [#qb5830d2]
***installboot [#i0c2305e]
**河豚板での実装 [#p656b6cc]
***usbfadm [#y8bbf7e2]

----
#topicpath
Top Index Search Recent Backups  Help  RSS