河豚板のUEFI/GPT対応 †発端 †Twitterでのこのtweetがきっかけ。 このやりとりが発端となり、河豚板のUEFI対応を開始する。 UEFIとGPT †
OpenBSDの場合に現状で考えられる起動方法とパーティショニングのパターンを以下に示す。 Legacy BIOS / MBR †UEFI登場以前から用いられてきた方法 (参考)
UEFI / GPT †起動にUEFI、ディスクパーテショニングにGPTを用いるパターン
UEFI / MBR †UEFIとしてEFIアプリケーションがロードされるが、パーテショニングとしてMBRが使われるパターン。GPTは存在しない。 amd64のインストールメディアとarm64とでは細かい箇所で異なっている部分がある(右図はarm64)。
Hybrid MBR †MBRとGPTの両方に同じパーテショニング情報を書込み、ブートローダもLegacy BIOS, UEFI共にセットアップしたもの。
OpenBSDでの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 †パーティションのメンテナンスツール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 # installboot †OpenBSDでは、ブートローダの書込みにinstallboot(8)を使用する。
河豚板での実装 †配布物 †
usbfadm †usbfadm (USB Flashdrive ADMinistration tool) - 河豚板付属のUSBメモリ管理ツール 用途
UEFI/GPT対応として、newdriveコマンドに
河豚板のパーティション構成
Hybrid MBRを用い、かつパーティションを全て作成する場合、右図のようになる。 プラットフォーム依存部 - 組み合わせとデフォルト †「プラットフォーム毎の対応表」を見るとわかるように、ブート方法、及びパーティションテーブルの選択肢はプラットフォーム毎に変わってくる。例えばi386ではUEFIが、arm64ではLegacy BIOSを選択できてもOSが対応していないため、意味がない。
この複雑さを緩和するため、今回の改修では/usr/fugutia/etc/usbfadm.confというファイルを新設した。 disable_uefiboot=Yes などと記述することで、UEFI起動を選択肢からはずせるようにした。 一方arm64の場合、Legacy BIOSでは起動できないので、 disable_legacyboot=Yes となる。 またarm64の場合は以下の理由から、さらなる処理が必要となる。
Hybrid MBRの作成 †OpenBSDでのUEFI実装で説明したように、OpenBSDのfdiskコマンドにはディスクをMBR、GPTそれぞれのパーティションで初期化する機能を持っているが、MBRとGPTを同時に作成しHybrid MBRとする機能は持っていない。 今回のUEFI対応では、以下のような方法でHybrid MBRを実装した。
開発環境 †初期 †開発の初期段階では、プロセッサエミュレータQEMUを用いて開発を行った。
QEMUは、デフォルトではLegacy BIOS (SMBIOS)として動作する。 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イメージとした。 中期以降 †usbfadmが一通り動作するようになってからはプラットフォーム依存部分を開発・動作確認したり、河豚板のリリースに組込む必要があるため、実ハードウェアにて開発を行った。 手順は概ね以下のとおり;
その他諸々 †OVMFの不具合(?) †開発当初、OVMFを使ってQEMUを起動したところ不具合が発生。
何回か試行を行っていたところ正常に起動し、その後現象の再発なし。結局原因は不明 installbootの不具合 †installbootは、EFIアプリケーションのインストールに失敗する。 # installboot -v -r /mnt vnd0 /fuguita/usr/mdec/biosboot /fuguita/usr/mdec/boot Using /mnt as root installing bootstrap on /dev/rvnd0c using first-stage /fuguita/usr/mdec/biosboot, second-stage /fuguita/usr/mdec/boot newfs_msdos: /dev/rdfe15236c496b5df.i: No such file or directory ←デバイスの指定がDUIDで行われている installboot: unable to mount EFI System partition: No such file or directory newfs_msdosによりEFI Sysのパーティションをフォーマットする段階で、なぜかデバイス名の指定でDUIDが使われるが、ここでコマンドが異常終了するため、処理が正常に完了しない。 UEFIのセットアップはEFI SysのパーティションをFATでフォーマットし、その中にディレトクトリを掘ってEFIアプリケーションを/usr/mdecからこのディレクトリにコピーするだけなので、installbootが失敗した場合に上記処理を行うworkaroundコードを追加した。 |