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 61D0D1FF0B7 for ; Tue, 25 Aug 2026 13:35:13 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 84DE5215AD; Tue, 25 Aug 2026 13:35:12 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tUJYcqYo5iUKXrv9YhvGcBD6PFD9OK8Cke95TxpIwx8D5NR3m7zHWB/SmxjWgLT9L2a34dc8wOBJxzHsBZwSUoH/pB2K/LrUx1XYtoBaRUP9858yYBj+z2FGi+XJXzsHA9s7NByHzZjEH06sqSAmMV8OzZQ9mwSDKhExxWauuq+XKaUX+74Ob0r9yu1zsPHLq5PFo0rKXiwIJdqqoyC7+oTX6AmxHLq+ONBKhijhsbwsyZcMm2JBbOQcm3tlLMpu18RJsV8djM77OnI3bJra5Y45AoorGpeGCAzTGezx4KT7AGsKkplZ9CQegMb0WCeFUtCPXLpIsiIVslDPPMH2TQ== 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=BNZjQByvTwGuCUsVftqQpe+VvQH2tiIDSlggoxgcxBY=; b=LLrRI9NFVJRIS9U7m9i6p+jidrvA3nADWq1WKdy40cnZTeo6D/rUesoHgcRSZifFK9fTMuNehGcl1LUuJqcJKLyMOljCHCWgI/dKPdh3hkFZGaKFMFVVKuJZG5Oa6vBAEh85KGl8E0GNnOjFDe32THhDHmHMLxuUlBDUvo0OLCrMa25pnZa6eiGWqina+zoqca0gG0rKrNXjrKznB7xenZvtitesZW0+2kQoqtWqMhKN8TWo96oNv3ZjpBosj5K3dceIXlFZIEH8RfvB+VTmegj0P3ExOjkJW9N+Zgp+Segxu6Y5vJhsRbZEN0CamljXGosZxi4gcFpXA2j+yGh1RA== 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=BNZjQByvTwGuCUsVftqQpe+VvQH2tiIDSlggoxgcxBY=; b=TgoS2PvK38ZTMmy6wsuXzPx/r/e9+Cph7MZ7bZPXYLRcgy6ElgbeGwXpJWDhat0zQjNwGcfAbJy/yTbZJtdbHvvqwmK5BD+hfL2vWwe6YP57TZ9U6otoJghImUUsf9+Yd4j2sNOHSTSBjEkrsTncBjoyDIcLv0S6QeHdqpJEMcY= 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 qemu-server 02/13] add D-Bus display support Date: Tue, 25 Aug 2026 13:34:27 +0200 Message-ID: <20260825113442.947620-3-alexandre.derumier@groupe-cyllene.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260825113442.947620-1-alexandre.derumier@groupe-cyllene.com> References: <20260825113442.947620-1-alexandre.derumier@groupe-cyllene.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: PR3P192CA0021.EURP192.PROD.OUTLOOK.COM (2603:10a6:102:56::26) To PR0P264MB3691.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:14b::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PR0P264MB3691:EE_|PATP264MB7783:EE_ X-MS-Office365-Filtering-Correlation-Id: f5fd596e-8bfd-484b-81ab-08df029ce451 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|1800799024|23010399003|366016|38350700014|6133799003|56012099006|10067099003|18002099003|14125299003|22082099003; X-Microsoft-Antispam-Message-Info: F8zxlW5Nft+eAjWH5AYk4zFZ2RCvUf7nLaCYA5uQBUsGwMi7f9HHeL5CX+6WmSz3vneflfX8eN68Wgy1HhjQGq1I94H+orlx1Pzgm9Sk8rV46J7RQBvHcX+wb0kYLmJex+HbsI7mWrcxS9xlnVYJbfuGBngpcfjv3XHcbGCEko4g1mMFdR1RoDs/s+B54WGWyzL57AzzscpIjdLM7w3p59gIQOSI4Y17sn2H035uvB4rv4P1ZDrKJ6QHpDNmnmKmL91IfUEXiWGQvA34MV4K61fdZv6ri63u5i1UbrN8lrmWJGHtiIYoljqni1BbMUDINJYG+KTNLuKGBuopy/mOdk7hzv9QKDMiklRd2+XDb2UmDqmovfzg8DTia7644s1MDdVnIi+hqMhdx+NGiu6lTmUz3G54eaQ01o8G2Ixu8yPUB8GOCML1gz/tZr4ooNwwl46hYLqQ6+JoHyRpsTSI0LTNyYZdRa9hAEXbIFewnFc3E/Pc/Vc5gHtZ1h7bxshvExKzEg0tXE0eghCR4B3AFrJ3xKPESbPQ9dKlr2bjdz/sHukOZz9/Rnw7xqw0tjeF20/pFyRp3Ic0IH6L3bXMZzpQDUfRZMGQ0kVMi4zfNx9u/Jbz3UajaSUPqOvKNeKm4HJEfHUclU1Miz8ZQsZ9HHDOaa8231kfLXzLCm03KKIEP/MY2ee6CN14B9ywEJbeO/yPUOao+jWCNU6vI441TQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PR0P264MB3691.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(1800799024)(23010399003)(366016)(38350700014)(6133799003)(56012099006)(10067099003)(18002099003)(14125299003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vNe3TNOBms+otq+ioSGZ0ZNHrxEQY01P7o1yHX6EPKrKitsAfdTxpS0oMk6t?= =?us-ascii?Q?aiGsddhs69sR23351jaqVS4ffKQRT3o49BAnIF3iqnKmdgHtvS1rzY/aVWSu?= =?us-ascii?Q?ZJ7iie+McmFMSFRms/POCSDqzjmDzIczVMm1nNS/wlkxGMAlzmdVbflIi1Tu?= =?us-ascii?Q?5/hMttCKuqWUzCbgZIAraUKFk2LS4vUjjG7L1f7GI3/OawPNvfN79IvrnCeL?= =?us-ascii?Q?xGg2at2HzP/ozdmWxeiK/VAdcBd2LaK6rV5abgX/O2soaXNFY8hB/B9sRspk?= =?us-ascii?Q?VE9x5U0GknsaaRBGfJ+QrJSrJzf1XpTtCnOMm6hgaX6DceDj2EoGyMtpOPaF?= =?us-ascii?Q?Vs3B5RhruVG7PEZjdy71qV0PCdgs6jl/GRAI/p+w5BsspZ8j4N5lncwyzM70?= =?us-ascii?Q?/FEV5Z+ShNsVqVAouIqcjGQLIMYUCvnRcfE7B0XOqJLbWBOpRI77W4JzTQ/T?= =?us-ascii?Q?9TQlCjhQSWf/dXq+aC8XL222oVffjGEybgEyqMKadTDHuWE9QQMXwhbcbRx3?= =?us-ascii?Q?cZZYprljvifbwAj4BTbJG8YO8PGMutLBzNVjnS9OIG0dsJO15yOcGeh4dXJg?= =?us-ascii?Q?EitE46l8zp2EeKid3tSkGFaLreYoNoiX2gETquQAgazXP18KsJmpHQyR9vjp?= =?us-ascii?Q?eAhottONMW7JTzpn2j0LQ13ziAKC9tfScU2tPVKjeqRRmGTgqitP/3lBR/VL?= =?us-ascii?Q?2r8uux9R/gQaD4vPiw3vrFBn9MAsIeLrTBYFNdq8li61eKstkYzyO65+E6Y+?= =?us-ascii?Q?6ddMHm+2qBE1b/q01ww2IY/bDpejaeJcB/Argi03yNNkwm3wrgWhMWHADHgl?= =?us-ascii?Q?+RImaESQo9nyIwmvuIrANnO5Ga1f/naxbkhkwo9Qos3glVB7AT8OAf2/MhQR?= =?us-ascii?Q?sEIZIy34PfbVfqKqq9BjC1xLxvN9qveSsapCxNi2Vkm02H98KHLpGnf5arJS?= =?us-ascii?Q?JVbGLAlu2HnQbXU49MaQeV8PzE7qZIwZ7eFIjE3hwfXKAs6pHWYtcLVWHKQ+?= =?us-ascii?Q?1O6dQTRH0e5RiuYazz7lxuIv2uZ7+zUJUwZgx5nmkEsPD+kLhjCTh0LnZ2ON?= =?us-ascii?Q?+YizYN8L5WRkApAbnGPfCMfUFz5ubiiOTI4nBlGDJ5heKRtlBTZaw58Gr4IA?= =?us-ascii?Q?bOa92ioKkrnB5yjCGDxpusa9GufHD0vu4z+zzY8tV2KKp1GQo9Xkj9nMbHE2?= =?us-ascii?Q?lS7ETdPtvjKr8u9490LyAE3tr2zkhj61+dyyKnjvETOx+2PTIKyLxr4PGBzt?= =?us-ascii?Q?vIeMT42R/kyIExbUjpjP0ydGpXnoF8BcysJvxLnLgaSMImaYvdAOWn0p/a2G?= =?us-ascii?Q?ASFuv9pZgMVNKbnGaMamB2yhrP0t6TAcewTCtC9+DYaP6M8ERlLcyIU5Ipo9?= =?us-ascii?Q?EgYS5XqZXdYPRBwUpOi50XaLQ1GVE3/eavF9SWcVezIG1f0faRWe6IfXWHYG?= =?us-ascii?Q?+oQ00reXo3qZCpjOzumyx4q3tD9v2WB5QX9EuMezUTUXeEIyaQkcvdauU2J4?= =?us-ascii?Q?Bu9yc3X7mZ8XndRghOwANC1ocEuE2hKqT6OMAgFWJG04hjirOyc5+69r9iKx?= =?us-ascii?Q?sj6KRL9x6U4j0D1SCaR6QLAGZ3MbA1j/RhGCLLXkTgkQ2Jef31fTgpCONfLF?= =?us-ascii?Q?p3RBW6jA7/QflmOPQWQlJ23wpG83mHgCRIJPJiNhiQ0t6wBpsDd6WFCtdTCr?= =?us-ascii?Q?0xgOJaoKfu4y37h+cDesHpaQgQajkZmVK9WDO02vJGDi5DT+i9+vrZ8LCQqm?= =?us-ascii?Q?Jpm3Vh+XtAX0DPkg0lavwUzetleqxzSw7czA3Rn+RxjEhRI87zZu?= X-OriginatorOrg: groupe-cyllene.com X-MS-Exchange-CrossTenant-Network-Message-Id: f5fd596e-8bfd-484b-81ab-08df029ce451 X-MS-Exchange-CrossTenant-AuthSource: PR0P264MB3691.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Aug 2026 11:34:58.0607 (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: bcQyGCNXZ/sodaelGDiPaLo+Sglf4cCGucIsJ5lXH7yXs6LXaqSQBEV31DwOtO00TId7Uxm1vMXBuwZWDgmy0ZY+hWP1qBd5WXFR5P289LFZ2ar+isSxZtol7QuwNucK X-MS-Exchange-Transport-CrossTenantHeadersStamped: PATP264MB7783 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.000 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 RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: VBXIWYPYE7ZFUX4VLT4KWTI3XEV54MUD X-Message-ID-Hash: VBXIWYPYE7ZFUX4VLT4KWTI3XEV54MUD 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: Add a private D-Bus daemon per VM for QEMU's -display dbus. Signed-off-by: Alexandre Derumier --- src/PVE/QemuServer/DBusDisplay.pm | 100 ++++++++++++++++++++++++++++++ src/PVE/QemuServer/Helpers.pm | 6 ++ 2 files changed, 106 insertions(+) create mode 100644 src/PVE/QemuServer/DBusDisplay.pm diff --git a/src/PVE/QemuServer/DBusDisplay.pm b/src/PVE/QemuServer/DBusDisplay.pm new file mode 100644 index 0000000..b8684be --- /dev/null +++ b/src/PVE/QemuServer/DBusDisplay.pm @@ -0,0 +1,100 @@ +package PVE::QemuServer::DBusDisplay; + +# A private D-Bus bus per VM for QEMU's -display dbus. QEMU connects to the +# address rather than creating it, and every QEMU wants to own org.qemu, so the +# session bus would cap a node at one VM. libvirt does the same. + +use strict; +use warnings; + +use Time::HiRes qw(usleep); + +use PVE::ProcFSTools; +use PVE::Tools qw(file_set_contents); +use PVE::QemuServer::Helpers; + +sub config_file { + my ($vmid) = @_; + return "$PVE::QemuServer::Helpers::var_run_tmpdir/$vmid.dbusdisplay.conf"; +} + +sub pidfile { + my ($vmid) = @_; + return "$PVE::QemuServer::Helpers::var_run_tmpdir/$vmid.dbusdisplay.pid"; +} + +sub write_config { + my ($vmid) = @_; + + my $socket = PVE::QemuServer::Helpers::dbus_socket($vmid); + my $pidfile = pidfile($vmid); + + my $conf = <<"EOF"; + + + org.qemu + unix:path=$socket + $pidfile + EXTERNAL + + + + + + +EOF + + my $path = config_file($vmid); + file_set_contents($path, $conf, 0600); + + return $path; +} + +# Called inside the VM's systemd scope, so it dies with the VM, as swtpm does. +sub start { + my ($vmid) = @_; + + stop($vmid); # a survivor from an unclean stop still holds the socket + + my $config = write_config($vmid); + unlink PVE::QemuServer::Helpers::dbus_socket($vmid); + + PVE::Tools::run_command( + ['dbus-daemon', "--config-file=$config", '--fork'], + errmsg => "failed to start D-Bus daemon for VM $vmid", + ); + + return; +} + +sub stop { + my ($vmid) = @_; + + my $pidfile = pidfile($vmid); + if (my $pid = eval { PVE::Tools::file_read_firstline($pidfile) }) { + if ($pid =~ m/^(\d+)$/) { + $pid = $1; + kill('TERM', $pid); + + # Waited for: a dying daemon unlinks the new socket and holds the VM's scope + # cgroup open, which blocks the next start. + for (my $waited = 0; $waited < 5; $waited += 0.05) { + last if !PVE::ProcFSTools::check_process_running($pid); + usleep(50_000); + } + if (PVE::ProcFSTools::check_process_running($pid)) { + warn "D-Bus daemon for VM $vmid did not exit, killing it\n"; + kill('KILL', $pid); + } + } + } + + unlink $pidfile; + unlink config_file($vmid); + unlink PVE::QemuServer::Helpers::dbus_socket($vmid); + + return; +} + +1; diff --git a/src/PVE/QemuServer/Helpers.pm b/src/PVE/QemuServer/Helpers.pm index dd17eef..816f7aa 100644 --- a/src/PVE/QemuServer/Helpers.pm +++ b/src/PVE/QemuServer/Helpers.pm @@ -140,6 +140,12 @@ sub vnc_socket { return "${var_run_tmpdir}/$vmid.vnc"; } +sub dbus_socket { + my ($vmid) = @_; + # dbusdisplay, not dbus: keep it apart from the dbus-vmstate helper's files. + return "${var_run_tmpdir}/$vmid.dbusdisplay"; +} + # Parse the cmdline of a running kvm/qemu-* process and return arguments as hash sub parse_cmdline { my ($pid) = @_; -- 2.55.0