コンポーネント
XCP-hl を理解し、ビルドし、開発に加わるために必要なことをまとめています。
リポジトリの全体像
XCP-hl は、いくつかの機能別のリポジトリと、このドキュメント用の リポジトリに分かれています。
Vagrantin/xcp-hl ← ドキュメント(このサイト)
│
├── Vagrantin/xolite-ce ← XO Lite のパッチ + RPM ビルド
│ │ 署名済み RPM を GitHub リリースの成果物として公開
│ │
├─────────│───Vagrantin/xoa-proxy ← Rust 製 HTTP プロキシ + RPM ビルド
│ │ │ 署名済み RPM を GitHub リリースの成果物として公開
│ ▼ ▼
├── Vagrantin/xcp-ng-ce-iso ← ISO の組み立て + ISO の GitHub リリース
│ │ xolite-ce と xoa-proxy から RPM を取得し、ISO を組み立て
│
├── Vagrantin/xoa-hl ← XOA-hl:手を入れた Xen Orchestra(RPM + コンテナ)
│ ▼
├── Vagrantin/build-xoa-hl ← Packer のパイプライン → XCP-ng 上で XOA の XVA イメージを作成
│ │ XVA を GitHub リリースとして公開(xoa-image-* タグ)
│各リポジトリはそれぞれの GitHub Actions のパイプラインを持っています。
これらは疎結合です。xolite-ce と xoa-proxy はバージョン付きの RPM
成果物を公開し、xcp-ng-ce-iso はそれをリリースタグで取得します。通常の
ビルドで、これらを同時にチェックアウトする必要はありません。xoa-hl は
コミュニティが手を入れた Xen Orchestra(XOA-hl)をビルドし、
build-xoa-hl がそれを XVA イメージにまとめます。
技術スタック
| 層 | 技術 |
|---|---|
| ハイパーバイザーの土台 | XCP-ng 8.3(Xen 4.17、Dom0 は Linux 4.19) |
| XO Lite の画面 | Vue 3 · TypeScript · Vite · Pinia(@xen-orchestra/lite) |
| XO Lite のビルド | Yarn(Corepack)· yarn build:xo-lite |
| RPM のパッケージング | rpmbuild、rpmsign、createrepo_c |
| ISO の組み立て | create-install-image(XCP-ng のツールチェーン、master ブランチ) |
| ISO 関連のツール | mksquashfs、xorriso、isohybrid、implantisomd5 |
| XOA-hl のビルド | Node.js 24 · Yarn workspaces · AlmaLinux 9 のコンテナ |
| XVA イメージのビルド | Packer · ddelnano/xenserver プラグイン · Kickstart |
| ビルド環境 | Docker(xcp-ng-build-env:8.3) |
| プロキシサーバー | Rust · hyper · tokio · tokio_util::io::ReaderStream |
| CI/CD | GitHub Actions |
| 署名 | GPG:オフラインのマスターキー + 2 つの署名用サブキー(後述) |
ビルドのパイプライン(最初から最後まで)
1. xolite-ce の CI(GitHub Actions)
├── UPSTREAM_TAG で固定したタグで vatesfr/xen-orchestra をクローン
│ (現在は xo-lite-v0.21.0。自動ではなく意図的に更新)
├── patches/community-xoa-deploy.patch を適用
├── yarn build:xo-lite
├── rpmbuild → xo-lite-community-<VERSION>.rpm
├── RPM 署名用サブキーで rpmsign(GPG_PRIVATE_KEY + GPG_PASSPHRASE)
└── 署名済み RPM を GitHub リリースの成果物として公開(公開鍵は
keys.openpgp.org。インポート手順はリリースノートに記載)
2. xoa-proxy の CI(GitHub Actions)
├── musl のツールチェーンを導入(musl-1.2.4、静的 libc)
├── rustup で Rust stable を導入
├── x86_64-unknown-linux-musl のターゲットを追加
├── cargo build --release --target x86_64-unknown-linux-musl
├── RPM のソースを準備(バイナリー + systemd ユニット + logrotate の設定)
├── rpmbuild → xoa-proxy-<VERSION>.rpm
├── RPM 署名用サブキーで rpmsign(GPG_PRIVATE_KEY + GPG_PASSPHRASE)
└── 署名済み RPM を GitHub リリースの成果物として公開(公開鍵は
keys.openpgp.org。インポート手順はリリースノートに記載)
3. xcp-ng-ce-iso の CI(GitHub Actions)
├── xolite-ce のリリースから署名済み RPM をダウンロード
├── xoa-proxy のリリースから署名済み RPM をダウンロード
├── GPG_PRIVATE_KEY(ISO 署名用サブキー)をランナーのキーリングにインポート
├── ランナーのキーリングから公開鍵をエクスポート → インストーラーの chroot に注入
├── createrepo_c で community-repo/x86_64/ を用意
├── create-installimg.sh を実行(root):install.img(SquashFS)を作成
├── create-iso.sh を実行(非 root):ISO を組み立て
├── isohybrid --uefi(MBR/GPT ハイブリッドの刻印)
├── implantisomd5
├── sha256sum → xcp-ng-8.3-ceN.iso.sha256
├── gpg --detach-sign(GPG_PRIVATE_KEY による ISO 署名用サブキー)
└── xcp-ng-8.3-ceN.iso + .iso.sha256 + .iso.sha256.asc を
Vagrantin/xcp-ng-ce-iso の GitHub リリースとして公開(公開鍵は
keys.openpgp.org。検証手順はリリースノートに記載)
4. xoa-hl の CI(GitHub Actions、v<VERSION>-ceN のタグで実行)
├── UPSTREAM_XO で固定したコミットで vatesfr/xen-orchestra を浅く取得
│ (現在は 5.113.2。XO 5.x の最後のリリースで、意図的に更新)
├── patches/*.patch を適用(menu-hide-items、xcp-hl-updates、xoa-hl-update-api)
├── xoahl.config.toml を書き出し、自己署名の TLS 証明書を生成
├── yarn && yarn build(すべての workspace)、不要物の削除、devDependencies の除去
├── tar → xoa-hl-<VERSION>.tar.gz(ビルドの入力のみ。公開しない)
├── rpmbuild → xoa-hl-<VERSION>-N.….x86_64.rpm(ビルド済みの XO 一式)
├── RPM を v<VERSION>-ceN の GitHub リリースとして公開
└── 最新の 5 つの RPM を署名付きの yum リポジトリとして再公開(アプライアンスのアップデート用)
5. build-xoa-hl(Packer、実機の XCP-ng ホスト上)
├── AlmaLinux の ISO のチェックサムと、xoa-hl の最新リリースの RPM の URL を解決
├── inst.ks(Kickstart)と almalinux-build.json(Packer のテンプレート)を生成
├── packer build:XCP-ng ホスト上で Kickstart により AlmaLinux 9 をインストール
├── プロビジョニング:xe-guest-utilities、Node 24、xoa-hl の RPM、初回起動用ユニット
├── イメージを軽量化し、/etc/machine-id を空にする
└── XVA をエクスポート(xva_compressed):XO Lite CE が展開するアプライアンス設計上の判断
ISO 側を 3 つのリポジトリに分ける方針
これは ISO のパイプライン(xolite-ce、xoa-proxy、xcp-ng-ce-iso)に
限った話です。XOA-hl 自身のリポジトリがビルド全体のどこに位置するかは、
上の図を参照してください。RPM のビルドと ISO の組み立てを分けることで、
責任範囲がはっきりします。xolite-ce(画面のパッチとパッケージング)と
xoa-proxy(Rust のプロキシとパッケージング)は、ISO のツールチェーンに
触れずにそれぞれ独立して手を入れられますし、その逆も同じです。各リポジトリ
は、バージョン付きの署名済み RPM を GitHub リリースの成果物として公開します。
ISO はそれらの成果物を取り込んでビルドします。
ソースコードの段階でパッチを当てる
XO Lite のパッチは、DeployXoaView.vue の Vue / TypeScript のソース
コードに対して当てます。
GPG 署名
XCP-hl は、オフラインのマスターキーとサブキーという形の鍵ペアを 1 組だけ使います。マスターキーはオフラインで保管し、署名には使いません。 そこから 2 つの署名用サブキーを作り、一方を両方の RPM に、もう一方を ISO に 使います。
鍵の詳細
| 項目 | 値 |
|---|---|
| 鍵の UID | XCP-ng Community Edition (Master signing key)(gpg --list-keys に表示される文字列) |
| マスターキーのフィンガープリント | 2F59 1DB9 D2C1 28C4 C3D9 63F4 6DA0 0DCA 5BBA 215A |
| 公開先 | keys.openpgp.org |
| メールアドレス | xcp-ng-ce.lid530@passmail.com |
| 公開鍵のファイル | xcp-ng-ce-public.asc |
サブキーの役割
| サブキー | 用途 |
|---|---|
| RPM 署名用サブキー | xo-lite-community-*.rpm と xoa-proxy-*.rpm |
| ISO 署名用サブキー | xcp-ng-8.3-ceN.iso.sha256.asc(ISO のチェックサムファイルに対する分離署名) |
コンポーネントごとの詳しいドキュメント
| ページ | 説明 |
|---|---|
| xoa-proxy | XVA 配信用の Rust 製 HTTP/gzip プロキシ |
| xolite-ce | XO Lite のパッチ、RPM の spec、ビルドのパイプライン |
| xcp-ng-ce-iso | ISO の組み立て、ツールチェーン、CI のワークフロー |
| xoa-hl | 手を入れた Xen Orchestra(XOA-hl)。ビルドして RPM にパッケージ化 |
| build-xoa-hl | XCP-ng 上で XOA の XVA イメージを作る Packer のパイプライン |