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 A26A61FF0C1 for ; Wed, 26 Aug 2026 09:44:30 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 96DBB21301; Wed, 26 Aug 2026 09:44:29 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K+lGXmdgTolNQ/RadUsHTn3hdSOov5bn4wPSx+GoUyD+WYlNVePkv0zinqqoiOEAkTE4JAq+n/LiLLD37Ecp9sTzyxl6pmfvWdz4/8XEztYYUgxuOBMC1Wi8/T11V6z9h9XZGn6VK3aFhGgT/xIG0hGC9UXewNyMt0++lIuhQkFx7EkeudElRyiN8JZ4rsqJ72m3+Y0TgGHSIJQ3LzRyd+Q+6jo371edxxJf8Reft4u4uFxgWunlyzA4H90rWnS+NCa9q6uWvzuSbQ0qEhHkhhPOcyzBiY7nh3SGfdIeHths2qG7nIbYhq4XNSh1zDNdNOMAg8iYmXElTafxOQGULA== 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=pUnsOhUvxiK1szQdITrf59Y/UchymksNGolA3tDZTtBdRX3DNmGqt+BpaC17ZhXVe56/9ty2zjcP+/RLidmludyo7ni72nj981K0YPehLjVWxibyHpD9O4abTXcOZek2VBriAZQeQEruUBG5uYkojqM+aRPXFLyveWGD+lHHWBt0prhiLexYUuNfPOYfDxTVX9JNaif20IFWR3yLpB+G6ezXI7jKqbHXQdApvRjgryvyH6sarL5CKu1e1wm7I08GsyIVTTMO2ZurYIMRhrRnXc6T05L4VGV2kfQ5Hcu1pg67NHcCo6srafn51Oy7s6isuzBVYaoBXQl9lKTcTs48+w== 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=YnRk+pYhmW2/i69+xQ9+N26kpriSrZxnpZW+1jNavdDzffVJmopzp0J9OyjNSf6YwLt2y+4kv11eNOZpMW0xx/wQApl8JaGoCvYudf/QRJjezQP+4C7Xb2QPLgj41/eSvj27Z5TVAesXee9Q+FxZXf4xNjsJhSpN2jsIbDRvXOY= 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 qemu-server 02/13] add D-Bus display support Date: Wed, 26 Aug 2026 09:43:34 +0200 Message-ID: <20260826074347.1256659-3-alexandre.derumier@groupe-cyllene.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260826074347.1256659-1-alexandre.derumier@groupe-cyllene.com> References: <20260826074347.1256659-1-alexandre.derumier@groupe-cyllene.com> 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: 76d9d960-9544-4e6a-f223-08df0345d40c 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|56012099006|10067099003|14125299003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: zPBVd8+Wi4J7jPQt+tAuQ5zwfC/M7H0mFcTsvLxa6IJu8Fu/unLr8NxU/q6DSFdB9Yi/jQ/TOCKEYAehdukcR3R+TiqsMRfNZXUSoG+Mr5p540rSJTty61C17LoFLEzk/zv+/xC+rJQNPLzqj9MKbo+VsL60rpVU5DOrgM6eS8u84dk3hPRI8l8IGOo9GSRn+ZDpYb/+ElPLiNapjzjmymIR7GnL8TUowwmJ5SxAwm9nqRGH0klD174IQnyr2ObXV0Z9ApHC1wCBR02SnXMDxvlx3/aNMZwhw+fHIAC980vXjWQ+wFvpFUMIGrF8KuXe7U/g8SuK7ArwxXDBtgvfDagAZLxDNPCPPewboaElxqnNJsmE7UssYq4d43RfdEEadg5arkVQRXLWB/xZXfBQYGSebS6JWi2wG/AuUxlctvgqgAEq3tzLAIFEU3+srLokGVsf1FPyzqW+cZhrSICGOpigGszKJvhCV78HtqRr1xmfrT104j0R7IwMFTPdNjThKho1vwpN0hn2r5zAyQ1wRETYsNr7NqUIa98Z45iDYXTHkvrXxziLhOG/lue0sftsPFK45diuA1s1Bd/wbWssMeHbAKOfxiurLQYEICZcZxm+bjRXMA2NGoCw338Ovi7D+4KHUZBtPoWj94ueB+tXKjnZgYVxwDVj85j8mqb3+CNbIhHe/CHr67RuVltTHKXijokesYb/6cCFMa95uD/zoA== 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)(56012099006)(10067099003)(14125299003)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Kl0/4ucB/+i2DpYG8ickS317sT6A33Rdp1IVxzdKPTy8Wc4wzLhLpbnvylVY?= =?us-ascii?Q?wlzuG+hLOFDC2uv6PfIVYbx0RAvH9eV9HVi3aOAJEnLI+cxa59rotKz/vvHp?= =?us-ascii?Q?cYPt8512SwmCdehTBkzvmzPlEqIyPQlzCkmMJBmMuHQrZRZhD9W816qUWkS+?= =?us-ascii?Q?YSJCBWwCi0ifWx/25WjSp8OOMYrjXh7AVJJoGlS3Q/ty151tSmrMtYi4TCwy?= =?us-ascii?Q?AFceMm0qL0kj0U4TgdbSt5tv/hUYp+brPMSBnnCeIhVL72ypzfVAkv3+Ffhe?= =?us-ascii?Q?Q1IqVThlEIkSkZjIcYvlWyHd9WbS+ZqGDLIFvoH0vpMLfri9zB955UEwsurn?= =?us-ascii?Q?/tjwGzzMOp0elLVi+CFlUmDVCCZ/652VUvnpZxQqO6LiATxJyEqRZxunwuQ4?= =?us-ascii?Q?qeqoqxKbPce0gFqOwjMiS2icJgJLWJWdCYZcwp/3f8NHjYIUYS/n6Wx23vmA?= =?us-ascii?Q?+BciifaaA76TRS0GPGukG2HRtJodxEuKEXXzCm0HYHFRFeiwREGY5b8hpBrj?= =?us-ascii?Q?odBnlINwv+sg+CkTqNxAl3yhh88TcLKKx6vWwCP8as4CprY3oDN+my6+FOSD?= =?us-ascii?Q?6Z5xv/gzaZDF/u41hq14wt9tp7zYAbxRG3Ufe1/7SEcFWQQbEWxP3L8ynHiH?= =?us-ascii?Q?Sc9sypFW0MB6p5+gh2Ll7+eMGoDO417Z80+CvmjWXPg92Y6J6aqsXPRh4iDE?= =?us-ascii?Q?ZaXs9RjJhh9dVP0npPfdjQWbRiRTZsqwuHOj9FDOpEwBibxL65ASq1Bm5Z2Q?= =?us-ascii?Q?E06/hjMVgNnFrIJi4wK04ArXNccexxIYMKKmOV84B/Hn3miAxoG8vtlv+s/0?= =?us-ascii?Q?uHscGltO1FvQVLUdthmpr8A52+Tr4m5Nst6hJRj4tg18APLxlJ/w2dTBwOmD?= =?us-ascii?Q?S6Xp0ZPVQXmfZmq9Y+5axcuJRoe9zUzMroWX/tftdQ0lvxBld3L9AloWVSG1?= =?us-ascii?Q?UFUnyk4vNC7W+tOXQz8vbXyKniZ49zatnqXw1dwIgnXeVbmQtnlbIJZWj1Ki?= =?us-ascii?Q?xrHvEAxOZDeuXmUGVI8SgZnsaq/3CiEqJHSzdaY0J4Xe5+Q7shWdAGYndeu8?= =?us-ascii?Q?3MmOzDN/PkUNdRbmEtoVYAqWqKN15iaUu/SPBKA9B4ZYkyA9JpWcetR3CwAf?= =?us-ascii?Q?du0Pp5RMOuBBzzKHTD+O6cgMUsA8CUBs+0UuuCu8ESqpKffsX8dp0xfaUT14?= =?us-ascii?Q?PWjULigo7NtkVWVfS/XrL9BN5oYhVQzsDr4pGsEN/ed3N1OkZacObxPPNyER?= =?us-ascii?Q?hif48mAZXnMfFwsAwiZ+dQg9gw8+9ZuFw+MbnZ/Tn6DBNzxeprwd/B+5foq5?= =?us-ascii?Q?h4kd54By1r5c5qWzh9E7ToOjTCOMnyCIgcHxsiUFfHcSxZRTdCV0LDgs4vzB?= =?us-ascii?Q?FUhN6tSKbeRk7bXeko1z9UiPxqW83wGgAAvlxQWHJtjZ5VEs0GxnOJyfmfz3?= =?us-ascii?Q?7hRX6rj0SwrWyKGa92dWu+4gfRpuwXN7z0IkDxrGKMp3Oe0zbzl1XsleC/gn?= =?us-ascii?Q?CK/+EcAzfvf17FWTa1OuMU3q+0E7NnDvO0DR+/DpGLR36tT/QqW7oaAY8RwG?= =?us-ascii?Q?+T7F1+noRlAUVTipUXvL8X133LHtMBg+R0uX3jKT3kaJBJSN7sZW/tCrovR+?= =?us-ascii?Q?Uyc1tU5xCTO2Vs/lNR1Oze54qUWaqYm0+eBMv4Y7p5rQpzI9/0vbbnfQf+r/?= =?us-ascii?Q?2U/X03gvax2FlULnMLuMjehpuzP25xuazU3qjpOb4/pTxzXQ7tyuvgowwCPp?= =?us-ascii?Q?qgArLn6UlCi/d77I9OCOQgUq/991BkhMhUJtt+lA+SRy2sYMQIl4?= X-OriginatorOrg: groupe-cyllene.com X-MS-Exchange-CrossTenant-Network-Message-Id: 76d9d960-9544-4e6a-f223-08df0345d40c 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:15.5923 (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: x5lUJWcrvvr3j76G/qHqzLcM+xtatqUrNYp1GWdqXZQ0zxhvb0T/AuSRTu5faKQelXZHpeIOoJioNV+KYhNH50DoOdexUin+VBceqgDDQWRNBLSbrS7fu2aV6bHIwHvA X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR0P264MB2257 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.201 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: HOOMUVC5Z2KYTDBWG2AGNB36UVPPJRES X-Message-ID-Hash: HOOMUVC5Z2KYTDBWG2AGNB36UVPPJRES 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