On 2026-05-09 06:31, Paul wrote:
On Fri, 5/8/2026 9:34 PM, Alan K. wrote:
On 5/8/26 6:45 PM, George wrote:
On 08/05/2026 23:16, Alan K. wrote:
Okay, in update manager there is a checkbox to get update manager to
purge excess kernels.
However I've 3 of them now, and I thought at one time I had 4.
I know how to do it manually.˙˙ Sudo apt autoremove doesn't do it now
with 3.
So what's the key to this?˙˙ It used to do it with the autoremove in
22.2, but seems now, at least on my machine, in 22.3 it don't do it.
Try running this:
sudo apt purge --autoremove
same thing.˙˙ says nothing to remove upgrade or install
For some reason, a search tells me of a "purge-old-kernels" script. Apparently, this is only a valid approach before the year 2012.
I had the same problem, so I wrote a little perl script to do it right.
I also made a systemd service so the script runs at every boot.
Perl program:
#####################################
#!/usr/bin/perl --
use strict;
use warnings;
use v5.34;
use utf8;
use open qw (:std :utf8);
use feature qw (refaliasing declared_refs unicode_strings);
no warnings qw (experimental::refaliasing experimental::declared_refs);
use lib '/opt/Perl/private_modules';
use File::stat;
my ($file, $running);
my (@lines, @kernels, @files);
my (%files);
#
# Constants
#
my $kernels_to_keep = 2; #Aantal oude kernels om te bewaren
print "Starting kernel purge procedure.\n";
#1. Find all installed kernels
@lines = `dpkg --list | grep -i 'linux-image'`;
foreach (@lines) {
if (/^ii\s+linux-image-(\d[\S]+)/) {
push (@kernels, $1);
}
}
#2. Find all images in /boot
@lines = glob ("/boot/vmlinuz*");
foreach (@lines) {
if (/^\/boot\/vmlinuz-(\d[\S]+)/) {
push (@files, $1);
$file = stat ($_);
$files{$file -> mtime} = s/.+vmlinuz-(\d[\S]+)/$1/r;
}
}
#3. Check on equal number of installed kernels and images in /boot
unless (scalar (@kernels) == scalar (keys (%files))) {
die ("Discrepancy between number of installed kernels and kernel
images in /booot\n")
}
#4. Check of each installed kernel has an kernel image
@lines = sort (values (%files));
foreach (0 .. $#lines) {
unless ($lines[$_] eq $kernels[$_]) {
die "Names f kernel images and installed kernels do not match\n";
}
}
#5. Exempt most recent and running kernels
pop (@kernels); #Save most recent kernel
$running = (`uname -r` =~ s/\R\z//r);
@kernels = grep !/$running/, @kernels; #Save running kernel
for (my $i = 0; $i < $kernels_to_keep; $i++) {
pop (@kernels);
}
unless (@kernels) {
print "No kernels to remove.\n";
exit 0;
}
#6. Remove old kernels
foreach (@kernels) {
print "Purging linux_image-$_*\n";
system ("/usr/bin/apt-get -y purge linux-image-$_");
print "Purging linux_headers-$_*\n";
system ("/usr/bin/apt-get -y purge linux-headers-$_");
print "Purging linux_modules-$_*\n";
system ("/usr/bin/apt-get -y purge linux-modules-$_");
}
exit 0;
############################
Service file:
###############################
[Unit]
Description=Purge old kernels
[Service]
Type=simple
ExecStart=/usr/bin/perl /root/.misc_programs/purge_kernels.pl
Restart=no
WorkingDirectory=/root/.misc_programs
[Install]
WantedBy=multi-user.target
################################
YMMV, no guarantees.
--- PyGate Linux v1.5.14
* Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)