#author("2024-05-24T07:45:43+09:00","default:kaw","kaw")
#author("2024-05-24T07:46:06+09:00","default:kaw","kaw")
#topicpath
*河豚板のEFI CD boot / arm64 ISO 対応 [#v80a10cd]
RIGHT:EBUG 第89回会合 2024年5月25日 ~
川俣吉広、kaw@on.rim.or.jp

**概要 [#ra602256]
2024年4月5日にリリースされたOpenBSD 7.5では、amd64プラットフォームでEFIでのCD起動が、arm64プラットフォームでは、ISOイメージによる起動がサポートされました。

この二つの新機能を河豚板 7.5でも実装した方法について報告します。
----
目次
#contents

**経緯 [#r1d0fa9a]
2024年4月5日にリリースされたOpenBSD 7.5では、ライブ・システムに適用可能と思われる2つの機能が追加された。

[[OpenBSD 7.5 what's new>https://www.openbsd.org/75.html]]

-amd64のISOイメージがUEFIで起動できるように[[mkhybrid>man:mkhybrid.8]]が改修された。
 - Various bugfixes and tweaks in userland:
  ...
  - Added mkhybrid(8) '-e' (-eltorito-boot-efi) option for writing an EFI eltorito boot image, in addition to or instead of the x86 boot image, to the output file.
  ...
 - Installer, upgrade and bootloader improvements:
  ...
  - Make the amd64 cdXX.iso and installXX.iso CD images bootable in EFI mode (by creating an EFI system partition containing the EFI boot loaders to be installed as an El Torito boot image).
 
-arm64がISOイメージをサポート
 - Installer, upgrade and bootloader improvements:
   ...
   - Added CD install images to arm64.

**おさらい [#n3473446]

***LiveDVDとLiveUSBのパーティション構成 [#u37c5d18]

-LiveDVDの/dev/cd0aとLiveUSBの/dev/sd0aの内容は全く同じ

--LiveDVD⇔LiveUSBのリマスタリングを容易にできるようにするため

--そのためLiveDVDとLiveUSBのブート関連ファイルが全部入っている

--起動関連や各種ユティリティのスクリプトもLiveDVDとLiveUSBで共通に使える

|CENTER:|c
|&ref(EBUG勉強会/20240217_BuildFuguIta/fipart.png,,33%);|
|パーティション構成: /sysmedia部分はLiveDVD/LiveUSBで共通|

***ビルドフロー (i386/amd64) [#o00e05e6]

-ブートローダ関連、カーネル+[[ramdisk root>man:rd.4]]、システムのファイルツリーイメージという各コンポーネントをsysmediaというディレクトリに集約した上で、ISOイメージを生成

-出来上がったISOイメージを実機、あるいは仮想環境で実行させ、その上で[[usbfadm>github_boottmp:usbfadm]]ユティリティのnewdrive機能を使用してLiveUSB用のディスクイメージを生成する

-LiveUSBのディスクイメージ生成時に、MBR/GPT、LegacyBIOS/UEFI、スワップ/ユーザファイル保存領域/FATの有無とそのサイズ、ユーザファイル保存領域の暗号化の有無、などを指定する

|CENTER:|c
|&ref(EBUG勉強会/20240217_BuildFuguIta/fiflow.png,,25%);|
|ビルドフロー: 各コンポーネントを/sysmediaに集約して生成|

**amd64のUEFI CD boot [#ie79d37f]
OpenBSDのリポジトリで、どこが変っているか見てみる:

***OpenBSDリポジトリのコミットメッセージ [#d17eba65]
[[/usr/src/distrib/amd64/iso/Makefile>https://cvsweb.openbsd.org/src/distrib/amd64/iso/Makefile?rev=1.47&content-type=text/x-cvsweb-markup]]
 Revision 1.47 / (download) - annotate - [select for diffs], Fri Dec 15 06:03:00 2023 UTC (5 months ago) by jmatthew
 Branch: MAIN
 CVS Tags: OPENBSD_7_5_BASE, OPENBSD_7_5, HEAD
 Changes since 1.46: +15 -4 lines
 Diff to previous 1.46 (colored)
 
 For amd64 cdXX.iso and installXX.iso, create an EFI system partition image
 containing the EFI boot loaders and install it as an El Torito boot image,
 making the install CDs bootable in EFI mode.
 
 "looks great" deraadt@
 ok mlarkin@
変更部分(抜粋)
 -${CDROM}: ${BASE} ${XBASE}
 +${EFICDBOOT}: ${EFIBOOT}
 +	rm -rf ${.OBJDIR}/eficdboot-dir
 +	mkdir -p ${.OBJDIR}/eficdboot-dir/efi/boot
 +	cp ${EFIBOOT} ${.OBJDIR}/eficdboot-dir/efi/boot
 +	makefs -t msdos -o create_size=${EFICDBOOTSIZE} ${EFICDBOOT} \
 +	    ${.OBJDIR}/eficdboot-dir
 +
 +${CDROM}: ${BASE} ${XBASE} ${EFICDBOOT}
 (略)
         mkhybrid -a -R -T -L -l -d -D -N -o ${.OBJDIR}/${CDROM} \
             -A "OpenBSD ${OSREV} ${MACHINE} Install CD" \
 @@ -77,14 +87,15 @@
             -p "Theo de Raadt <deraadt@openbsd.org>" \
             -V "OpenBSD/${MACHINE}   ${OSREV} Install CD" \
             -b ${OSREV}/${MACHINE}/cdbr -c ${OSREV}/${MACHINE}/boot.catalog \
 +	    -e ${OSREV}/${MACHINE}/${EFICDBOOT} \
             ${.OBJDIR}/cd-dir

--ESP (EFI System Partition)に相当するFATパーティションイメージを作成し、mkhybridによるISOイメージ作成時に新たに新設された-eオプションで指定している。

***河豚板での対応 [#id259845]
これと同様な処理を河豚板の[[Makefile>github:Makefile]]に追加した(赤字部分)。
|CENTER:|c
|&ref(addeficdboot.png,,33%);|
|amd64ビルドフローの改修: ESPのイメージファイルを生成し、sysmediaにeficdbootとしてコピー|

加えて、リマスタリングの際も、この変更部分が反映されるようにする必要がある。~
リマスタリング時に/sysmediaからコピーするファイルの一覧にeficdbootを加える。~
→改修: [[remaster_dvd.sh>github_boottmp:remaster_dvd.sh]] (*→LiveDVD)、[[usbfadm>github_boottmp:usbfadm]] (*→LiveUSB)
|CENTER:|c
|&ref(fi-remaster_eficdboot.png,,25%);|
|リマスタリング対応: ESPのイメージファイルeficdbootも相互にコピーできるように改修|

**arm64のISOイメージ作成 [#q3a60449]
***arm64のビルドフロー [#x2e7b204]

i386/amd64とは異なる部分がある

-各コンポーネントを集約するのは、i386/amd64ではsysmediaというディレクトリだったが、arm64ではsysmedia.imgというディスクイメージファイルの中にあるaパーティション(LiveDVDの/dev/cd0a、LiveUSBの/dev/sd0aに相当)内で集約している

-arm64では、ISOイメージは今までサポートされておらず、LiveUSB用のディスクイメージを直接生成する必要があったため、このようなフローとなっている

-sysmedia.imgはあらかじめ用意しておく必要がある(いわゆる、「[[秘伝のタレ>EBUG勉強会/20240217_BuildFuguIta#m1e1e501]]」)

-arm64はsysmedia.imgのiパーティションにあるU-BOOTバイナリ、Raspberry Pi用ファームウェア、EFIアプリケーション(bootaa64.efi)を使用して起動するため、aパーティションにブートローダ関連のファイルは不要だが、i386/amd64との互換性のため、サイズ0のダミーファイルを[[touch>man:touch.1]]で生成するようになっている

|CENTER:|c
|&ref(fiflow_arm64.png,,33%);|
|arm64のビルドフロー: イメージファイル内のパーティションに各コンポーネントを集約|

***OpenBSDでの変更部分 [#w4adaaca]

-リポジトリのコミットメッセージ~
[[/usr/src/distrib/arm64/iso/Makefile>https://cvsweb.openbsd.org/src/distrib/arm64/iso/Makefile?rev=1.8&content-type=text/x-cvsweb-markup]]
 Revision 1.8, Thu Oct 26 14:27:01 2023 UTC (6 months, 3 weeks ago) by deraadt
 Branch: MAIN
 Changes since 1.7: +40 -3 lines
 
 construct EFI bootable cdXX.iso and instalXX.iso files
変更部分 (抜粋)
 +cdbr:	${RELDIR}/BOOTAA64.EFI
 +	dd if=/dev/zero of=cdbr bs=512 count=5760
 +	vnconfig -v cdbr > vnd
 +	fdisk -iy -b "5744@16:c" `cat vnd` >/dev/null
 +	newfs -t msdos /dev/r`cat vnd`i
 +	mount ${MOUNT_ARGS_msdos} /dev/`cat vnd`i ${MOUNT_POINT}
 +	mkdir -p ${MOUNT_POINT}/efi/boot
 +	cp ${RELDIR}/BOOTAA64.EFI ${MOUNT_POINT}/efi/boot/bootaa64.efi
 +	echo bootaa64.efi > ${MOUNT_POINT}/efi/boot/startup.nsh
 +	umount ${MOUNT_POINT}
 +	vnconfig -u `cat vnd`
 +	rm -f vnd
 +
 (略)
 +${CDROM}: ${BASE} ${XBASE} cdbr
 +	rm -rf ${.OBJDIR}/cd-dir
 +	mkdir -p ${.OBJDIR}/cd-dir/${OSREV}/${MACHINE}
 +	mkdir -p ${.OBJDIR}/cd-dir/etc
 +	echo "set image /${OSREV}/${MACHINE}/bsd.rd" > ${.OBJDIR}/cd-dir/etc/boot.conf
 +
 +	cp -p ${BASE} ${.OBJDIR}/cd-dir/${OSREV}/${MACHINE}
 +	cp -p ${XBASE} ${.OBJDIR}/cd-dir/${OSREV}/${MACHINE}
 +
 +	cat ${RELDIR}/SHA256 ${RELXDIR}/SHA256 > \
 +	    ${.OBJDIR}/cd-dir/${OSREV}/${MACHINE}/SHA256
 +	# XXX no SHA256.sig
 +
 +	cp -p ${.OBJDIR}/cdbr ${.OBJDIR}/cd-dir/${OSREV}/${MACHINE}
 +
 +	mkhybrid -a -R -T -L -l -d -D -N -o ${.OBJDIR}/${CDROM} \
 +	    -A "OpenBSD ${OSREV} ${MACHINE} Install CD" \
 +	    -P "Copyright (c) `date +%Y` Theo de Raadt, The OpenBSD project" \
 +	    -p "Theo de Raadt <deraadt@openbsd.org>" \
 +	    -V "OpenBSD/${MACHINE}   ${OSREV} Install CD" \
 +	    -b ${OSREV}/${MACHINE}/cdbr -c ${OSREV}/${MACHINE}/boot.catalog \
 +	    ${.OBJDIR}/cd-dir

-新たにcdbr (CD boot record)を作成するようになっている

-cdbrの中身は[[makefs>man:makefs.8]]で作成したESPで、bootaa64.efiのみがここにコピーされる

-このイメージファイルをi386/amd64のLegacy BIOSの場合と同様、mkhybridの-bオプションで指定

***河豚板での対応 [#s8c29b84]

- usbfadm newdriveでISOイメージからLiveUSB用ディスクイメージを作成する場合、ISOイメージ中にはESPにあるべきU-BOOTとRaspberry Pi Firmware関連のファイルがない
|CENTER:|c
|&ref(fi-remaster_arm64.png,,25%);|
|リマスタリング時の問題: U-Boot, ラズパイF/Wはどうやって供給する?|
// amd64 -> arm64
- これらをISOイメージ中にも持たせておく必要がある

--システムのファイルツリー(fuguita-7.5-arm64.ffsimg)中に /usr/fuguita/mdec/bootstuff.arm64.tar.gzという形で保持することにした。

以上より、arm64のISOイメージを作成するためのビルドフローは以下のようになる(赤字部分が変更点)

|CENTER:|c
|&ref(fiflow_arm64_iso.png,,33%);|
|ビルドフローの改修: cdbrの生成と、U-Boot, ラズパイF/Wの供給|

- パーティションイメージcdbr (CD boot record)を作成。

-- このイメージファイルはbootaa64.efiを含むESP(amd64のeficdbootと同じ)

- LiveDVD⇔LiveUSB 双方向のリマスタリングを可能にするための U-boot及びRasPiファームウェア

-- U-boot及びRasPiファームウェアは、ビルドシステム内ではpkg_addにより/usr/local/share以下に配置される

-- [[makebootarc_arm64.sh>github_lib:makebootarc_arm64.sh]] は、 U-boot及びRasPiファームウェアをESP内のファイルツリー構造と同じ形のファイルアーカイブを作成するスクリプト

-- [[gen_makebootarc_arm64.sh>github_lib:gen_makebootarc_arm64.sh]] は、/usr/local/share以下のファイルとESP内をスキャンしてmakebootarc_arm64.shを(なるべく自動生成する)スクリプト
以上より、arm64プラットフォーム用のISOイメージも生成できるようになった。

また、河豚板LiveUSBのアップデートには[[fiupdate>EBUG勉強会/20210828_fiupdate]]というツールが利用できるが、このツールでアップデートを行うには新しいリリースのISOイメージが必要。 今回の改修で、arm64プラットフォームにおいてもfiupdateを使用できるようになった。

**LiveUSB用ディスクイメージの再利用 [#x3e053e6]

これまで説明してきたように、河豚板のビルドフローは、

-i386/amd64~
sysmediaというディレクトリに各コンポーネントを集約 → LiveDVD用ISOイメージを生成 → 稼動環境でLiveUSB用ディスクイメージを生成

-arm64~
sysmedia.imgというイメージファイル内に各コンポーネントを集約 → LiveUSB用ディスクイメージを生成

と別のフローになっていた。

ここで、いま一つよく見てみると、LiveUSB用ディスクイメージとsysmedia.imgは、sysmedia部分のみならず、全体が全く同じものであることがわかる。

よって、稼動環境で生成されたLiveUSB用ディスクイメージをビルド環境にフィードバックし、ビルド環境に組み込んで使用できるようにビルドシステムのMakefileを改修した。

|CENTER:|c
|&ref(fiflow_arm64_p1.png,,33%);|
|ビルドフロー改善のアイデア: LiveDVDで生成されたLiveUSBイメージはビルド環境にフィードバックできる|

この改修で、LiveUSB用ディスクイメージをビルド環境にフィードバックした後は、全てのプラットフォームでLiveDVD、LiveUSBを同時に生成できるようになった。

|CENTER:|c
|&ref(fiflow_arm64_p2.png,,33%);|
|ビルドフロー改善: LiveUSBイメージをビルド環境にフィードバック後のフロー|

**まとめ [#ycd9e22e]

- amd64プラットフォームでLiveDVDがEFIモードで起動できるようになった

- arm64プラットフォームでLiveDVDの供給が可能となった

- LiveDVD→LiveUSB、LiveUSB→LiveDVD、どちらの方向のリマスターも今回の改修に対応させた

- 一度生成したLiveUSBのディスクイメージをビルドシステムにフィードバックするようにした~

-- 全ての対応プラットフォームでLiveDVD、LiveUSBの一括生成が可能となった
-- 仮想環境や実機を使用せず(=人手を介することなく)、LiveUSBのイメージを作成できるようになった(最終的な動作確認の意味での仮想/実機での実行は必要)

前回の勉強会ネタ「[[河豚板のビルドシステム>EBUG勉強会/20240217_BuildFuguIta]]」で紹介したToDo:
-1. 微妙に残っている秘伝のタレを取り除く
-2. arm64のISO作れてリマスターもできるようにする
-3. amd64のISOイメージのUEFI起動対応
-4. ISO内に2GB超のファイルがあると起動NG問題解決

のうち、項目2, 3は完了。項目1についてもほぼ解決となった。

** 参考** 関連報

- [[河豚板ガイド/開発編: 河豚板の構築>河豚板ガイド/4-開発編#build_fuguita]]

- 河豚板の開発リポジトリ(オリジナルCVSからのコピー)~
https://github.com/ykaw/FuguIta

- [[河豚板のUEFI/GPT対応>EBUG勉強会/20190223_UEFI_GPT]]

- [[河豚板のビルドシステム>EBUG勉強会/20240217_BuildFuguIta]]

----
#topicpath

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes