リモートデスクトップという名の悪夢
仕事用に数十台の仮想マシン(VM)を動かしている強力なProxmoxサーバーを所有しているとしましょう。しかし、Windows VMを使ってCapCutで動画編集をしたり、たまにゲームをしたりしようとすると、途端に行き詰まってしまいます。RDP(Windowsリモートデスクトップ)やVNCといった従来の方法では、お世辞にも快適とは言えない体験しか得られないからです。
画像は荒れ、マウスは1秒近く遅延し、60fpsの動画視聴など夢のまた夢. ITエンジニアにとって、このカクつきやラグは非常にストレスが溜まるものです。強力なハードウェアがあるのに、リモートからその性能をフルに引き出せないもどかしさがあります。
なぜ古いプロトコルは遅いのか?
RDPやVNCは、もともと軽い事務作業向けに設計されています。これらは静止画や画面上の小さな変化を転送することに最適化されています。しかし、動画を再生したりゲームをプレイしたりすると、毎秒数百万ピクセルが絶え間なく変化します。
この時、RDPは画像の圧縮にCPUリソースを使い果たしますが、それでもフレームレートに追いつけません. 結果として帯域が詰まり、サーバーが過負荷になり、ガタガタの映像しか手元に届かなくなります。さらに重要なのは、これらのソリューションはGPUのエンコード(符号化)機能を活用できないため、レイテンシ(遅延)が跳ね上がってしまう点です。
一般的なソリューションの弱点
「理想の環境」に出会うまで、私も多くの方法を試してきました:
- AnyDesk/TeamViewer: 便利ですが、中間サーバーに依存します。遅延は通常100msを超え、無料版では帯域制限がかかることも少なくありません。
- Parsec: 非常にスムーズですが、クローズドソースです。Proxmoxの仮想マシンにインストールする場合、ドライバーやハードウェアの相性がシビアなことがあります。
- VNC: 技術が古すぎます。画質が悪く、高品質なオーディオもほとんどサポートされていません。
最強の解決策:SunshineとMoonlightのコンビ
数ヶ月間、個人のホームラボでテストを繰り返した結果、現時点でSunshine(ホスト)とMoonlight(クライアント)の組み合わせが最強であると断言できます。Sunshineは、提供終了となったNVIDIA GameStreamの完璧な代替となるオープンソースツールです。これにより、GPUが超低遅延でビデオ圧縮を処理できるようになり、LAN内では通常5〜10ms以下の遅延に抑えられます。
Moonlightは、非常に軽量な受信アプリとして機能します。Androidスマートフォン、iPhoneから、Linuxを搭載した古いラップトップまで、あらゆるデバイスにインストール可能です。
ステップ 1:ProxmoxでのGPUパススルー設定
これは、仮想マシンで実機並みのパフォーマンスを出すための最も重要な工程です。物理グラフィックカードのパワーを直接Windows VMに割り当てる必要があります。CPU(ソフトウェアエンコーディング)で実行すると、パフォーマンスが最大60%低下し、映像の滑らかさが失われます。
まず、BIOSでIOMMUを有効にします(通常、Virtualizationの項目にあります)。次に、Proxmoxのターミナルにアクセスし、grubファイルを編集します:
nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT の行を編集します(例:Intel CPUの場合):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
grubを更新し、Proxmoxがパススルーモードを正しく認識するために必要なモジュールをロードするのを忘れないでください:
update-grub
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules
サーバーを再起動し、ProxmoxのWeb UIに入ります。Windows VMのHardwareセクションで、Add -> PCI Device を選択し、対象のグラフィックカードを指定します。「All Functions」と「Primary GPU」のチェックボックスに必ずチェックを入れてください。
ステップ 2:仮想マシンでのSunshine設定
Windows VMがGPUドライバーを認識したら、GitHubからSunshineをダウンロードします。インストールは数分で終わります。実行後、Sunshineは https://localhost:47990 で管理インターフェースを開きます。
Configuration タブの Video 項目に注目してください。NVIDIAカードを使用している場合はエンコーダーに nvenc を、AMDカードの場合は amf を選択します。Sunshineに適切なハードウェアエンコーダーを強制的に使用させることで、CPU負荷を軽減し、映像の遅延を解消できます。
ステップ 3:Moonlightでの接続
クライアントマシン(ノートPCやスマホ)でMoonlightを開きます。同じローカルネットワーク内でSunshineが動作していれば、アプリが自動的に仮想マシンを検出します。見つからない場合は、VMのIPアドレスを手動で入力してください。
Moonlightの画面にPINコードが表示されます。SunshineのWebインターフェースに戻り、PIN タブにそのコードを入力して認証します。すると即座に、非常にスムーズなWindows画面が目の前に現れます。
ステップ 4:60 FPSを実現するための微調整
最高の体験を得るために、私は通常Moonlightを以下のように設定しています:
- Bitrate: 5GHzのWi-Fi環境なら30〜50 Mbps程度に設定します。1Gbpsの有線LANを使用している場合は、80 Mbpsまで上げると鏡のように鮮明な画質になります。
- Video Codec: 低帯域でも高品質を維持できるH.265 (HEVC)を優先的に選択します。
- V-Sync: 格闘ゲームやFPSをプレイする際の入力遅延を最小限に抑えるため、Moonlightの設定でこれをオフにします。
ホームラボ運用からの実践的アドバイス
私はProxmox上で12台のVMを動かしていますが、一つ学んだ教訓があります。それは、パススルーにオンボードGPU(iGPU)を使わないことです。GTX 1650やRTX 3060のような古いディスクリートGPUでも、安定性において圧倒的な差が出ます。
外出先のカフェなどからCloud PCにアクセスしたい場合、Sunshineのポートを直接インターネットに開放するのは絶対にやめてください. ProxmoxにTailscaleやWireGuardをインストールしましょう。これにより、自宅のネットワークに安全に接続でき、サーバーの隣に座っているかのようにMoonlightを利用できます。
まとめ
SunshineとMoonlightでCloud PCを構築するのは、古いハードウェアを有効活用する素晴らしい方法です。薄型軽量のノートPCで重い作業をこなし、計算負荷はすべてサーバーに任せることができます. GPUパススルーを数ステップ設定するだけで、デスクに置いた物理マシンと遜色のない、スムーズなリモートワーク環境が手に入ります。

