From: Robert Obkircher <r.obkircher@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v4 pve-container 2/5] Propagate prestart-hook warnings to task-log.
Date: Thu, 13 Nov 2025 16:03:00 +0100 [thread overview]
Message-ID: <20251113150342.101933-3-r.obkircher@proxmox.com> (raw)
In-Reply-To: <20251113150342.101933-1-r.obkircher@proxmox.com>
Add a callback to the LXC setup plugins to allow custom logging when
the RESTEnvironment is not available and use it to redirect warnings
to a file during the prestart-hook.
Only calls to RESTEnvironment::log_warn were migrated, calls to "warn"
are left unmodified for now.
Signed-off-by: Robert Obkircher <r.obkircher@proxmox.com>
---
src/PVE/LXC/Setup.pm | 9 ++++++---
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 | 24 +++++++++++-------------
6 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm
index 87330c4..57b8df1 100644
--- a/src/PVE/LXC/Setup.pm
+++ b/src/PVE/LXC/Setup.pm
@@ -6,6 +6,7 @@ use warnings;
use POSIX;
use Cwd 'abs_path';
+use PVE::RESTEnvironment;
use PVE::Tools;
use PVE::LXC::Setup::Alpine;
@@ -97,11 +98,13 @@ my $autodetect_type = sub {
};
sub new {
- my ($class, $conf, $rootdir, $type) = @_;
+ my ($class, $conf, $rootdir, $type, $log_warn) = @_;
die "no root directory\n" if !$rootdir || $rootdir eq '/';
- my $self = bless { conf => $conf, rootdir => $rootdir }, $class;
+ $log_warn ||= sub { PVE::RESTEnvironment::log_warn(@_); };
+
+ my $self = bless { conf => $conf, rootdir => $rootdir, log_warn => $log_warn }, $class;
my $os_release = $self->get_ct_os_release();
@@ -121,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 bb4a12b..2e1c84c 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 73125e1..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,12 +153,12 @@ PVE::LXC::Tools::lxc_hook(
PVE::LXC::Config->foreach_passthrough_device($conf, $setup_passthrough_device);
- my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir);
+ 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
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-11-13 15:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-13 15:02 [pve-devel] [PATCH v4 pve-container 0/5] warn that nesting may be required Robert Obkircher
2025-11-13 15:02 ` [pve-devel] [PATCH v4 pve-container 1/5] Ensure that container startup warnings are displayed if startup fails Robert Obkircher
2025-11-13 16:14 ` Fiona Ebner
2025-11-13 15:03 ` Robert Obkircher [this message]
2025-11-13 16:36 ` [pve-devel] [PATCH v4 pve-container 2/5] Propagate prestart-hook warnings to task-log Fiona Ebner
2025-11-13 15:03 ` [pve-devel] [PATCH v4 pve-container 3/5] fix #6897: warn that nesting may be required for systemd Robert Obkircher
2025-11-13 15:03 ` [pve-devel] [PATCH v4 pve-container 4/5] fix #6897: constrain and untaint path for systemd version detection Robert Obkircher
2025-11-13 15:03 ` [pve-devel] [PATCH v4 pve-container 4/5] fix #6897: constrain and untaint path when detecting systemd version Robert Obkircher
2025-11-13 15:03 ` [pve-devel] [PATCH v4 pve-container 5/5] fix #6897: also warn in the post_clone and post_create hooks Robert Obkircher
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251113150342.101933-3-r.obkircher@proxmox.com \
--to=r.obkircher@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.