オープンソース
SPICEを死なせないと決意する
I refuse to let SPICE die (github.com)
要約
この記事は、Red Hatがメンテナンスを終了したSPICEのWindowsゲストエージェントプロジェクトをコミュニティで維持・フォークした経緯と現状について説明しています。このフォークは、特にWindows 11 VMでSPICEを使用する際に、マウスのポインターグラブ解除、デスクトップ解像度同期、クリップボード共有、ファイル転送などの機能を維持・改善することを目指しています。
全文翻訳
Windows用SPICE VDエージェント
SPICEのコミュニティメンテナンスによるWindowsゲストエージェント。
このリポジトリは、abandoned freedesktop.org spice/win32/vd_agentプロジェクトの公開ミラーです。CanonicalのダウンロードはGitHub Releasesにあります。
エージェントは以下を提供します:
ポインターをグラブしないクライアントマウスモード
クライアントに合わせたデスクトップ解像度
クリップボード共有(テキストと画像)
ゲストへのファイル転送
各セッションでvdagent.exeを起動するWindowsサービス (spice-agent)
ステータス
Red HatはもはやアップストリームSPICEをメンテナンスしていません。このフォークは、特にLinux上のWindows 11 VMで、Windowsエージェントをビルドし、現在のゲストに提供し続けます。
ツリーには、d7405ee (vdagent/desktop_layout.cpp) からのマルチGPUマウス修正が既に含まれています。SPICEディスプレイデバイスと並んで実際のGPUがパススルーされると、エージェントはマウスの移動を失わなくなります。
ライセンスと出所
エージェントはGPL-2.0-or-laterです。COPYINGおよび各ソースファイルの著作権ヘッダーを参照してください。元の著作権はRed Hat, Inc.およびその他のアップストリーム作成者に帰属します。このフォークは、Red HatまたはSPICEの商標を主張しません。
ピン留めされたビルド時サブモジュール(安易に更新しないこと):
サブモジュール コミット アップストリーム
spice-protocol ce0c4211e6f16c66477934cc42e70fa0988ca7f0 https://gitlab.freedesktop.org/spice/spice-protocol
spice-common 05c0c26839e88e6d0cc5452f49c40e38543c8f97 https://gitlab.freedesktop.org/spice/spice-common
サブモジュールURLはHTTPSを使用します。
MSIアップグレードは、履歴WiX UpgradeCode (7eb9b146-db04-42d7-a8ba-71fc8ced7eed) を維持します。関連製品は、インストールトランザクションが開始される前にInstallValidate後に削除されるため、共有コンポーネントは古いパッケージのアンインストールによって削除されるのではなく、再コピーされます。wixlはPEバージョンリソースを読み取らないため、FileテーブルにはRC_FILEVERSIONが明示的に指定されます。これはVS_VERSION_INFOの4つのフィールドと同一に保ってください。
x64インストーラーは、依然としてvdagent.exeとvdservice.exeをC:\Program Files\SPICE agent\binにのみ出荷します。
クローン
git clone --recursive https://github.com/nefarius/vd_agent.git
cd vd_agent
既にサブモジュールなしでクローンした場合:
git submodule update --init --recursive
freedesktop GitLabリモートは、ミラーが作成された後もアップストリームとして保持されています。以下で取得してください:
git fetch upstream
ローカルビルド (MSYS2 UCRT64)
Autotools + MinGW-w64 UCRT64パスは、インストーラーを生成するためのサポートされている方法です。CMake + MSVCはローカル開発のために引き続き利用可能ですが、MSIはビルドしません。
前提条件
MSYS2
UCRT64シェル (C:\msys64\ucrt64.exe、またはMSYSTEM=UCRT64)
UCRT64シェルで、リポジトリのルートで:
bash msys2/install.sh
autoreconf -i
bash msys2/build.sh builducrt64
bash msys2/package.sh builducrt64
install.sh は、autotools、autoconf-archive、UCRT64ツールチェーン、msitools (wixl)、およびImageMagick (テスト) をプルします。PNGクリップボード変換は、Windows Vista以降に出荷されるWindows Imaging Componentを使用します。
build.sh は、vdagent.exe / vdservice.exe を設定、コンパイルし、test-png、test-log、test-shell を実行します。
package.sh は次にmake msi を呼び出し、以下を書き込みます:
builducrt64/spice-vdagent-x64-<version>.msi
バージョン文字列は、build-aux/git-version-gen を介したgit describeから取得されます。リリースタグはv0.11.0(マイナーバージョンアップ)のように見える必要があります。これにより、プログラムと機能にタグが正確に表示されます。タグのないビルドは、最後のタグからのコミット数を追加します(例:v0.11.0に83コミット追加されると0.11.0.83-<hash>になります)。その数に--with-buildidを加えた値が256になると、次のマイナーバージョンと衝突するため、Configureは失敗します。
ローカルビルドに署名するには、package.shの前に2つの実行可能ファイルに署名し、その後MSIに署名します。
オプションのMSVCビルド
git submodule update --init --recursive
cmake -S . -B build64 -A x64
cmake --build build64 --config Release
cmake --build build64 --config Release --target check
CIとリリース
GitHub Actions (.github/workflows/build.yml) は、windows-2022上でx64 UCRT64 MSIをビルドします。
イベント 署名 公開
プルリクエスト / マスタープッシュ スキップ
ワークフローアーティファクト vdagent-win-x64 のみ
タグ v* 必要
署名済みMSI + SHA-256、アーティファクトミラー、GitHubリリース
署名はSignRelayを使用するため、証明書はランナーに配置されません。フローはDsHidMiniに一致します:
ビルドとテスト(署名なしバイナリ)
v*タグで、vdagent.exeとvdservice.exeにインプレースで署名します。
それらのバイナリからMSIをパッケージ化します。
MSIに署名します。
Authenticodeを検証します (Get-AuthenticodeSignature Status = Valid)。
<msi>.sha256 を書き込みます。
vdagent-win-x64 をアップロードし、タグの場合はAppVeyorArtifactsReceiverに通知します。
MSIとチェックサムをGitHubリリースに添付します。
SignRelayコンポジットアクションはコミット39ccbe0cef16a383237130380a5aef8db040d5d0にピン留めされています。CLIはランナーで.NET 10を必要とします (actions/setup-dotnet with 10.0.x)。
リポジトリ設定
nefarius/vd_agent で作成してください (Settings → Secrets and variables):
名前 種別 目的
SIGN_RELAY_SERVER 変数 RelayのベースURL、例:https://signrelay.api.nefarius.systems/
SIGN_RELAY_CI_TOKEN シークレット CIベアラートークン (サーバー上のSignRelay__CiToken)
WEBHOOK_URL シークレット AppVeyorArtifactsReceiverのWebhook
SIGN_RELAY_CI_TOKENとWEBHOOK_URLは、DsHidMiniのような既に動作しているリポジトリからコピーしてください。SIGN_RELAY_SERVERは既にリポジトリ変数として設定されています。シークレット値をコミットしないでください。
Windows SignRelayエージェントはコードサイニング証明書を保持します。サブジェクト/サムプリントとタイムスタンプはそこで設定し、このリポジトリでは設定しません。
リリースを公開する
CHANGELOG.md を更新します。
アノテートされたリリースにタグを付け、プッシュします:
git tag -a v0.11.0 -m "vdagent-win 0.11.0"
git push origin v0.11.0
ビルドワークフローを確認します:
署名なしパスは使用されない
実行可能ファイルとMSIの両方がValidと検証される
アーティファクトレシーバーがWebhookを受け入れた
GitHubリリースにMSIと.sha256が含まれている
Windows 11 SPICEゲストにMSIをインストールし、以下のチェックリストを実行します。
タグ付きビルドが署名開始後に失敗した場合、ツリーを修正し、タグを先に進めます(または新しいマイナーバージョンを使用します)。異なるバイトを持つ公開済みMSI名を再利用しないでください。失敗したリリースを復旧するには:GitHubリリースドラフトがあれば削除し、新しいタグをプッシュし、ユーザーがダウンロードした可能性のある以前の公開済みタグは不変に保ちます。
appveyor.yml は、最後のアップストリームUCRT64 MSIレイアウトとの履歴的な整合性のためにのみ保持されます。GitHub Actionsが権威あるCIです。署名済みActions MSIがスモークテストされたら、AppVeyorを削除します。
Windows 11 VM検証
Linux上のWindows 11ゲスト (QEMU/KVM + SPICE) で、QXLまたはqxl-wddm-dodディスプレイデバイスを使用します。
クリーンインストール — spice-vdagent-x64-*.msi を管理者として実行します。
サービス — spice-agent は実行中 / 自動です。vdagent.exe はユーザーセッションに存在します。
SPICE接続 — virt-viewer / spicy を再接続します。エージェントチャネルはアップです。
クリップボード — テキストとビットマップの両方向で機能します。
ファイル転送 — クライアントからファイルをドロップします。デスクトップに着陸します。
動的解像度 — クライアントウィンドウをリサイズします。ゲストデスクトップがWDDM QXLドライバー使用時に追従します。
マルチGPU / パススルーマウス — パススルー用の実際のGPUを追加し、SPICEディスプレイを維持し、ポインターが移動し続けることを確認します(d7405eeの修正)。
アップグレード — 以前のSpiceエージェントMSIの上にインストールします。サービスが復帰します。
アンインストール — 製品を削除します。spice-agent はなくなります。
オプションのCMake / Fedoraノート
Fedoraクロスビルドは、.gitlab-ci.ymlおよびmingw-spice-vdagent.spec.inを介して引き続き機能しますが、GitHubリリースには使用されません。x86 MSIビルドは、メンテナンスされているパイプラインではもはや生成されません。