Skip to content

Instantly share code, notes, and snippets.

@magnetikonline
Last active February 23, 2018 05:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magnetikonline/5647761 to your computer and use it in GitHub Desktop.
Save magnetikonline/5647761 to your computer and use it in GitHub Desktop.
Remove old kernel versions from an Ubuntu Linux install.
#!/usr/bin/env python
import re
import subprocess
KERNEL_KEEP_MAX = 3
KERNEL_PACKAGE_REGEXP = re.compile(r'^[a-z]+ +(linux-image-[0-9][^ ]+) +([0-9][^ ]+[0-9])')
def get_installed_kernel_list():
process = subprocess.Popen(['dpkg','--list'],stdout = subprocess.PIPE)
kernel_list = []
for line in process.stdout:
match = KERNEL_PACKAGE_REGEXP.search(line)
if (not match):
continue
kernel_list.append(match.group(1,2))
return kernel_list
def get_sorted_kernel_list(kernel_list):
# correctly sort a Linux kernel version string (e.g. [4.4.0-112.135])
def sorter(a,b):
def get_part_list(value):
return re.split(r'[\.-]',value)
b_list = get_part_list(b)
for a_part in get_part_list(a):
if (not b_list):
# [a] greater than [b]
return 1
# compare parts - as integers if both are digits
b_part = b_list.pop(0)
result = (
cmp(int(a_part),int(b_part))
if (a_part.isdigit() and b_part.isdigit())
else cmp(a_part,b_part)
)
if (result != 0):
# we have a winner
return result
if (b_list):
# [a] less than [b]
return -1
# same value
return 0
return sorted(
kernel_list,
sorter,
key = lambda x: x[1],
reverse = True
)
def main():
# fetch installed kernel list and sort
kernel_list = get_sorted_kernel_list(
get_installed_kernel_list()
)
counter = 0
kernel_keep_list = []
has_removed = False
for kernel_package,kernel_version in kernel_list:
counter += 1
if (counter > KERNEL_KEEP_MAX):
has_removed = True
print('Removing kernel: {0}'.format(kernel_package))
# remove kernel and the 'extra' package
subprocess.call([
'sudo','apt','purge',
kernel_package,
re.sub(r'^(linux-image-)',r'\1extra-',kernel_package)
])
else:
kernel_keep_list.append(kernel_package)
# display remaining kernel versions
if (has_removed):
print('')
print('Remaining kernel versions:\n{0}'.format('\n'.join(kernel_keep_list)))
if (__name__ == '__main__'):
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment