summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWesley Schwengle <wesleys@opperschaap.net>2024-01-23 15:41:33 -0400
committerWesley Schwengle <wesleys@opperschaap.net>2024-01-24 13:23:33 -0400
commita6e30cc02eb24d5b2bbf2cb1b59c48c62d09658f (patch)
tree30a0fdeb6264ae81f53cce85a50780e9a25eaafb
parent2845127968cda30be8423e1d3a24dae0e797bcc8 (diff)
Configure the amount of kernels to keep
This commit introduces the following configuration for keeping a configurable amount of kernels: APT::NeverAutoRemove::KernelCount The logic dictates that the running kernel and the latest kernel are not autoremoved. In case the running kernel is the latest kernel, the previous kernel is kept. Any count lower than two is therefore disregarded. This is in line with the previous behavior. The default is therefore similar to: APT::NeverAutoRemove::KernelCount 2; This will be ignored and we will still keep two: APT::NeverAutoRemove::KernelCount 1; This will keep 3 kernels (including the runnig, and most recent) APT::NeverAutoRemove::KernelCount 3; Signed-off-by: Wesley Schwengle <wesleys@opperschaap.net>
-rw-r--r--apt-pkg/algorithms.cc33
-rw-r--r--doc/examples/configure-index1
2 files changed, 21 insertions, 13 deletions
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index 3d4096a94..0d9b50e2c 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -1554,30 +1554,37 @@ std::string GetProtectedKernelsRegex(pkgCache *cache, bool ReturnRemove)
if (version2unames.size() == 0)
return "";
- auto latest = version2unames.rbegin();
- auto previous = latest;
- ++previous;
-
+ auto versions = version2unames.rbegin();
std::set<std::string> keep;
+ auto keepKernels = (unsigned long)_config->FindI("APT::NeverAutoRemove::KernelCount", 2);
+ if (keepKernels < 2)
+ keepKernels = 2;
+
+ if (Debug)
+ std::clog << "Amount of kernels to keep " << keepKernels << std::endl;
+
if (not bootedVersion.empty())
{
if (Debug)
std::clog << "Keeping booted kernel " << bootedVersion << std::endl;
keep.insert(bootedVersion);
}
- if (latest != version2unames.rend())
- {
- if (Debug)
- std::clog << "Keeping latest kernel " << latest->first << std::endl;
- keep.insert(latest->first);
- }
- if (keep.size() < 2 && previous != version2unames.rend())
+
+ while (keep.size() < keepKernels && versions != version2unames.rend())
{
+ auto v = versions->first;
+ if (v == bootedVersion)
+ {
+ versions++;
+ continue;
+ }
if (Debug)
- std::clog << "Keeping previous kernel " << previous->first << std::endl;
- keep.insert(previous->first);
+ std::clog << "Keeping previous kernel " << v << std::endl;
+ keep.insert(v);
+ versions++;
}
+
// Escape special characters '.' and '+' in version strings so we can build a regular expression
auto escapeSpecial = [](std::string input) -> std::string {
for (size_t pos = 0; (pos = input.find_first_of(".+", pos)) != input.npos; pos += 2) {
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 0d4dd31a5..f37b7696c 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -55,6 +55,7 @@ APT
Build-Profiles "<STRING_OR_LIST>";
NeverAutoRemove "<LIST>"; // list of package name regexes
+ NeverAutoRemove::KernelCount "<INT>"; // Keep the configured amount of kernels
LastInstalledKernel "<STRING>"; // last installed kernel version
VersionedKernelPackages "<LIST>"; // regular expressions to be protected from autoremoval (kernel uname will be appended)
Protect-Kernels "<BOOL>"; // whether to protect installed kernels against autoremoval (default: true)