+sub kernel_version {
+ my $line = PVE::Tools::file_read_firstline("/proc/version");
+
+ if ($line && $line =~ m|^Linux\sversion\s((\d+(?:\.\d+)+)-?(\S+)?)|) {
+ my ($fullversion, $version_numbers, $extra) = ($1, $2, $3);
+
+ # variable names are the one from the Linux kernel Makefile
+ my ($version, $patchlevel, $sublevel) = split(/\./, $version_numbers);
+
+ return wantarray
+ ? (int($version), int($patchlevel), int($sublevel), $extra, $fullversion)
+ : $fullversion;
+ }
+
+ return (0, 0, 0, '', '');
+}
+
+# Check if the kernel is at least $major.$minor. Return either just a boolean,
+# or a boolean and the kernel version's major.minor string from /proc/version
+sub check_kernel_release {
+ my ($major, $minor) = @_;
+
+ my ($k_major, $k_minor) = kernel_version();
+
+ my $ok;
+ if (defined($minor)) {
+ $ok = $k_major > $major || ($k_major == $major && $k_minor >= $minor);
+ } else {
+ $ok = $k_major >= $major;
+ }
+
+ return wantarray ? ($ok, "$k_major.$k_minor") : $ok;
+}
+