all lists on 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal