[pve-devel] [PATCH v3 pve-container 2/2] Propagate prestart-hook warnings to task-log.

Robert Obkircher r.obkircher at proxmox.com
Tue Oct 28 11:35:48 CET 2025


Replace RESTEnvironment::log_warn in the setup plugins with the
callback that writes them to a file during the prestart-hook. Also
improve the callback so it works inside the protected_call chroot.

Calls to "warn" are left unmodified for now.

Signed-off-by: Robert Obkircher <r.obkircher at proxmox.com>
---
 src/PVE/LXC/Setup.pm        |  2 +-
 src/PVE/LXC/Setup/Base.pm   |  2 +-
 src/PVE/LXC/Setup/Debian.pm |  5 ++---
 src/PVE/LXC/Setup/Plugin.pm |  2 +-
 src/PVE/LXC/Setup/Ubuntu.pm |  5 ++---
 src/lxc-pve-prestart-hook   | 25 +++++++++++--------------
 6 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm
index da2df5d..500b63c 100644
--- a/src/PVE/LXC/Setup.pm
+++ b/src/PVE/LXC/Setup.pm
@@ -124,7 +124,7 @@ sub new {
 
     my $plugin_class = $plugins->{$type} || die "no such OS type '$type'\n";
 
-    my $plugin = $plugin_class->new($conf, $rootdir, $os_release);
+    my $plugin = $plugin_class->new($conf, $rootdir, $os_release, $log_warn);
     $self->{plugin} = $plugin;
     $self->{in_chroot} = 0;
 
diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm
index 671e8c8..829b685 100644
--- a/src/PVE/LXC/Setup/Base.pm
+++ b/src/PVE/LXC/Setup/Base.pm
@@ -24,7 +24,7 @@ use PVE::LXC::Tools;
 use base qw(PVE::LXC::Setup::Plugin);
 
 sub new {
-    my ($class, $conf, $rootdir, $os_release) = @_;
+    my ($class, $conf, $rootdir, $os_release, $log_warn) = @_;
 
     return bless { conf => $conf, rootdir => $rootdir, os_release => $os_release }, $class;
 }
diff --git a/src/PVE/LXC/Setup/Debian.pm b/src/PVE/LXC/Setup/Debian.pm
index 030d934..dbb5050 100644
--- a/src/PVE/LXC/Setup/Debian.pm
+++ b/src/PVE/LXC/Setup/Debian.pm
@@ -6,7 +6,6 @@ use warnings;
 use PVE::Tools qw($IPV6RE);
 use PVE::LXC;
 use PVE::Network;
-use PVE::RESTEnvironment qw(log_warn);
 
 use File::Path;
 
@@ -20,7 +19,7 @@ use constant {
 };
 
 sub new {
-    my ($class, $conf, $rootdir) = @_;
+    my ($class, $conf, $rootdir, $os_release, $log_warn) = @_;
 
     my $version = PVE::Tools::file_read_firstline("$rootdir/etc/debian_version");
 
@@ -47,7 +46,7 @@ sub new {
     die "Container Debian version '$version' is too old\n" if $version < DEBIAN_MINIMUM_RELEASE;
 
     if ($version >= (DEBIAN_MAXIMUM_RELEASE + 1)) { # also allow all MAX.X point releases.
-        log_warn("The container's Debian version '$version' is newer than the tested version '"
+        $log_warn->("The container's Debian version '$version' is newer than the tested version '"
             . DEBIAN_MAXIMUM_RELEASE
             . "'. While everything may work fine, full compatibility cannot be guaranteed."
             . " Please check for PVE system updates.\n");
diff --git a/src/PVE/LXC/Setup/Plugin.pm b/src/PVE/LXC/Setup/Plugin.pm
index b9d9c2d..fbcfa8e 100644
--- a/src/PVE/LXC/Setup/Plugin.pm
+++ b/src/PVE/LXC/Setup/Plugin.pm
@@ -8,7 +8,7 @@ use warnings;
 use Carp;
 
 sub new {
-    my ($class, $conf, $rootdir, $os_release) = @_;
+    my ($class, $conf, $rootdir, $os_release, $log_warn) = @_;
     croak "implement me in sub-class\n";
 }
 
diff --git a/src/PVE/LXC/Setup/Ubuntu.pm b/src/PVE/LXC/Setup/Ubuntu.pm
index e364fa8..a213541 100644
--- a/src/PVE/LXC/Setup/Ubuntu.pm
+++ b/src/PVE/LXC/Setup/Ubuntu.pm
@@ -5,7 +5,6 @@ use warnings;
 
 use PVE::Tools;
 use PVE::LXC;
-use PVE::RESTEnvironment qw(log_warn);
 
 use File::Path;
 
@@ -43,7 +42,7 @@ my $known_versions = {
 };
 
 sub new {
-    my ($class, $conf, $rootdir) = @_;
+    my ($class, $conf, $rootdir, $os_release, $log_warn) = @_;
 
     my $lsb_fn = "$rootdir/etc/lsb-release";
     my $lsbinfo = PVE::Tools::file_get_contents($lsb_fn);
@@ -64,7 +63,7 @@ sub new {
         # cannot support 16.10 or older, their systemd is not cgroupv2 ready
         die "unsupported ancient Ubuntu version '$version'\n" if $major < 17;
 
-        log_warn("The container's Ubuntu version '$version' is not in the known version list."
+        $log_warn->("The container's Ubuntu version '$version' is not in the known version list."
             . " As it's newer than the minimum supported version it's likely to work OK, but full"
             . " compatibility cannot be guaranteed. Please check for PVE system updates.\n");
     } else {
diff --git a/src/lxc-pve-prestart-hook b/src/lxc-pve-prestart-hook
index 0e69630..f5dd728 100755
--- a/src/lxc-pve-prestart-hook
+++ b/src/lxc-pve-prestart-hook
@@ -28,17 +28,6 @@ eval {
     $have_sdn = 1;
 };
 
-my $WARNFD;
-
-sub log_warn {
-    my ($vmid, $message) = @_;
-
-    if (!defined($WARNFD)) {
-        open($WARNFD, '>', "/run/pve/ct-${vmid}.warnings");
-    }
-    print $WARNFD "$message\n";
-}
-
 PVE::LXC::Tools::lxc_hook(
     'pre-start',
     'lxc',
@@ -53,6 +42,15 @@ PVE::LXC::Tools::lxc_hook(
 
         PVE::RESTEnvironment->setup_default_cli_env();
 
+        my $warn_file = "/run/pve/ct-${vmid}.warnings";
+        # open eagerly so logging works inside the protected_call chroot
+        open(my $warnfd, '>', $warn_file) or die "Failed to open $warn_file: $!";
+        my $log_warn = sub {
+            my ($message) = @_;
+            print $warnfd "$message\n";
+            $warnfd->flush; # required because protected_call calls POSIX::_exit
+        };
+
         return undef if !-f PVE::LXC::Config->config_file($vmid);
 
         my $conf = PVE::LXC::Config->load_config($vmid);
@@ -155,13 +153,12 @@ PVE::LXC::Tools::lxc_hook(
 
         PVE::LXC::Config->foreach_passthrough_device($conf, $setup_passthrough_device);
 
-        my $warn_sub = sub { log_warn($vmid, @_); };
-        my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir, undef, $warn_sub);
+        my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir, undef, $log_warn);
         $lxc_setup->pre_start_hook();
 
         if (PVE::CGroup::cgroup_mode() == 2) {
             if (!$lxc_setup->unified_cgroupv2_support()) {
-                log_warn(
+                $log_warn->(
                     $vmid,
                     "old systemd (< v232) detected, container won't run in a pure cgroupv2"
                         . " environment! Please see documentation -> container -> cgroup version.",
-- 
2.47.3





More information about the pve-devel mailing list