[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