public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
To: pve-devel@lists.proxmox.com
Subject: [RFC pve-http-server/qemu-server/pve-manager/pve-{qemu-kyber,kyberproxy, kyber-web,qemu-rdp,rdpproxy,rdp-web} 00/13] add rdp && kyber consoles for qemu over D-Bus display
Date: Tue, 25 Aug 2026 13:34:25 +0200	[thread overview]
Message-ID: <20260825113442.947620-1-alexandre.derumier@groupe-cyllene.com> (raw)

Hi,

This patch series add support for 2 new remote console protocols as alternative
to VNC && spice.

They use the QEMU's D-Bus display feature to encode and stream the video to 
through an external daemon.

1) Kyber web console

This use the new streaming protocol developped by the VLC developpers
https://gitlab.com/kyber/kyber
https://www.youtube.com/watch?v=nqVzOMebNx8

The target is a replacement of spice protocol for cloud gaming, video
acceleration, 3d support.

The kyber server has been patched to support qemu video output && inputs.

Kyber use a controlplane through websockets && dataplane for video through
quick/webtransport.

                             browser
                                |
      +-------------------------+-------------------------+
      |                                                   |
 control plane                                       data plane
 HTTPS :8006                                    WebTransport (QUIC)
 /api2/json/nodes/<node>/qemu/<vmid>/kyber/     UDP :63100, per node
      |                                       routed by the token
      v                                       start_mux handed out
 +---------------------+                                   |
 |      pveproxy       |                                   |
 |  checks VM.Console  |                                   |
 +---------------------+                                   |
      |                                                    |
      | unix /run/pvekyberproxy.sock                       |
      v                                                    v
 +---------------------------------------------------------------+
 |                         pvekyberproxy                         |
 |   start_mux is answered with this daemon's port and its       |
 |   certificate hash, which is what sends the client here       |
 +---------------------------------------------------------------+
      |                                                    |
      | unix                                               | QUIC
      | /run/qemu-server/<vmid>.kyber.sock                 | 127.0.0.1:63000
      v                                                    v
 +---------------------------------------------------------------+
 |                  kycontroller   (pve-kyber)                   |
 +---------------------------------------------------------------+
      | spawns
      v
 kyavserver / kynputserver
      | spawn
      v
 kyber-qemu-server ---> kymux tcp 127.0.0.1:9091/0 video, /1 audio
      |
      | D-Bus unix /run/qemu-server/<vmid>.dbusdisplay, org.qemu on
      v the private bus qemu-server starts for that VM
 QEMU -display dbus,addr=unix:path=...



2) RDP web console

It's use the IronRDP server && gateway implementation
https://github.com/Devolutions/IronRDP
https://github.com/Devolutions/devolutions-gateway

Target is VNC replacement (with audio && clipboard support),
cpu usage is pretty low && display is a lot better than VNC when playing videos
for example.


                             browser
                                |
                                | one websocket, and only this one:
                                | HTTPS :8006, no second port to open
                                | /api2/json/nodes/<node>/qemu/<vmid>/rdp/<token>
                                v
                     +---------------------+
                     |      pveproxy       |
                     |  checks VM.Console  |
                     +---------------------+
                                |
                                | unix /run/pverdpproxy.sock
                                | path rewritten to /<vmid>/<token>
                                v
                     +----------------------------------+     reads the
                     |           pverdpproxy            |     token from
                     |  RDCleanPath: X.224 request, TLS |---> <vmid>.rdp.env
                     |  handshake, certificate chain    |     (root only)
                     |  back to the client, then bytes  |
                     +----------------------------------+
                                |
                                | unix /run/qemu-server/<vmid>.rdp.sock
                                | TLS, terminated here - CredSSP binds to
                                | the server's key, so it cannot be dropped
                                v
                     +----------------------------------+     credentials
                     |       qemu-rdp   (pve-rdp@)      |<--- over D-Bus,
                     +----------------------------------+     from the API
                                |
                                | D-Bus unix, org.qemu on the private bus
                                v /run/qemu-server/<vmid>.dbusdisplay
                     QEMU -display dbus,addr=unix:path=...


the kyber/rdp servers && proxy are written in Rust, as I'm a pretty poor rust
developper, I have use claude for most of their implementation, and review all
the code multiple times, but please review carefully to be sure.

For kyber, I have added an experimental patch for qemu-server to use gpu
acceleration through DMABUF, but I had some bugs with some resolutions display, 
tested with an amd gpu, I didn't have nvidia hardware to compare.



pve-http-server (1):
  anyevent : proxy a path prefix to a local http proxy

 src/PVE/APIServer/AnyEvent.pm | 263 ++++++++++++++++++++++++++++++++++
 1 file changed, 263 insertions(+)

qemu-server (4):
  add D-Bus display support
  add kyber display
  add rdp display
  add experimental kyber-gl display

 17 files changed, 929 insertions(+), 7 deletions(-)

pve-manager (2):
  ui: add kyber console
  ui: add rdp console

 12 files changed, 1280 insertions(+), 6 deletions(-)

new packages (6):
  pve-qemu-kyber   28 files changed, 7987 insertions(+)
  pve-kyberproxy   16 files changed, 3245 insertions(+)
  pve-kyber-web    13 files changed,  542 insertions(+)
  pve-qemu-rdp     11 files changed,  328 insertions(+)
  pve-rdpproxy     13 files changed, 1802 insertions(+)
  pve-rdp-web      15 files changed, 5055 insertions(+)

--
2.55.0



             reply	other threads:[~2026-08-25 11:35 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-25 11:34 Alexandre Derumier [this message]
2026-08-25 11:34 ` [RFC pve-http-server 01/13] anyevent : proxy a path prefix to a local http proxy Alexandre Derumier
2026-08-25 11:34 ` [RFC qemu-server 02/13] add D-Bus display support Alexandre Derumier
2026-08-25 11:34 ` [RFC qemu-server 03/13] add kyber display Alexandre Derumier
2026-08-25 11:34 ` [RFC qemu-server 04/13] add rdp display Alexandre Derumier
2026-08-25 11:34 ` [RFC qemu-server 05/13] add experimental kyber-gl display Alexandre Derumier
2026-08-25 11:34 ` [RFC pve-manager 06/13] ui: add kyber console Alexandre Derumier
2026-08-25 11:34 ` [RFC pve-manager 07/13] ui: add rdp console Alexandre Derumier
2026-08-25 11:34 ` [RFC pve-kyber-web 10/13] add pve-kyber-web: console's webassembly client Alexandre Derumier
2026-08-25 11:34 ` [RFC pve-qemu-rdp 11/13] Add pve-qemu-rdp: an RDP server for the console Alexandre Derumier
2026-08-25 11:34 ` [RFC pve-rdpproxy 12/13] Add pve-rdpproxy Alexandre Derumier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260825113442.947620-1-alexandre.derumier@groupe-cyllene.com \
    --to=alexandre.derumier@groupe-cyllene.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal