OpenBSDをVMwareにUEFIでインストールする

# OpenBSDとVMware
OpenBSDとVMware、関係者のお力により、相性いいと思います。[vmt(4)](https://man.openbsd.org/vmt.4)、[vmx(4)](https://man.openbsd.org/vmx.4)などもありますし。
いつもISOイメージからインストールしていたが、UEFIでは起動しないのが気になってたのを思い出す。
再インストールの前に、少し調査。

# 環境
- OpenBSD 7.1
- ESXi 7.0U3f

# 調査
## ISO9660からUEFI起動
ISO9660で起動、と言えば、El Toritoの記憶。から検索した。
[こちら](https://wiki.osdev.org/El-Torito)や[こちら](https://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0079)によると、ISO9660の仕様上、複数のブートイメージを用意することで、UEFIからの起動はできるらしい。
[こちら](https://communities.vmware.com/t5/VMware-Workstation-Pro/UEFI-workstation-firmware-and-badly-written-by-me-el-torito/td-p/1314187)を見ると、UEFIの仕様で、El ToritoのPlatform IDをどうするかなども決められているらしい。
OpenBSDのisoイメージは、そうなっていないのかな(未調査)。

## OpenBSDのUEFI実装状況
[こちら](http://fuguita.org/index.php?EBUG%CA%D9%B6%AF%B2%F1%2F20190223_UEFI_GPT#k481c6c6)によると、OpenBSDではUEFI実装は完了しているらしい。
[こちら](https://poad1010.hatenablog.com/entry/20190112/1547257276)を見ると、installXX.fsはddのイメージらしい。OpenBSD 7.1では、install71.imgというファイル名となっていた。このイメージからはUEFIで起動できそうだ。

# 作戦
install71.imgから起動する作戦とする。
当初、インストーラーのddイメージを[`qemu-img convert`](https://docs.openstack.org/ja/image-guide/convert-images.html)でvmdkに変換してみたが、起動せず。
さらに調べると、[こちら](https://communities.vmware.com/t5/ESXi-Discussions/Convert-dd-Image-SAS-Windows-to-ESXi6-VMDK/td-p/457863)には、
> Did you create that image with dd using a command like:
> dd if=/dev/sda of=diskimage.dd bs=1M
> ?
> If yes then you actually already have a valid flat.vmdk file without descriptor.

とある。えっ、〜-flat.vmdkは、ddイメージ相当ということ?
[こちら](http://blog.y2ji.co.jp/archives/51782949.html)にも同様のことが書かれている。
ただ、〜-flat.vmdkは、〜.vmdkとセットで使うもの。〜.vmdkは何を書けば?

# vmdkファイルの作成
〜-flat.vmdkのみが存在する状況から、〜.vmdkを作る方法は、そのものズバリの情報が[本家KB](https://kb.vmware.com/s/article/1002511?lang=ja)にあるため、これに従っていく。今回は、直接ESXiにsshする。

1. install71.imgを、install71-flat.vmdkという名前でdatastoreにアップロード
1. `ls -l install71-flat.vmdk`でサイズを取得
1. `vmkfstools -c サイズ -d thin temp.vmdk`でThin provisioningで空のイメージを作成。すると、temp.vmdkとtemp-flat.vmdkの両方が一瞬で作られる(Thinなので)
1. `rm -i temp-flat.vmdk`でイメージを削除
1. `mv temp.vmdk install71.vmdk`で、vmdkファイルをinstall71-flat.vmdkにあてがう
1. `vi install71.vmdk`で編集

〜.vmdkの編集は、

- 〜-flat.vmdkのファイル名を合わせる
- `ddb.thinProvisioned = "1"`の行を削除(install71.imgはThin provisioningのイメージではないので)
- `ddb.adapterType`を`"pvscsi"`にする(vmx側をそうしていたので)

これだけ、簡単。あとは、VMの設定で、

- 既存のハードディスクを追加、で、先程のvmdkを追加(インストール先とは別に)
- UEFIセキュアブートの有効化、をオフ
- 強制的にBIOSセットアップ、をオン

にして、VM起動後に、BIOSメニューから、追加したvmdk側のハードディスクから起動。

# これで勝ったと思うなよ！
インストーラーも起動したし、めでたしめでたし! とはならずオチが付くのが当方。
インストールの最終工程で、エラー発生。

```
installboot: invalid boot record signature (0x0000) @ sector 0

Failed to install bootblocks.
You will not be able to boot OpenBSD from sd0.
```

ESPが無いのだろうな…

何も書かれていないディスクの場合、インストール先のディスクを選択後、

```
No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [gpt]
```

と表示されるので、おっUEFI起動を認識してくれてGPTをデフォルトで選択してくれているんだ、と思い、安心してデフォルトを選択するとダメ、`g`を入力してもダメ、`e`でEditすると、GPTではなくMBRのUIとなる…のは幻か?

やむを得ず、[fdisk(8)の-gオプション](https://man.openbsd.org/fdisk#g)にあるdefault GPTを、あらかじめ書く。
インストーラー起動後の`(I)nstall, (U)pgade, (A)utoinstall or (S)hell?`で、`s`でshellに落ちた後、[本家FAQ](https://www.openbsd.org/faq/faq14.html)あたりを見ながら、

```ksh
cd /dev && sh MAKEDEV sd0
fdisk -gy -b 960 sd0
```

してから、`exit`してインストーラーに戻り、`i`でインストールを続けると、ラベルiにMSDOSが現れ、最後に`CONGRATURATIONS!`

# オチのオチ
[こちら](https://poad1010.hatenablog.com/entry/20190112/1547257276)のように、作成した仮想ディスクに対し、ゲストOSからddで書き込めば、VirtualBoxだろうが何だろうが起動できて汎用性あっていいですね…あはは…

# 感想
- [本家FAQ](https://www.openbsd.org/faq/faq14.html)及びインストーラーのデフォルトのGPTパーティショニングだと、ESPは448KiBしか用意しない?
    - `mount -r sd0i /mnt`して`du /mnt`すると、BOOTIA32.EFIとBOOTX64.EFIでで300KiB弱、十分ということか
- みんなどうしているんだろう…BIOS+MBR? UEFI+MBR?
    - [こちら](https://twitter.com/yoshi_kaw/status/1081253723962105861?s=20&t=KX-JLZoTak9frLxA2aBAMA)によると、UEFI+MBRで起動するかも?
- [vmx(4)](https://man.openbsd.org/vmx.4)もUEFI対応も、日本の方が対応されたのですね…ご活躍すごい。
- UEFI起動時のフォントちょっとかっくいい

# 今後
- 調べるほど歴史が出てくる、起動周辺のお勉強
    - El Torito仕様
    - xorrisofs
- OpenBSDインストーラー実装の調査(空ディスクに自動でESPが作られない件)
- 脱線
    - PVSCSI Storage Performance
    - `FreeBSD 11 より前のバージョン (32 ビット)`と認識される件

# 追記
- (2024年5月)改めて[本家FAQ](https://www.openbsd.org/faq/faq14.html)を見たら、`fdisk -gy -b 532480 sd0`となっており、ESPのサイズが532480ブロック=260MiBになっていた。OpenBSD 7.5のインストーラーでも260MiBが確保された。昔ちっちゃくつくっちゃった私、どうなっちゃうんだろ…