From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 1AC4B1FF0C1 for ; Wed, 26 Aug 2026 10:17:00 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 4BBEB21301; Wed, 26 Aug 2026 10:16:59 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x5uJFrG7z0znwqtbNTyBH6humIqYIUWxzVeqH0PI5semHdqGnkWx09AWcs8XV6YvaWJiiGWd1hwybBMFM4Bpi9u4T73pU26cXIzOUDcia9DcVrId34r8e32DK4L/gUJued0Rw/QcU4CjIheFvfXWDGe/kEuH3r82CdLg6dl0VuGNjSp7JQ04uhvpbBcMUmx0Myp38DUzDzaTk7A+9GEYaCAZz8T9gsNLro16A/XNuWdJi4GgHCiTM5/I5vOedsnWG7LAB17IthCxjtWR/aaGoE4V6ByNFlnZ4LwxcOBxWSuVvghjtg2BuV6DS7Or1Yh2EJ4XYBKadZS15VID3QoDTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=fMHr+HVu/9nG1dPb1L3mbPf4KpYFxYZf5qcdN7bQl4M=; b=jNzv24q40wM6P69M1KKbSL50a/nIbAv6lQ2u7ir40I7bXCg2EsobsUYCFyCveZKj59nzFS298hLmGg5ah+YJ5INUYUSuly8rQIn5aOFL4RdFj4ELnxP6AfWoCLTWktattY5n3ZNMhX1Rh7w1kOqjQxd2PhKwmXHA5B/qgtlplWNVtewoZUoNZ93uS/fo/VT9wF7tLmXiBkF+ELlkOkDM5O/q22ibOZxwQp8SkCynMCUjLRCZ2CN5CGmJw7HUAZxMwUOMmLkoQn6Gua/RpprdCWaEJogDOTL79CYChe2LOa49DK1u7lP/NwLDlJuZd0Z5W0Iqz9l7qmEwXGc5Jt9QDg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=groupe-cyllene.com; dmarc=pass action=none header.from=groupe-cyllene.com; dkim=pass header.d=groupe-cyllene.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=groupecyllene.onmicrosoft.com; s=selector2-groupecyllene-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fMHr+HVu/9nG1dPb1L3mbPf4KpYFxYZf5qcdN7bQl4M=; b=Nx97pWr7Hn7dWzdPbF2fLO3xPNIlYH8/FPS2QuPD9engs3/gmqytD0I+II6Lfx2k7uH05dUvsd84cIJvln/k1011RKgMQncto+Tzrt2nKxNuIq+Q65Kjvlt3fz/qEq3ei1iPKaPww+NIcq9LEDvOHEtcmUF2wTuMskUalsqeg54= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=groupe-cyllene.com; From: Alexandre Derumier To: pve-devel@lists.proxmox.com Subject: [RFC v2 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: Wed, 26 Aug 2026 09:43:32 +0200 Message-ID: <20260826074347.1256659-1-alexandre.derumier@groupe-cyllene.com> X-Mailer: git-send-email 2.55.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: PA7P264CA0229.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:372::8) To PR1P264MB3696.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:143::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PR1P264MB3696:EE_|PR0P264MB2257:EE_ X-MS-Office365-Filtering-Correlation-Id: fa8402d6-5451-4f14-b010-08df0345d390 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|23010399003|52116014|1800799024|366016|38350700014|6133799003|3023799007|56012099006|10067099003|18002099003; X-Microsoft-Antispam-Message-Info: GVe0e796FlXRM1y1uHr4LYF+hd5utBGsW9SDHj06Gi2WzLpBEUNGujCmfzInVWzceQASzD8cRVXwr/6p/kuUW/qrwi3DPBHVh7Tcw1tUH9JW/Ld1rxsCavl8yUspUsCkcFs9nk3qs5ncu+NDrVApAqmY9v2FqjTVqP+HVeEN2mQBfQm9R+KX1ceEzMbEqayLIncxXbX0jgiktj9Es29W4BYSq4rLGZ+PHSE5SrFYNeyz/my3+JCZNMBXG3ylKnQB4KLWpc2j1ZXqc42xvE6FxiXi+Rt29PM4u+QSjpYW8npO/p3fWmYxtNXmFUFzP/2bGPaT5Dpe+GEhkBCPB9yJVWoRThkWrRTAclXBFQPzkW3fAz3ZVifrIJ4SbJlOILHzzcKTJaFjvTOfTE+aT2WQU/Fc6JDXPGymtDkwvO1tRuGf1uEyCRVaal0xSpsWXY8MlYuqxUDUfcQZBw9lihUFSrrLSfMPu9pX605kWBJTDclx+ZcXi/wcvP9ttjOfFbY93Z4+s24Wt29FIs6uUTxC2whB91rpseku8/3O+MNyiDfbUNoSDq7yH7WgIx5eC8mxEv/aWmcMr7hEQBLD8n8vHjlkwzES868GFWKsjOk1122sdGt14+YdJ1RxqgbLkRfhknvYNnrIGFlHBnuEUJIha+FjoCht6d23wghjEhYBodb7LacIIO2rsj7P656tlUclS7tPFD+5f3nZsH/FRGDr3Y2C4sNHlW4Z0vIxsUUXcpA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PR1P264MB3696.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(23010399003)(52116014)(1800799024)(366016)(38350700014)(6133799003)(3023799007)(56012099006)(10067099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Dcchan2ucgLfQKcXlUyRlvjTfP1FCmY+3Hx0iC7rzZXX4JpjUH1ZjUupzcDF?= =?us-ascii?Q?gly7qrTT2HcoaFgPKUdzI/ylTA2L1crIGFLaTEXM/tOrbvTtaFWdt6vQeWJx?= =?us-ascii?Q?mGtSoJPaQma6n9RoiLPhTGekIEr8aT8gBzzzMf8+Nu/EvLpLxEDL6rTevbAF?= =?us-ascii?Q?OfxtQWEkccGPKazcsVsXIqwR2WtXIm1A4X2fBgR1QZC/nQsPsVg+PbhYg2hc?= =?us-ascii?Q?wAW07t7jSzZbMHnh66l5C9gM7XIZS5e0WD2emm85VjBZ1fFWMbJtGijoVNsJ?= =?us-ascii?Q?bBGHYM21ftt0BAg/l+//1DpnVbqyRxPTga0yImcmfyy6M75UVjl45JFhhawb?= =?us-ascii?Q?wFKF4AR9IaqvfGOpYTa7IgTiZYyNlzCd4fRgvOdiR2M9YTbSwyQRSTpeKfKv?= =?us-ascii?Q?WIgjZGCRO7UTiAjCR084ACSV0MVwt0zsWzqL4Al78FSxX5N+F7ntrYmG5sqp?= =?us-ascii?Q?M3qTtYPUjHfR6BjsqJlNhQCZ1Vzl356gF0Chb3FBv4H66a1Ozbb/mkIOCxor?= =?us-ascii?Q?xzqMJI41HF/xUI5WOl0lhfdWG5BSP/sjpl23oEL4nyaTRKQCjpn0+ibaKvbi?= =?us-ascii?Q?h6xJJIfSAxIDJAw/1/j4bghIdUYMtiK84kAgX0NBNECurto7vFdFWaSBfAwT?= =?us-ascii?Q?pcY+OtEkzW6BFKZgP3P/zgYNPwdR8MVjwqqFk10NBzPiYaB8cOs3HHU20PVc?= =?us-ascii?Q?l+0cmPbiuWJYkgiliBOZVLZZG6L0g3wnhusugdokq6HYo1tuaUXMlwPiE8cX?= =?us-ascii?Q?M4OPmycOueq9BY0VnGt7+RQwq6Ex7jf0mJHQ96gkwdc0gjh+IG87SXb0Wl9N?= =?us-ascii?Q?uVRp0/dmNuDf816pZA7Gzt/1CE84BE51Dp/0xAyYusPVMPfmFBiGcJGVBbiW?= =?us-ascii?Q?vHvBBt1oEaT6pPDXjfuqjAg8ujeuW+jq6kGs9RMymOgPTzCchMRGpzRzzRKc?= =?us-ascii?Q?qLbmejywuOrSrNSGPpOIL0CArFkxcWz5gAv0XZ00Iqd+winpEWJSchkMIaqG?= =?us-ascii?Q?hnzFaS8BklzcWiuffkguChPvWqUm15LlkGya2465eO3YYubSwDa0lRfOUl9W?= =?us-ascii?Q?2XaHK1BRsPFzf/+/T+mVqQI1HMTh+EPhpvdDFl6Xlp/+B+of2z3ikpnCOtDq?= =?us-ascii?Q?E5rO5pNzp+SoHp371w/vxOn8+t+zxU5gY/AxQ1Yjix5xA3/9dw1cQBuBsfK8?= =?us-ascii?Q?PAh7iWCkGXie0of4ULJjUMKAyBlCbY2rFnVfJWZ8BG1RO18hYhkM3Y4rCE53?= =?us-ascii?Q?OgqyebUkiBHNU37RqfSks7OZGSNbfYjrs2LO/cN9aG4DEYS/C1OcOgULR4Qu?= =?us-ascii?Q?/gf6amxTKyQvA55LMw9xFcisR2/ZmYHP2wXiyPnlD0lFFjOH+3I3P1F083Ep?= =?us-ascii?Q?IpQj32R3wMHdR3C0+M7PubM0CsFgtrhfQvuMnEP/ruNptnceJUVsf8iOg40m?= =?us-ascii?Q?mbfg1TyAJ/tiAGcf6FA7bJaDAjiO0Qe1x6jdzv4AWqUvPpQwCJqrmlV3SVAN?= =?us-ascii?Q?hYaNjNQOiMH+woPYOeZR4ySh1ERSK6jdRd1seO/LANoBuP8r2w2U28lkn5oc?= =?us-ascii?Q?V/zsIndsWEBxKynNLPQr+hZmS6LsPnb8bOZs81unDjT/6RVmftIbGl/UOAbL?= =?us-ascii?Q?oi+LNHV7oDzwF/8l44l8vTo/5sVcRcUqv38V7W7yPpaA1/gRRvQtZYGYFUGM?= =?us-ascii?Q?Wb44C5HjTMJfO9tjPpjG8O+3CuOi6NO0hB8Y+p/ty4E9bc8Awn62eWQRzMwR?= =?us-ascii?Q?jKSvhYZzDKZRFfQ8hqL+Rw1z8ubraKkayBSptG9C+9T/Dw/9RM6g?= X-OriginatorOrg: groupe-cyllene.com X-MS-Exchange-CrossTenant-Network-Message-Id: fa8402d6-5451-4f14-b010-08df0345d390 X-MS-Exchange-CrossTenant-AuthSource: PR1P264MB3696.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2026 07:44:14.8358 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: ee11ccf7-112c-4284-848b-f229745e715b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: E528jfpbDCTo2aHnRDUJJrS3RvuSAkVq4ZUChlwDDRH03pzlsKho/AZpbCqKKfajtx6uSUZRYbYx9HO4R2nPqJtmaE8orm/Pey8OjcGoWrEGmO1LcQfx8q1I+vdgW1vc X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR0P264MB2257 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.176 Adjusted score from AWL reputation of From: address DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DMARC_PASS -0.1 DMARC pass policy KAM_ASCII_DIVIDERS 0.8 Email that uses ascii formatting dividers and possible spam tricks RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: PJXOF6NGG2A7VXMD7YL7NHEBSELDVGQ2 X-Message-ID-Hash: PJXOF6NGG2A7VXMD7YL7NHEBSELDVGQ2 X-MailFrom: Alexandre.DERUMIER@groupe-cyllene.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: 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//qemu//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/.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/.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//qemu//rdp/ v +---------------------+ | pveproxy | | checks VM.Console | +---------------------+ | | unix /run/pverdpproxy.sock | path rewritten to // v +----------------------------------+ reads the | pverdpproxy | token from | RDCleanPath: X.224 request, TLS |---> .rdp.env | handshake, certificate chain | (root only) | back to the client, then bytes | +----------------------------------+ | | unix /run/qemu-server/.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/.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. Changes since v1: qemu-server - remove kyber-gl experimental patch. Now use virtio-vga-gl instead vhost-user-gpu. - new patch: add vulkan support to virtio-gl && kyber-gl for gpu offloading pve-qemu-kyber - fix reversed picture on linux boot (virgl scanouts is corrected per scanout) - fix some resolutions not working when width is not divisible by 64, by adding a memory copy fallback instead direct memory access pve-rdpproxy - add keepalive && release websocket on dead client connection Untouched since v1: pve-http-server, pve-manager, pve-kyberproxy, pve-kyber-web, pve-qemu-rdp, pve-rdp-web. 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 virtio-gl : add vulkan option 22 files changed, 936 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, 8096 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, 1840 insertions(+) pve-rdp-web 15 files changed, 5055 insertions(+) -- 2.55.0