#author("2024-02-17T17:47:25+09:00;2024-02-17T01:07:50+09:00","default:kaw","kaw")
#author("2024-02-18T04:38:39+09:00;2024-02-17T01:07:50+09:00","default:kaw","kaw")
#topicpath
*河豚板のビルドシステム [#z9018484]
RIGHT:EBUG 第88回会合 2024年2月17日 ~
川俣吉広、kaw@on.rim.or.jp

** はじめに [#s4b01120]
河豚板は 2023年12月-2024年1月にMakefileを始めとするビルドツールの全面改良を行い、OpenBSDからスクラッチで生成できるようになりました。~
今回は、このビルドツールの内容についてざっくりと紹介します。

-この資料: fuguita.org → 日本語トップ → EBUG勉強会 資料一覧 → [[EBUG勉強会/20240217_BuildFuguIta]]

///-この資料: fuguita.org → 日本語トップ → EBUG勉強会 資料一覧 → [[EBUG勉強会/20240217_BuildFuguIta]]
///
-ビルド手順: [[河豚板ガイド 4-開発編 河豚板の構築>fg4:build_fuguita]]

-リポジトリ: https://github.com/ykaw/FuguIta
----
目次
#contents

**[[おさらい>EBUG勉強会/20090221_LiveCD_3]]: 河豚板のファイルシステムのレイアウト [#k05b4a75]
以下の説明は起動モード0の場合

それ以外の起動モードについては、河豚板ガイドの「[[起動モードとファイルシステム>fg3:bootmode_fs]]」を参照のこと。
|&ref(fi-filesys-mode0.png,,25%);|

-各パーティションをマウント後、各ファイルをシンボリックリンクでつなぐ

--例えば、/fuguita/usr/bin/viとなっているものを/usr/bin/viに見せるため

--Union FSをエミュレートするため

--OSのシステムファイルとユーザの設定やデータを分離するため

*** / [#i85f2ac7]
- [[rd(4)>man:rd.4]] ... ramdisk root

- OpenBSDのインストールメディアで使われている

- カーネルビルトイン ... カーネル起動時にすでにマウントされている

- /dev

- /boottmp/
-- /boottmp/rc ... 河豚板の初期化スクリプト。完了後は/etc/rcにチェイン
-- /boottmp/* ... クランチバイナリ(初期に必要なコマンド群)、河豚板のツール、初期化に用いるパッチファイルなど

*** /sysmedia [#i7507962]
- DVD, USBメモリなど、ライブメディアのaパーティションをRead Onlyでマウント

-- ブートローダ、カーネル、 [[/etc/boot.conf>man:man8/amd64/boot.8]]

-- fuguita-*.ffsimg ... OSのファイルツリー全体が格納されたディスクイメージファイル ~
メディアのファイルシステムタイプに関わらず、FFSを保持できる

*** /fuguita [#yd892df2]
- OSのファイルツリー全体

- /sysmedia/fuguita-*.ffsimgをRead Onlyでマウントしたもの

- 素のOpenBSDとほぼ同じだが、ライブシステムに必要な若干の改変がされている

*** /ram [#v97f0e6f]
- [[mfs>man:mount_mfs.8]]((リマスター時の指定で[[tmpfs>man:mount_tmpfs]]に変更可能))

- /fuguitaの[[シャドウコピー>man:lndir.1]]
-- 基本的には
 cd /ram && lndir /fuguita
したもの
-- シンボリック・リンクだと都合の悪いもののみ /fuguita/* からコピー

**[[おさらい>EBUG勉強会/20190223_UEFI_GPT]]: デバイスのパーティション構成 [#j60e4c5b]
- LiveDVDとLiveUSBのコンテンツは同じ ... LiveDVDとLiveUSBのブートローダ全部入り~
→LiveDVDでLiveUSB、またはその逆のリマスターも可能
|&ref(fipart.png,,25%);|
LiveUSBのスワップ/データ保存用/FATパーティションはオプショナル。リマスター時にそれぞれのあり(サイズ)/なしを指定できる。
***LiveDVD [#babbf626]
普通のEl Torito規格のブート構成。UEFIのネイティブブートには未対応、起動はCSMを有効にして((OpenBSD 7.4-currentの[[mkhybrid(8)>man:mkhybrid.8]]にはUEFIブートが取り入れられたようだ。))。

***LiveUSB (amd64の場合) [#n59c66ae]
- Legacy BIOS / UEFI 両対応
-- パーティショニングはMBR。Legacy BIOSによるブート
-- ESP (EFI System Partition, ID=EF)も作成されBOOTX64.EFIもインストールされている

- 上記は amd64 でのデフォルト。指定により[[パーティショニングやブートの方式を変更できる>fg3:liveusb_remaster]]。

**ビルドツール [#jb17e51e]
Makefileと数個のシェルスクリプトなどで構成

このビルドツールで作成できるのは、LiveDVD用のISOイメージファイル。
出来上がったISOイメージで河豚板を起動し、usbfadmユティリティのnewdrive機能を呼び出してLiveUSB用のディスクイメージを生成する。~
ビルドツールのMakefileには、[[vmm(4)>man:vmm.4]]上でISOイメージを起動し、LiveDVDの動作チェックとLiveUSBの生成を行うための dvd2usb ターゲットが存在する。
|&ref(fiflow.png,,25%);|

***ブートローダ [#y9670200]
-開発環境の/usr/mdecからコピー
--DVDの場合、mkhybridでISOイメージを作成する時にboot.catalogが作成される
--LiveUSBでは、usbfadm newdrive時にMBR・PBRやESPの作成、installbootが実行される

***カーネル [#o919a3b9]
-動作可能性を増やすため、SMP/UPカーネルを両方インストール

-GENERICカーネルのconfigファイルにライブシステムとして動作させるためのパッチを当ててコンパイル
--ルートファイルシステムをrdにする & rdのサイズ設定
--使用できる[[vnd(4)>man:vnd.4]]の数を2つ増やし、6個に
--NKPTP ([[PTP>https://www.hazymoon.jp/OpenBSD/arch/i386/i386/locore_paging.html]]の初期値)の調整

*** / ... ramdisk root [#z4b333b7]
構成要素
-crunched binary ~
/fuguitaをマウントする前や、シャットダウン時に/sysmediaや/ramがアンマウントされた後も必要な実行バイナリを[[crunchgen(8)>man:crunchgen.8]]で生成~
... bootbin = disklabel, halt, init, ksh, ln, mount, mount_cd9660, mount_ext2fs, mount_ffs, mount_mfs, mount_msdos, mount_ntfs, mount_vnd, newfs, reboot, sed, sh, sleep, swapctl, swapon, sysctl, umount, vnconfig

-rc ~
河豚板の初期化スクリプト。ファイルシステムの構築やネットワークの設定を行う。~
初期化完了後は、OpenBSDの/etc/rcにチェインする。

-河豚板独自のユティリティスクリプト、diffファイルなど
--rcから呼び出され、on-the-flyで/etc中のファイルなどに改変を加える(ネットワーク関連の設定ファイルなど)。

-/dev
--MAKEDEV vnd4 vnd5 ... カーネルのconfigファイルに対応して作成

イメージファイル(rdroot.img)として作成し、[[rdsetroot(8)>man:rdsetroot.8]]ユティリティを用いてカーネルと結合する。

*** fuguita-*.ffsimg ... システムのファイルツリーイメージ [#g57f3ec5]
3つのフェーズを経て作成

- stagingディレクトリでファイルツリーを展開 : lib/010_extract.sh
-- OpenBSDのインストールセットの展開
-- rsync, rlwrap, pvをpkg_add
-- [[ユーザカスタマイズ(siteXX.tgz)>https://www.openbsd.org/faq/faq4.html#site]]があれば展開
-- Errata対応のパッチファイル((OpenBSDのsyspatchのものではなく、河豚板独自に作成したtarball))があれば適用

- ファイルツリーの修正 : lib/020_modify_tree.sh ~
展開したファイルツリーを、ライブシステムとして動作するように修正する
-- KARL関連のファイルを削除
-- dangling symlinkを修正
-- 河豚板では使用できないコマンド(halt,reboot,syspatch,sysupgradeなど)を使用できるものへのsymlinkやstubに置き換える
-- 河豚板特有のユティリティや設定ファイルなどをインストール

- stagingディレクトリから fuguita-*.ffsimg内へコピー
-- rsync -avxHS --delete を使って、ファイルツリーを同期させる((ハードリンクが扱えない&&遅いため、OpenRSYNCは使用不可))

** Makefileの変遷 ... 「秘伝のタレ」を取り除く [#m1e1e501]

当初、MakefileはOpenBSDのErrata適用時に、必要なISOイメージを生成する部分のみサポート。

それ以外の部分はメジャーリリース時に一回だけ行うことがほとんどで、頻繁に実行することがなかったため、毎回手でコマンドを打って処理していた → ''秘伝のタレ''

その後、以下のように、徐々に処理をMakefileに吸収していった。

*** 2005- [#k4316e34]
ISOの生成部分廻りをMakefile化 
-ブートローダのコピー

-ISOイメージの生成

-カーネルとrdroot.imgの結合

後は手動

*** 2009- [#l24c9120]
手動操作の中でも頻繁に行う部分をMakefileに追加
-イメージファイル(fuguita-*.ffsimg, rdroot.img, media.img)のvnconfig/mount/umountを追加

*** 2022/01- [#l76a80f4]
ファイルツリーとカーネルの生成部分を追加
-staging: lib/010_extract.sh, lib/020_modify_tree.shを追加(まだ手動)

-staging -> fuguita-*.ffsimgの同期

-カーネルのコンパイル

*** 2022/04- [#n2b82d88]
追加部分をさらに拡大
-カーネルのパッチ当てとconfig

*** 2023/12-2024/01 [#d34a5556]
素のOpenBSD上で、ほぼmakeだけで河豚板をビルドできるようになる
-ほぼ全面書き換え

-ramdisk root生成部を追加

-*.ffsimgのサイズ計算→生成

以上により、「秘伝のタレ」がなくなり、ビルドツールの配布サイズの縮小と、アーキテクチャ非依存化が実現した。
 $ ls -lh tools-7.4.tar.gz old/tools-7.3-*.tar.gz
 -rw-r--r--  1 ftpadmin  ftpadmin  28.5M Apr 23  2023 old/tools-7.3-amd64.tar.gz
 -rw-r--r--  1 ftpadmin  ftpadmin  38.2M Apr 23  2023 old/tools-7.3-arm64.tar.gz
 -rw-r--r--  1 ftpadmin  ftpadmin  25.8M Apr 23  2023 old/tools-7.3-i386.tar.gz
 -rw-r--r--  1 ftpadmin  ftpadmin  74.8K Jan  8 12:18 tools-7.4.tar.gz

** More Topics [#x9b7ebff]

*** *.ffsimgのサイズピッタリ問題 [#tef5a6f9]

stagingディレクトリ下に作られたファイルツリーをピッタリ収納するには、
イメージファイルのサイズをどの程度にすればよいか?

 fi7.4-amd64 # ls -l staging
 total 52
 -rw-r--r--   1 root  wheel   578 Jan 19 04:56 .cshrc
 -rw-r--r--   1 root  wheel   468 Jan 19 04:56 .profile
 drwxr-xr-x   2 root  wheel   512 Jan 19 04:56 altroot
 drwxr-xr-x   2 root  wheel  1024 Jan 19 04:58 bin
 drwxr-xr-x   2 root  wheel   512 Feb 15 11:17 dev
 drwxr-xr-x  25 root  wheel  1536 Feb 15 11:18 etc
 drwxr-xr-x   2 root  wheel   512 Jan 19 04:56 home
 drwxr-xr-x   2 root  wheel   512 Jan 19 04:56 mnt
 drwx------   3 root  wheel   512 Feb 15 11:17 root
 drwxr-xr-x   2 root  wheel  1536 Feb 15 11:18 sbin
 lrwxrwx---   1 root  wheel    11 Jan 19 04:56 sys -> usr/src/sys
 drwxrwxrwt   2 root  wheel   512 Feb 15 11:18 tmp
 drwxr-xr-x  14 root  wheel   512 Feb 15 11:18 usr
 drwxr-xr-x  24 root  wheel   512 Jan 19 04:56 var
 
 fi7.4-amd64 # du -sh staging
 994M    staging
 fi7.4-amd64 # ls -l sysmedia
 total 2110028
 -r-xr-xr-x  1 root  wheel       88844 Dec 17 08:58 boot
 -rwxr--r--  1 root  wheel        2048 Feb 15 11:18 boot.catalog
 -rw-r--r--  1 root  wheel    11806004 Feb 15 11:08 bsd-fi
 -rw-r--r--  1 root  wheel    11832361 Feb 15 11:12 bsd-fi.mp
 -rw-r--r--  1 root  wheel       90052 Dec 17 08:58 cdboot
 -rw-r--r--  1 root  wheel        2048 Dec 17 08:58 cdbr
 drwxr-xr-x  2 root  wheel         512 Dec 14 01:59 etc
 -rw-r--r--  1 root  wheel  1055916032 Feb 15 11:28 fuguita-7.4-amd64.ffsimg
 fi7.4-amd64 #
#ref(fittingfs.png,right,around,40%)
イメージファイルfuguita-7.4-amd64.ffsimgの適切な大きさは?

- 994MBでは足りない(スーパーブロックやinodeの分だけ余分に必要)

- どれだけ余分に必要かはイメージファイルがFFS1かFFS2か、ブロック/フラグメント長、inode密度、stagingそのもののサイズとその中に含まれるファイル数、などによって変ってくる。

- イメージファイルを大きくして生じる余白(右図の''dead space'')は、使われることがないのでまったくの無駄

- とはいえ、将来のアップデートでサイズが変化することを考慮して、若干の余白(数〜十数MB)程度は作っておきたい

実装:

-[[lib/create_imgs.sh>https://github.com/ykaw/FuguIta/blob/master/lib/create_imgs.sh]]~
--pass1:
+++ちょっと大き目(20%くらい)のイメージファイルを作る
+++stagingの中身をコピー
+++stagingのサイズと、コピー先のサイズの差(修正値)を測定する
--pass2:
+++pass1の結果を元に、修正値を加えてイメージファイルを作り直し

-[[lib/setup_fsimg.sh>https://github.com/ykaw/FuguIta/blob/master/lib/setup_fsimg.sh]]~
--create_imgs.shの下請けスクリプト。色々なパラメータを設定した上で、実際にイメージファイルを作成する

*** 金庫の中に鍵問題 [#x54bcdea]

Makefileを書く場合に例えば、
 livecd.iso: sysmedia/boot sysmedia/cdboot ....
         mkhybrid -o livecd.iso .... sysmedia
と書きたいところだが、sysmedia/bootやsysmedia/cdboot ... は、実際にはsysmedia.imgというイメージファイルの中にある場合があり((arm64の場合))、ターゲットlivecd.isoの依存物として直接書くことができない。困った...

とりあえず今のところ取っている解決策(暫定):
-タイムスタンプを記録するファイルを作る
 livecd.iso: sysmedia.time
         mkhybrid ....
 
 sysmedia.img: ....
         処理もろもろ
         touch sysmedia.time
 
 clean: .... sysmedia.time ....
         rm -f .... sysmedia.time ....

-依存関係を気にしないで、常にコマンドが実行されるようにする
 sysmedia.img:
         mkhybrid ....
処理時間が短いものなら、これでOK?

*** ToDo [#qa6fb323]
- 微妙に残っている秘伝のタレを取り除く ~
→現在のビルドフローは、LiveDVD用のISOを作り、その上でLiveUSBをリマスターする建て付けになっている。~
arm64 (Raspberry Pi 3/4用) では、ISOイメージを作成できず、作れたとしても起動できないので、現在はLiveUSBのディスクイメージはfdisk→disklabel→newfsくらいまでは手動で行う必要がある。~
この部分もmakeで作れるようにしたい。

- arm64のISO作れてリマスターもできるようにする~
→OpenBSD/arm64-currentでは、ISOイメージを作成できるようになったようだ(VMで起動する用?)。~
この線でも手作業を排除できるか検討する。

- amd64のISOイメージのUEFI起動対応 ~
→こちらも -currentでは可能になっている模様。まずは動作検証から。

- ISO内に2GB超のファイルがあると起動NG問題解決 ~
→stagingディレクトリの作成時に[[ユーザカスタマイズ(siteXX.tgz)>https://www.openbsd.org/faq/faq4.html#site]]を行った際に、ISOイメージのサイズが2GBを超えると起動できなくなる不具合がある。~
このため、フルセットのデスクトップ環境にブラウザやオフィスソフトなどを添付する、などといったカスタマイズができない。~
→原因調査し、解決したい(現段階では、皆目見当つかないが....)

----
#topicpath

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