Tell me more ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

Every time I install a new Linux kernel, it gets left in the grub config, making the boot menu longer each time.

I know I can manually search through the installed packages and remove them, but does Ubuntu provide any easier way to clean them up or keep them from showing in the boot list?

share|improve this question

21 Answers

up vote 53 down vote accepted
+100

11.10 and newer versions of Ubuntu

GRUB2 and its display of all kernels

The latest versions of Grub2 installed in Ubuntu automatically display the latest kernel and hides the older kernels that you may have installed.

enter image description here

If you do not see your grub - then remember to press SHIFT whilst booting.

As you can see, only the latest kernel is displayed.

If you select the option shown (press Enter) then all the old kernels become visible and available to boot from.

enter image description here

How to permanently delete ALL older kernels using the shell

This will remove ALL versions but the current:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get purge

You can run this command as a cron job, if you add the -y option after "apt-get". However this is not wise, as you should ALWAYS have an old kernel or two to fall back to (just in case the new one doesn't work with your system). Read on for a saver, more manual way.

How to permanently delete older kernels

First boot with the latest available kernel.

There are a number of ways to delete old kernels. Personally, I wouldn't touch Computer Janitor since this is acknowledged to break your computer with its suggestions.

synaptic

An alternative is Synaptic (sudo apt-get install synaptic)

search for linux-image, right-click a kernel and choose complete removal and finally click the Apply button to delete the kernel.

enter image description here

Repeat the search but this time for linux-header - you can delete the associated headers for the kernel image chosen previously.

Synaptic though will not attempt to verify what you are trying to remove... you could inadvertently delete your newest kernel - or even delete all of your kernels via this tool leaving you with an unbootable Ubuntu!

Remember to check which kernel you are using type:

uname -r

The result would be similar to:

enter image description here

Remember the result and the number - make sure you don't delete the corresponding image or header.

Ubuntu-tweak

IMHO, the best GUI tool is Ubuntu-Tweak

It is not available from the standard repositories. To install you need to use the author's PPA:

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

enter image description here

Choose the options shown by the arrows.

Select both the headers and image with the same version number.

It will not allow you to delete the current kernel you are booted with since the current kernel is not displayed.

Recommendation

My recommendation is to keep at least two or preferably three kernels including the latest. The reason for the recommendation is that you will have at least one/two other kernels to boot with, if for what-ever reason the latest kernel you are unable to boot with or introducing a regressed capability such as broken wireless.

share|improve this answer
1  
Removing old "linux-image*" packages using synaptic, worked well with 10.04 too. (I mention it because the title suggests it may only be for 11.10 and up) – mivk May 17 '12 at 16:35

Removing Entries from Grub 2 Entries should be removed by editing or removing files in the /etc/grub.d folder. The /boot/grub/grub.cfg file is read-only and should not normally require editing.

Too Many Kernels?

  • If you are not sure of the kernel you are currently using, in a terminal type uname -r.

  • Kernels removed via APT (Synaptic, "apt-get remove", etc.) will automatically update grub.cfg and no user action is required.

  • A great tool for removing kernels (and menu entries) is Ubuntu-Tweak, a safe and easy-to-use GUI app.

  • Install ubuntu tweak

  • Ubuntu-Tweak will be available under Applications > System Tools.

Remove Older Kernel Entries

  • Select "Package Cleaner" on the left and "Clean Kernel" from the right panel.

  • Press the "Unlock" button at the lower right, enter your password.

  • Select from the displayed list the kernel images and headers you wish to remove. The kernel in use is not listed.

  • Press the "Cleanup" button at the lower right to remove the selected kernel images and headers.

Remove Operating Systems from the Grub menu

  • Other Operating Systems which have been removed from the computer will also be removed from the menu once "update-grub" is run as root.

  • Menu items are placed on the Grub2 menu by scripts. If you don't want other Operating Systems to be entered in the menu, disable /etc/grub.d/30_osprober

  • Run this command to stop the script from running
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER='true' in /etc/default/grub

Remove Memtest86+ from the Grub Menu
sudo chmod -x /etc/grub.d/20_memtest86+

  • Run the update-grub command to allow the changes to be incorporated in grub.cfg

Source

Note: After kernel updates a new entry is added to the GRUB menu.You can remove the older one if you want.However, most experienced users will advise you to keep at least one spare entry in case something goes wrong with an upgrade and you need to boot an older kernel version for troubleshooting purposes.

Alternate way to remove Kernel entries (prior to 10.04)

for GRUB not GRUB2

startupmanager Install startupmanager

You can find it under System>>Administration>> alt text
alt text
You see in the second screenshot you can select how many kernels to show? I generally just keep it on 1, but when I get a kernel upgrade I always change it to 2 before restarting so I can select the older kernel if the new kernel has problems with my hardware. Once I know the new kernel is working well I change it back to 1.

share|improve this answer
2  
Actually, startupmanager dint give me a window like this on Ubuntu 10.04, instead it just gave a window with two tabs -> Boot options and Advanced.. and in advanced it dint have the option to limit the number of kernels. So please update the answer for Ubuntu 10.04.(And thats why i down-voted this..) – Sen Dec 13 '10 at 5:12
any idea how "number of kernels to keep" can be defined on a machine that has no GUI installed (server)? – sylvainulg Mar 28 at 9:24

Purely commandline, this will remove all but the current and second most current (via the "-2" in the head command below):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- | \
    awk '"'"'{print "linux-image-" $0}'"'"' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge
share|improve this answer
3  
one-liner from there: dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge – Dmitry Paskal Aug 5 '12 at 19:31
@DmitryPaskal, You should add this as a new answer. – saji89 Mar 12 at 10:26
@DmitryPaskal As always, don't just copy-paste these without understanding them. On my machine this one-liner also matches linux-libc-dev:amd64 which shouldn't be removed. – jamesadney Mar 12 at 20:19

10.04 GUI Method

Computer Janitor can clean up old kernels and I believe is installed by default in Ubuntu (but not Kubuntu).

GRUB 1, if you're using that, has an option in /boot/grub/menu.lst to specify how many kernels it should show at a maximum. GRUB 2, as far as I can tell, does not.

share|improve this answer
3  
Computer Janitor should not be used - it is buggy and has now been dropped as a default application in natty/oneiric/precise. – fossfreedom Feb 13 '12 at 16:04
1  
Rather, install "Ubuntu Tweak" as described in another answer (its own ppa), which has its own "computer janitor" (not to be confused with the "computer janitor" that temporarily was available in older ubuntu versions) – michael_n Feb 4 at 2:10

In order to remove older Linux image kernels, first boot in the kernel you want to keep.

You can also check the kernel version using command uname -r so that you don't remove the wrong one by mistake.

Now go to synaptic package manager and search for linux-image and remove the older versions except the one shown by upper command. Generally I prefer to go with the latest one.

Now when you restart you'll see a more clean grub menu.

share|improve this answer
This is probably the most basic method that will for users who have installs w/o Computer Janitor. – Broam Sep 17 '10 at 21:34
1  
From Ubuntu 11.04 the grub menu only shows the current kernel by default, older kernels are hidden in the 'Previous kernels' menu. This method will still work for cleaning out the older ones. – Andy May 16 '11 at 16:03

To figure out what kernels and headers are installed use

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

You can then remove them one by one or together, just make sure to keep the most recent.

There are also some handy commands and scripts to automate the removal.

http://ubuntuforums.org/showthread.php?t=1658648

The following claims to remove all unused kernels and headers:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

If you don't ever need old kernels, set that command to run as a monthly cron job.

share|improve this answer

My one-liner to remove old kernels (this also frees up disk space)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Explanation (remember, | uses the output of the previous command as the input to the next)

  • dpkg --list lists all installed packages
  • grep link-image looks for the installed linux images
  • awk '{ print $2 }' just outputs the 2nd column (which is the package name)
  • sort puts the items in ascending order
  • sed -n '/'`uname -r`'/q;p' prints the lines before the current kernel
  • xargs sudo apt-get -y purge purges the found kernels

Unwinding the sed invocation:

  • -n tells sed to be quiet
  • `uname -r` outputs the current installed kernel release - we include it in backticks so that the output is includes as part of the command (you might also see this as $(uname -r)
  • /something/q says stop when you match 'something' (in this case, something is output of uname -r) - the / surround a regular expression
  • p is print
  • the ; is the command separtor, so /something/q;p says quit when you match something, else print

altogether, sed -n '/'`uname -r`'/q;p' is print the lines until it matches with the current kernel name.

If you're paranoid (like me), you can make the last part xargs echo sudo apt-get -y purge so that the command to purge the old kernels is printed, then you can check that nothing unexpected is included before you run it.


Extended version to remove headers too:

dpkg --list | grep 'linux-headers\|linux-image' | awk '{ print $2 }' | sort -n | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Note: the sed invocation is modified. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" extracts only the version (e.g. "3.2.0-44") , without "-generic" or similar from uname -r

share|improve this answer
Terminal power . Awesome combination and explain. – NikTh Mar 28 at 21:54
Thank you! This does not remove the kernel headers. I enhanced your one-liner to remove the image and headers of all kernels older than the active one. dpkg --list | grep 'linux-headers\|linux-image' | awk '{ print $2 }' | sort -n | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge – phiphi 6 hours ago

You can uninstall the old kernels (linux-image-... packages) using Synaptic, and that will remove them from the boot menu. Take care not to remove the running kernel (you can check its version with uname -r).

Bear in mind that having a one or two older versions can help you troubleshoot, should something go wrong.

Alternatively, you can edit/remove the entries manually (gksu gedit /boot/grub/grub.cfg), but they will be re-generated when you update to a newer kernel. If you are thinking about removing recovery mode options - don't. They can come in handy if you break something which prevents you from booting.


Refer to this page.

share|improve this answer
Grub2 now builds it's grub entry everytime a new kernel is installed. with update-grub which will re-write all those kernels. – Marco Ceppi Dec 12 '10 at 18:47

You could install ubuntu-tweak and then Go to Applications -> System tool -> ubuntu tweak and

enter image description here click package cleaner and clean kernels. it does not show the currently used kernel so you will always be safe.

share|improve this answer

Personally, I like using Synaptic. It makes me feel more secure about what's going on. The only app I've used that has an option to remove old kernels is Ubuntu Tweak.

How to remove the kernels you are not using:

  • Open UbuntuTweak
  • Click on 'Package Cleaner' under 'Applications' in the left-hand pane
  • On the right side of the 'cleaning view' press 'Clean Kernels'
  • Select all kernels - I think the one in use is not listed but just in case check running uname -a in a terminal
share|improve this answer

I believe that I have removed old kernels with the "apt-get autoclean" or "apt-get autoremove" command, but I'm not certain.

share|improve this answer
1  
Also a good answer. However, autoclean will only remove obsolete versions of downloaded debs, but autoremove will eventually purge old kernels. – aquaherd Jan 30 '12 at 21:08

ailurus has the feature of removing old kernels as well as unused configurations. I personally remove it manually from synaptic. You can install ailurus from getdeb as well as ppa

share|improve this answer

As well as removing the old kernels, uncomment this line in /etc/default/grub if you want to get rid of the 'recovery' items in the menu:

#GRUB_DISABLE_LINUX_RECOVERY="true"
share|improve this answer

The fastest/simpler way (Applicable at least since 12.04) possible that already comes with Ubuntu is apt-get. Do the following if you wish to remove all older kernel versions that are not in use (Except the previous one that you are no using. This is to make sure that if the current kernel version fails in some way, you have a way to go back to a previous state). Do the following:

sudo apt-get autoclean

This will eliminate any old files (Including kernel versions) you may have. Note that if you have many old versions, it will take a while since it has to make sure that removing the kernel version has no issues. For me, removing the last 12 kernel versions took about 2 minutes. You can also do the following:

sudo apt-get clean

Which will eliminate everything downloaded and stored in the cache folder of apt. Lastly you have:

sudo apt-get autoremove

which would check for any unused packages and remove them if necessary. This is great for those libraries and dependency packages that are no longer needed byt any app installed.

share|improve this answer

Next time, when removing old kernels open a Terminal and use this command: sudo apt-get autoremove linux-headers-2.6.38-10-generic

You can use Synaptic to get the exact name of the kernel that you intend to delete. Just open Synaptic and search for "linux-headers" and then select which kernel entry you want to remove. The relevant entry will be tagged with "-generic" at the end.

To clear out any unused (left over) dependencies throughout the system use this command by itself: sudo apt-get autoremove

share|improve this answer
dependencies are removed but I still have these files in /boot folder. – Patryk Oct 10 '11 at 13:43

here is a rough outline of what I did, careful as I am no expert in linux, be sure you know what you are doing and have backed up any files you are modifying.

gedit /boot/grub/grub.cfg

then find the entries you want to keep, we will highlight and copy them

cd /etc/grub.d
ls

you'll see a list of files like 10_linux and 30_os-prober

sudo chmod -x 10_linux

this will stop form auto adding all the linux entries into the grub boot menu.

gksudo gedit 40_custom

open the custom boot menu file, then go back to grub.cfg (which should still be open in gedit), and copy the entries you want to keep... such as

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

paste them into 40_custom, and then save it.

sudo chmod 755 40_custom

makes it executable, then finally we update grub which will change the grub.cfg file:

sudo update-grub

Now, BEWARE, if you update your kernel or OS, your boot menu probably will not update... you'll have to do that manually. But doing this procedure will let you customize the boot menu a bit more, such as remove the kernel version and just put the ubuntu name... i.e. Ubuntu Lucid 10.04, etc...

Hope someone finds this helpful, as it took me a while to figure out... didn't see this solution anywhere...

share|improve this answer
2  
This answer seems like overkill. It's better to just remove old kernels. – Scott Severance Jan 8 '12 at 23:32
I had read that extra kernels may be useful in the event of recovery situations. Also, this is a simple way to edit the text of the boot entry. So rather than saying "Ubuntu, Linux kernel x.x.xx-yy --text1 -text2 -t3 -t4 --t5 etc etc etc" (where the --text entries just denote some options/parameters I don't understand) you can change it to "Ubuntu xx.yy" although I had a "{" bracket I couldn't get rid of. – Joe Jan 9 '12 at 22:35
I keep the immediate previous kernel around until I've verified the the most current kernel works properly. If it works, it isn't going to stop working. So, after I've verified the most recent kernel (after a week or so), I have no reason to keep the old kernel around. If it doesn't work, then I have the latest known-good kernel to fall back to. Actually, I'm currently running an old kernel due to a showstopper bug in the current kernels. But that doesn't change my overall policy. You only need one known good kernel. – Scott Severance Jan 10 '12 at 5:14

I disabled the 10_linux boot file and put custom entries in 40_custom (copied/pasted from boot.cfg). That way you can edit the text of the entry carefully. Although updating your kernel may not update your 40_custom file, so you may have to beware of that. Although it's easy to fix.

share|improve this answer

I found this link about "clean up the ubuntu grub2 boot menu " to be much more useful, and explanatory.

share|improve this answer

An easy way to get rid of almost all obsolete packages, packages no longer in any package list, along with obsolete kernels is to do one of the following:

dpkg --purge $(aptitude search ?obsolete)

However, this will miss packages that are still recommended by other packages, and the -R/--without-recommends argument does not resolve this problem.

dselect after switching sort mode with 'o' will show all obsolete packages including the ones aptitude misses, but some people don't like using it.

share|improve this answer

This is by far the best answer in my opinion:

http://tuxtweaks.com/2010/10/remove-old-kernels-in-ubuntu-with-one-command/

Follows the last command on the site above:

dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
share|improve this answer

Backup your GRUB configuration file which is in /boot/grub/grub.cfg which we will need if something goes wrong.

Open Terminal CTRL+ALT+T. You need to be the root. For that :

sudo -i

Now we want to edit the file. For that:

gedit /boot/grub/grub.cfg

You will get GEDIT window.

Now search for ### BEGIN /etc/grub.d/10_linux ###.

After that line you will see the items of your GRUB.

So if we want to remove Ubuntu, with Linux 2.6.32-30-generic from GRUB, Remove the red highlited line in the image.

screenshot showing the contents of /boot/grub/grub.cfg

You should have got the idea of removing items from GRUB.

After editing the file save it.

Do as you like but be careful not to remove other lines.

**

  • NOTE

:**

When kernel is updated the /boot/grub/grub.cfg is recreated. So the older kernels will be visible again. You have to do this every time you run the command update-grub and after updating the kernel.

Source (my blog): How to remove a item from GRUB boot menu

share|improve this answer
2  
Thanks for the edit. Ubuntu has used GRUB2 since 9.10, so it's unlikely any solution that would work for any version since then would fail for any other version. (Thus, if this works for 10.04, it probably works for later versions too.) Unfortunately, because it's GRUB2, this will probably not work at all, or at least not for very long. The file you're editing, /etc/grub/grub.cfg is automatically recreated when update-grub runs--and it is run every time there is a kernel update (and for some other updates). – Eliah Kagan Jan 30 at 13:10

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.