[pve-devel] [PATCH container] fix #4192: add new architecture-dependent path to check for newer versions of systemd

Leo Nunner l.nunner at proxmox.com
Fri Sep 9 13:45:39 CEST 2022


Signed-off-by: Leo Nunner <l.nunner at proxmox.com>
---
In newer versions, libsystemd-shared-*.so is placed in an
architecture-specific folder (e.g. /usr/lib/x86_64-linux-gnu/systemd/). 
I adapted the code to include the current architecture while searching, as 
well as allowing for the addition of further paths, should it change again 
in the future.

 src/PVE/LXC/Setup.pm           |  2 +-
 src/PVE/LXC/Setup/Alpine.pm    |  2 +-
 src/PVE/LXC/Setup/Base.pm      | 33 +++++++++++++++++++++++++--------
 src/PVE/LXC/Setup/Devuan.pm    |  2 +-
 src/PVE/LXC/Setup/Plugin.pm    |  2 +-
 src/PVE/LXC/Setup/Unmanaged.pm |  2 +-
 6 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/src/PVE/LXC/Setup.pm b/src/PVE/LXC/Setup.pm
index b72a18e..6446094 100644
--- a/src/PVE/LXC/Setup.pm
+++ b/src/PVE/LXC/Setup.pm
@@ -285,7 +285,7 @@ sub post_create_hook {
 sub unified_cgroupv2_support {
     my ($self) = @_;
 
-    return $self->protected_call(sub { $self->{plugin}->unified_cgroupv2_support() });
+    return $self->protected_call(sub { $self->{plugin}->unified_cgroupv2_support($self->{conf}) });
 }
 
 # os-release(5):
diff --git a/src/PVE/LXC/Setup/Alpine.pm b/src/PVE/LXC/Setup/Alpine.pm
index b56d895..5d22e69 100644
--- a/src/PVE/LXC/Setup/Alpine.pm
+++ b/src/PVE/LXC/Setup/Alpine.pm
@@ -102,7 +102,7 @@ sub setup_network {
 
 # non systemd based containers work with pure cgroupv2
 sub unified_cgroupv2_support {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
 
     return 1;
 }
diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm
index cc12914..f58edf8 100644
--- a/src/PVE/LXC/Setup/Base.pm
+++ b/src/PVE/LXC/Setup/Base.pm
@@ -517,20 +517,36 @@ sub clear_machine_id {
 # tries to guess the systemd (major) version based on the existence of
 # (/usr)?/lib/systemd/libsystemd-shared<version>.so. It was introduced in v231.
 sub get_systemd_version {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
 
-    my $sd_lib_dir = $self->ct_is_directory("/lib/systemd") ?
-	"/lib/systemd" : "/usr/lib/systemd";
-    my $libsd = PVE::Tools::dir_glob_regex($sd_lib_dir, "libsystemd-shared-.+\.so");
-    if (defined($libsd) && $libsd =~ /libsystemd-shared-(\d+)(?:\..*)?\.so/) {
-	return $1;
+    my $current_arch = $conf->{arch};
+    my %arch_full_names = (
+	"amd64" => "x86_64",
+	"i386" => "i386",
+	"arm64" => "aarch64",
+	"armhf" => "arm"
+    );
+
+    my @search_dirs = (
+	"/lib/systemd", 
+	"/usr/lib/systemd", 
+	"/usr/lib/" . $arch_full_names{$current_arch} . "-linux-gnu/systemd/"
+    );
+
+    foreach my $sd_lib_dir ( @search_dirs ) {
+	next if !$self->ct_is_directory($sd_lib_dir);
+
+	my $libsd = PVE::Tools::dir_glob_regex($sd_lib_dir, "libsystemd-shared-.+\.so");
+	if (defined($libsd) && $libsd =~ /libsystemd-shared-(\d+)(?:\..*)?\.so/) {
+	    return $1;
+	}
     }
 
     return undef;
 }
 
 sub unified_cgroupv2_support {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
 
     # https://www.freedesktop.org/software/systemd/man/systemd.html
     # systemd is installed as symlink to /sbin/init
@@ -542,7 +558,8 @@ sub unified_cgroupv2_support {
     }
 
     # systemd version 232 (e.g. debian stretch) supports the unified hierarchy
-    my $sdver = $self->get_systemd_version();
+    my $sdver = $self->get_systemd_version($conf);
+
     if (!defined($sdver) || $sdver < 232) {
 	return 0;
     }
diff --git a/src/PVE/LXC/Setup/Devuan.pm b/src/PVE/LXC/Setup/Devuan.pm
index 3e15bb2..18cb9cf 100644
--- a/src/PVE/LXC/Setup/Devuan.pm
+++ b/src/PVE/LXC/Setup/Devuan.pm
@@ -42,7 +42,7 @@ sub new {
 
 # non systemd based containers work with pure cgroupv2
 sub unified_cgroupv2_support {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
 
     return 1;
 }
diff --git a/src/PVE/LXC/Setup/Plugin.pm b/src/PVE/LXC/Setup/Plugin.pm
index 8458ad8..d8b3f1f 100644
--- a/src/PVE/LXC/Setup/Plugin.pm
+++ b/src/PVE/LXC/Setup/Plugin.pm
@@ -48,7 +48,7 @@ sub set_user_password {
 }
 
 sub unified_cgroupv2_support {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
     croak "implement me in sub-class\n";
 }
 
diff --git a/src/PVE/LXC/Setup/Unmanaged.pm b/src/PVE/LXC/Setup/Unmanaged.pm
index 3b9febf..e2dd517 100644
--- a/src/PVE/LXC/Setup/Unmanaged.pm
+++ b/src/PVE/LXC/Setup/Unmanaged.pm
@@ -45,7 +45,7 @@ sub set_user_password {
 }
 
 sub unified_cgroupv2_support {
-    my ($self) = @_;
+    my ($self, $conf) = @_;
     return 1; # faking it won't normally hurt ;-)
 }
 
-- 
2.30.2






More information about the pve-devel mailing list