コンテンツにスキップ
ドキュメントコンポーネント

コンポーネント

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/CDGitHub 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 に 使います。

鍵の詳細

項目値
鍵の UIDXCP-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-proxyXVA 配信用の Rust 製 HTTP/gzip プロキシ
xolite-ceXO Lite のパッチ、RPM の spec、ビルドのパイプライン
xcp-ng-ce-isoISO の組み立て、ツールチェーン、CI のワークフロー
xoa-hl手を入れた Xen Orchestra(XOA-hl)。ビルドして RPM にパッケージ化
build-xoa-hlXCP-ng 上で XOA の XVA イメージを作る Packer のパイプライン