河豚板のビルドシステム†
はじめに†
河豚板は 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
- OpenBSDのインストールセットの展開
- rsync, rlwrap, pvをpkg_add
- ユーザカスタマイズ(siteXX.tgz)があれば展開
- Errata対応のパッチファイル*3があれば適用
- ファイルツリーの修正 : 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†