河豚板のビルドシステム†
はじめに†
河豚板は 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、またはその逆のリマスターも可能
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イメージを生成する部分のみサポート。
(その他の部分はメジャーリリース時に一回行うことがほとんどで、それほど頻繁に必要なかったため)
その後、
2005- ... ISOの生成部分のみ†
- ブートローダのコピー
- ISOイメージの生成
- rdsetroot
- 後は手動
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- ... 追加部分をさらに拡大†
- kernconfig
- staging: Makefileに組み込み
2023/12-2024/01 ... 素のOpenBSD上で、ほぼmakeだけで河豚板をビルドできるようになる†
- ほぼ全面書き換え
- ramdisk root生成部を追加
- *.ffsimgのサイズ計算→生成
More Topics†