河豚板のビルドシステム†
はじめに†
河豚板は 2023年12月-2024年1月にMakefileを始めとするビルドツールの全面改良を行い、OpenBSDからスクラッチで生成できるようになりました。
今回は、このビルドツールの内容についてざっくりと紹介します。
目次
おさらい: 河豚板のファイルシステムのレイアウト†
以下の説明は起動モード0の場合
それ以外の起動モードについては、河豚板ガイドの「起動モードとファイルシステム」を参照のこと。
- 各パーティションをマウント後、各ファイルをシンボリックリンクでつなぐ
- 例えば、/fuguita/usr/bin/viとなっているものを/usr//bin/viに見せるため
- OSのシステムファイルとユーザの設定やデータを分離するため
- OpenBSDのインストールメディアで使われている
- カーネルビルトイン ... カーネル起動時にすでにマウントされている
- /boottmp/
- /boottmp/rc ... 河豚板の初期化スクリプト。完了後は/etc/rcにチェイン
- /boottmp/* ... クランチバイナリ(初期に必要なコマンド群)、河豚板のツール、初期化に用いるパッチファイルなど
/sysmedia†
- DVD, USBメモリなど、ライブメディアのaパーティションをRead Onlyでマウント
- fuguita-*.ffsimg ... OSのファイルツリー全体が格納されたディスクイメージファイル
メディアのファイルシステムタイプに関わらず、FFSを保持できる
/fuguita†
- /sysmedia/fuguita-*.ffsimgをRead Onlyでマウントしたもの
- 素のOpenBSDとほぼ同じだが、ライブシステムに必要な若干の改変がされている
/ram†
おさらい: デバイスのパーティション構成†
- LiveDVDとLiveUSBのコンテンツは同じ ... LiveDVDとLiveUSBのブートローダ全部入り
→LiveDVDでLiveUSB、またはその逆のリマスターも可能
LiveUSBのスワップ/データ保存用/FATパーティションはオプショナル。リマスター時にそれぞれのあり(サイズ)/なしを指定できる。
LiveDVD†
普通のEl Torito規格のブート構成。UEFIのネイティブブートには未対応、起動はCSMを有効にして*2。
LiveUSB (amd64の場合)†
- Legacy BIOS / UEFI 両対応
- パーティショニングはMBR。Legacy BIOSによるブート
- ESP (EFI System Partition, ID=EF)も作成されBOOTX64.EFIもインストールされている
ビルドツール†
Makefileと数個のシェルスクリプトなどで構成
このビルドツールで作成できるのは、LiveDVD用のISOイメージファイル。
出来上がったISOイメージで河豚板を起動し、usbfadmユティリティのnewdrive機能を呼び出してLiveUSB用のディスクイメージを生成する。
ビルドツールのMakefileには、vmm(4)上でISOイメージを起動し、LiveDVDの動作チェックとLiveUSBの生成を行うための dvd2usb ターゲットが存在する。
ブートローダ†
- 開発環境の/usr/mdecからコピー
- DVDの場合、mkhybridでISOイメージを作成する時にboot.catalogが作成される
- LiveUSBでは、usbfadm newdrive時にMBR・PBRやESPの作成、installbootが実行される
カーネル†
- 動作可能性を増やすため、SMP/UPカーネルを両方インストール
- GENERICカーネルのconfigファイルにライブシステムとして動作させるためのパッチを当ててコンパイル
- ルートファイルシステムをrdにする & rdのサイズ設定
- 使用できるvnd(4)の数を2つ増やし、6個に
- NKPTP (PTPの初期値)の調整
/ ... ramdisk root†
構成要素
- crunched binary
/fuguitaをマウントする前や、シャットダウン時に/sysmediaや/ramがアンマウントされた後も必要な実行バイナリを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)ユティリティを用いてカーネルと結合する。
fuguita-*.ffsimg ... システムのファイルツリーイメージ†
3つのフェーズを経て作成
- stagingディレクトリでファイルツリーを展開 : lib/010_extract.sh
- ファイルツリーの修正 : lib/020_modify_tree.sh
展開したファイルツリーを、ライブシステムとして動作するように修正する
- KARL関連のファイルを削除
- dangling symlinkを修正
- 河豚板では使用できないコマンド(halt,reboot,syspatch,sysupgradeなど)を使用できるものへのsymlinkやstubに置き換える
- 河豚板特有のユティリティや設定ファイルなどをインストール
- stagingディレクトリから fuguita-*.ffsimg内へコピー
- rsync -avxHS --delete を使って、ファイルツリーを同期させる*4
Makefileの変遷 ... 「秘伝のタレ」を取り除く†
当初、MakefileはOpenBSDのErrata適用時に、必要なISOイメージを生成する部分のみサポート。
それ以外の部分はメジャーリリース時に一回だけ行うことがほとんどで、頻繁に実行することがなかったため、毎回手でコマンドを打って処理していた → 秘伝のタレ
その後、以下のように、徐々に処理をMakefileに吸収していった。
2005-†
ISOの生成部分廻りをMakefile化
後は手動
2009-†
手動操作の中でも頻繁に行う部分をMakefileに追加
- イメージファイル(fuguita-*.ffsimg, rdroot.img, media.img)のvnconfig/mount/umountを追加
2022/01-†
ファイルツリーとカーネルの生成部分を追加
- staging: lib/010_extract.sh, lib/020_modify_tree.shを追加(まだ手動)
- staging -> fuguita-*.ffsimgの同期
2022/04-†
追加部分をさらに拡大
2023/12-2024/01†
素のOpenBSD上で、ほぼmakeだけで河豚板をビルドできるようになる
以上により、「秘伝のタレ」がなくなり、ビルドツールの配布サイズの縮小と、アーキテクチャ非依存化が実現した。
$ 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†
*.ffsimgのサイズピッタリ問題†
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 #
イメージファイルfuguita-7.4-amd64.ffsimgの適切な大きさは?
- 994MBでは足りない(スーパーブロックやinodeの分だけ余分に必要)
- どれだけ余分に必要かはイメージファイルがFFS1かFFS2か、ブロック/フラグメント長、inode密度、stagingそのもののサイズとその中に含まれるファイル数、などによって変ってくる。
- イメージファイルを大きくして生じる余白(右図のdead space)は、使われることがないのでまったくの無駄
- とはいえ、将来のアップデートでサイズが変化することを考慮して、若干の余白(数〜十数MB)程度は作っておきたい
実装:
- lib/create_imgs.sh
- pass1:
- ちょっと大き目(20%くらい)のイメージファイルを作る
- stagingの中身をコピー
- stagingのサイズと、コピー先のサイズの差(修正値)を測定する
- pass2:
- pass1の結果を元に、修正値を加えてイメージファイルを作り直し
金庫の中に鍵問題†
Makefileを書く場合に例えば、
livecd.iso: sysmedia/boot sysmedia/cdboot ....
mkhybrid -o livecd.iso .... sysmedia
と書きたいところだが、sysmedia/bootやsysmedia/cdboot ... は、実際にはsysmedia.imgというイメージファイルの中にある場合があり*5、ターゲットlivecd.isoの依存物として直接書くことができない。困った...
とりあえず今のところ取っている解決策(暫定):
ToDo†
- 微妙に残っている秘伝のタレを取り除く
→現在のビルドフローは、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)を行った際に、ISOイメージのサイズが2GBを超えると起動できなくなる不具合がある。
このため、フルセットのデスクトップ環境にブラウザやオフィスソフトなどを添付する、などといったカスタマイズができない。
→原因調査し、解決したい(現段階では、皆目見当つかないが....)