Twitterでのこのtweetがきっかけ。
このやりとりが発端となり、河豚板のUEFI対応を開始する。
OpenBSDの場合に現状で考えられる起動方法とパーティショニングのパターンを以下に示す。
UEFI登場以前から用いられてきた方法 (参考)
起動にUEFI、ディスクパーテショニングにGPTを用いるパターン
となっている。
UEFIとしてEFIアプリケーションがロードされるが、パーテショニングとしてMBRが使われるパターン。GPTは存在しない。
amd64のインストールメディアやarm64で使われている。
amd64のインストールメディアとarm64とでは細かい箇所で異なっている部分がある(右図はarm64)。
MBRとGPTの両方に同じパーテショニング情報を書込み、ブートローダもLegacy BIOS, UEFI共にセットアップしたもの。
2015年に安岡昌彦氏によりカーネルにUEFI対応の機能が実装された。
現在では、インストーラ含め、関連ユティリティがUEFI/GPTに対応している。
前述のように、Legacy BIOS、UEFIのいずれからでも起動可。
Legacy BIOS、UEFIのどちらで起動したかによって、パーティショニングのデフォルトも変わる。
UEFIで起動した場合
Available disks are: wd0 wd1.
Which disk is the root disk? ('?' for details) [wd0] wd1
No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [gpt] ←インストーラをUEFIで起動した
Setting OpenBSD GPT partition to whole wd1...done. ので、GPTがデフォルト
The auto-allocated layout for wd1 is:
# size offset fstype [fsize bsize cpg]
a: 819776.0K 1024 4.2BSD 2048 16384 1 # /
b: 83090.0K 1640576 swap
c: 2097152.0K 0 unused
d: 930704.0K 1806784 4.2BSD 2048 16384 1 # /usr
e: 263024.0K 3668192 4.2BSD 2048 16384 1 # /home
i: 480.0K 64 MSDOS ←EFI Sys領域
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]
Legacy BIOSで起動した場合
Available disks are: wd0 wd1.
Which disk is the root disk? ('?' for details) [wd0] wd1
No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole] ←MBRがデフォルト
Setting OpenBSD MBR partition to whole wd1...done.
The auto-allocated layout for wd1 is:
# size offset fstype [fsize bsize cpg]
a: 800.6M 64 4.2BSD 2048 16384 1 # /
b: 81.1M 1639616 swap
c: 2048.0M 0 unused
d: 908.9M 1805824 4.2BSD 2048 16384 1 # /usr
e: 256.9M 3667232 4.2BSD 2048 16384 1 # /home
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]
パーティションのメンテナンスツールfdisk(8)は、パーティションの初期化時にオプションによってMBRかGPTかを指定する。
MBRで初期化
# fdisk -i wd1
Do you wish to write new MBR and partition table? [n] y
Writing MBR at offset 0.
# fdisk wd1
Disk: wd1 geometry: 520/128/63 [4194304 Sectors]
Offset: 0 Signature: 0xAA55
Starting Ending LBA Info:
#: id C H S - C H S [ start: size ]
-------------------------------------------------------------------------------
0: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
*3: A6 0 1 2 - 519 127 63 [ 64: 4193216 ] OpenBSD
GPTで初期化
# fdisk -i -g wd1
Do you wish to write new GPT? [n] y
Writing MBR at offset 0.
Writing GPT.
# fdisk wd1
Disk: wd1 Usable LBA: 64 to 4194240 [4194304 Sectors]
#: type [ start: size ]
------------------------------------------------------------------------
3: OpenBSD [ 64: 4194177 ]
パーティションの詳細を見る
↓
# fdisk -v wd1
Primary GPT:
Disk: wd1 Usable LBA: 64 to 4194240 [4194304 Sectors]
GUID: 09d92128-d884-40f8-9e17-a606721cd8c7
#: type [ start: size ]
guid name
------------------------------------------------------------------------
3: OpenBSD [ 64: 4194177 ]
376b4152-9c45-4d7a-8392-5f0f3e015d51 OpenBSD Area
Secondary GPT:
Disk: wd1 Usable LBA: 64 to 4194240 [4194304 Sectors]
GUID: 09d92128-d884-40f8-9e17-a606721cd8c7
#: type [ start: size ]
guid name
------------------------------------------------------------------------
3: OpenBSD [ 64: 4194177 ]
376b4152-9c45-4d7a-8392-5f0f3e015d51 OpenBSD Area
MBR:
Disk: wd1 geometry: 520/128/63 [4194304 Sectors]
Offset: 0 Signature: 0xAA55
Starting Ending LBA Info:
#: id C H S - C H S [ start: size ]
---------------------------------------------------------------------------
0: EE 0 0 2 - 532610 4 4 [ 1: 4294967295 ] EFI GPT
1: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
2: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
3: 00 0 0 0 - 0 0 0 [ 0: 0 ] unused
#
OpenBSDでは、ブートローダの書込みにinstallboot(8)を使用する。
# mount /dev/wd1a /mnt
# installboot -r /mnt wd1 /usr/mdec/biosboot /usr/mdec/boot
↑ ↑
PBR secondary loader
# umount /mnt# installboot wd1
usbfadm (USB Flashdrive ADMinistration tool) - 河豚板付属のUSBメモリ管理ツール
実際はUSBメモリに限らず、ストレージデバイス全般で使用可
用途
UEFI/GPT対応として、newdriveコマンドに
河豚板のパーティション構成
Hybrid MBRを用い、かつパーティションを全て作成する場合、右図のようになる。
#img(): File not found:「プラットフォーム毎の対応表」を見るとわかるように、ブート方法、及びパーティションテーブルの選択肢はプラットフォーム毎に変わってくる。例えばi386ではUEFIが、arm64ではLegacy BIOSを選択できてもOSが対応していないため、意味がない。
さらに、ユーザが「データ保存のみ」を選択した場合はブートローダが不要となる。以上より選択の組合せは以下のようになる。
| Legacy BIOS | UEFI | Hybrid | non-boot (data only) | |
| MBR | i386, amd64 | amd64, arm64 | N/A | all |
| GPT | N/A | amd64, arm64 | N/A | all |
| Hybrid | N/A | N/A | amd64 | all |
| プラットフォーム毎の対応表 | ||||
この複雑さを緩和するため、今回の改修では/usr/fugutia/etc/usbfadm.confというファイルを新設した。
例えば、i386の場合、このファイルに
disable_uefiboot=Yes
などと記述することで、UEFI起動を選択肢からはずせるようにした。 一方arm64の場合、Legacy BIOSでは起動できないので、
disable_legacyboot=Yes
となる。
またarm64の場合は以下の理由から、さらなる処理が必要となる。
OpenBSDでのUEFI実装で説明したように、OpenBSDのfdiskコマンドにはディスクをMBR、GPTそれぞれのパーティションで初期化する機能を持っているが、MBRとGPTを同時に作成しHybrid MBRとする機能は持っていない。
今回のUEFI対応では、以下のような方法でHybrid MBRを実装した。
開発の初期段階では、プロセッサエミュレータQEMUを用いて開発を行った。
QEMUは、デフォルトではLegacy BIOS (SMBIOS)として動作する。
UEFI起動を行うためには、-biosオプションでOVMF (Open Virtural Machine Firmware)を指定する。
Legacy BIOS起動
# qemu-system-x86_64 -m 512 -hda install64.fs -hdb testhdd.img
UEFI起動
# qemu-system-x86_64 -m 512 -hda install64.fs -hdb testhdd.img -bios OVMF.fd
パーティション操作を行う対象となるディスクイメージファイルはrawイメージとした。
これにより、vnconfig(8)を用いてvnodeデバイスのディスクとして実環境でも扱えるようになった。
usbfadmが一通り動作するようになってからはプラットフォーム依存部分を開発・動作確認したり、河豚板のリリースに組込む必要があるため、実ハードウェアにて開発を行った。
手順は概ね以下のとおり;