Safely Remove / Delete Old Linux Kernel from a Linux Server

Posted on in Categories , , , , , , , last updated September 10, 2016

We have four different versions of Linux kernel installed by the yum command under CentOS Linux. Currently, I am using only latest version 2.6.18-53.1.4.el5. What is proper and suggested method to remove old kernels from a CemtOS / Debian Linux server?

Most Linux distro keeps old kernel files so that you can revert in case of emergency pop up due to hardware or software incompatibility issues. A kernel is nothing but a set of files on Linux box. Following is the suggested way to remove old kernels safely on Linux based system.

Step # 1: Find the current kernel version

uname -r
Sample outputs:

2.6.18-53.1.4.el5

Step #2: List all installed kernels

Use the rpm command or dpkg command on Linux:
# rpm -q kernel
Sample outputs (from RPM based distro such as CentOS/RHEL):

kernel-2.6.12-1.el5
kernel-2.6.18-17.el5
kernel-2.6.18-53.el5
kernel-2.6.18-53.1.4.el5

Debian / Ubuntu Linux user, enter:
$ dpkg --list 'linux-image*'
Sample outputs:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-f/Unpacked/Failed-cfg/Half-inst/t-aWait/T-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name                          Version                       Description
+++-=============================-=============================-==========================================================================
ii  linux-image                   2.6.22.14.21                  Generic Linux kernel image.
un  linux-image-2.6                                       (no description available)
rc  linux-image-2.6.20-15-generic 2.6.20-15.27                  Linux kernel image for version 2.6.20 on x86/x86_64
ii  linux-image-2.6.20-16-generic 2.6.20-16.32                  Linux kernel image for version 2.6.20 on x86/x86_64
ii  linux-image-2.6.22-14-generic 2.6.22-14.47                  Linux kernel image for version 2.6.22 on x86/x86_64
ii  linux-image-generic           2.6.22.14.21                  Generic Linux kernel image

Step #3: Remove all old kernels

WARNING! These examples may result into unstable system if not executed with care. Do not remove the kernel the system is currently running.

Choose which kernel you want to uninstall from the list of those installed. Type the following command to remove the kernel package under RHEL / CentOS / Fedora Linux:
# rpm -e kernel-2.6.12-1.el5
Type the following command to remove the kernel package under Debian / Ubuntu Linux:
$ sudo apt-get remove linux-image-2.6.22-14-generic
Please note that on newer system all obsolete kernels and headers should automatically be flagged as no more needed, and thus can be purged with the following single command:
$ sudo apt-get --purge autoremove
Sample outputs:

Fig.01: Deleting all older kernels on an Ubuntu server
Fig.01: Deleting all older kernels on an Ubuntu server

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

29 comment

  1. hey the method is wrong for Fedora.

    $ sudo apt-get remove linux-image-2.6.22-14-generic

    doesn’t usually work as default packman in Fedora is yum and there is no package like linux-image.

    it simply called kernel in Fedora.

  2. I remove old kernels in CentOS using yum. I usually check the current running kernel:

    #uname -r

    query the list of kernels:

    #rpm -qa kernel*

    and then remove older kernels using yum:

    #yum remove kernel-x

  3. Hi, for your kind information:

    [email protected]:~$ dpkg --list 'linux-image*'
    Desired=Unknown/Install/Remove/Purge/Hold
    | Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
    |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
    ||/ Name           Version        Description
    +++-==============-==============-============================================
    un  linux-image             (no description available)
    un  linux-image-2.          (no description available)
    ii  linux-image-2. 2.6.27-7.16    Linux kernel image for version 2.6.27 on x86
    ii  linux-image-2. 2.6.27-9.19    Linux kernel image for version 2.6.27 on x86
    ii  linux-image-ge 2.6.27.9.13    Generic Linux kernel image
    [email protected]:~$ sudo apt-get remove linux-image-2. 2.6.27-7.16
    [sudo] password for sade: 
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    E: Couldn't find package linux-image-2.
    [email protected]:~$ sudo apt-get remove linux-image 2.6.27-7.16
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Package linux-image is not installed, so not removed
    E: Couldn't find package 2.6.27-7.16
    [email protected]:~$
  4. Hi Vivek, keep up the great work!

    I just removed all my kernels on accident. Now when I boot from DVD I do not have /dev/cdrom, nor /dev/scdX, and I cannot get to kernel rpm packages.
    I also cannot chroot /mnt/sysimage
    The error is: cannot run command ‘/bin/sh’: No such file or directory

    Please suggest how to restore this system.
    Best regards,
    Chris

  5. I used sudo apt-get remove linux-image-2.6.28-11-generic and removed the old kernel. But the configuration files are not removed. It shows
    rc linux-image-2. 2.6.28-11.42 Linux kernel image for version 2.6.28 on x86
    Is there any way to clean up the configuration files also of the removed kernel?

  6. This command removes all the old kernels:

    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
    
    1. A wonderful command. However in my situation some kernels were “not empty so not removed” which means I have still ten old kernels taking 150 Mb a piece. I will keep looking for a solution and get back to you all if I find it.

  7. i have the following problem

    {
    [[email protected] Yousaf]# uname
    Linux
    [[email protected] Yousaf]# uname -r
    2.6.33.3-85.fc13.i686
    [[email protected] Yousaf]# rpm -q kernel
    kernel-2.6.33.3-85.fc13.i686
    [[email protected] Yousaf]# rpm -e kernel-2.6.33.-85.fc13.i686
    error: package kernel-2.6.33.-85.fc13.i686 is not installed
    [[email protected] Yousaf]# sudo rpm -e kernel-2.6.33.-85.fc13.i686
    error: package kernel-2.6.33.-85.fc13.i686 is not installed
    }

    What i do some problem i have face in many software when i want to remove that

  8. I think this is exactly what I’m looking for. However, I have the problem that when I try:

    sudo apt-get remove linux-image-3.5.0-17-generic

    I get:

    The following packages have unmet dependencies:
    linux-image-extra-3.5.0-17-generic : Depends: linux-image-3.5.0-17-generic but it is not going to be installed
    linux-image-extra-3.5.0-32-generic : Depends: linux-image-3.5.0-32-generic but it is not going to be installed
    linux-image-generic : Depends: linux-image-3.5.0-32-generic but it is not going to be installed
    E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

    Of course, sudo apt-get -f install fails with the following message:

    dpkg: error processing /var/cache/apt/archives/linux-image-3.5.0-32-generic_3.5.0-32.53_amd64.deb (–unpack):
    cannot copy extracted data for ‘./boot/System.map-3.5.0-32-generic’ to ‘/boot/System.map-3.5.0-32-generic.dpkg-new’: failed to write (No space left on device)
    No apport report written because the error message indicates a disk full error

    Apparently my boot partition is too full for me to run sudo apt-get -f install, which I need to run in order to clean up my boot partition! Any thoughts?

      1. Try this. Check what you are currently running:
        $ uname -r
        3.13.0-53-generic

        Go into root shell:
        $ sudo -s

        List some of the init files in the /boot directory; cd into /boot and run:
        # ls init*

        initrd.img-3.13.0-45-generic initrd.img-3.13.0-46-generic initrd.img-3.13.0-48-generic initrd.img-3.13.0-49-generic initrd.img-3.13.0-51-generic initrd.img-3.13.0-52-generic initrd.img-3.13.0-53-generic

        Clear some of the files you don’t need, without actually removing them:
        # echo “” > initrd.img-3.13.0-45-generic
        # echo “” > initrd.img-3.13.0-46-generic
        # echo “” > initrd.img-3.13.0-48-generic
        # echo “” > initrd.img-3.13.0-49-generic

        Exit the root shell. You should now have space to run:
        $ sudo apt-get -f install
        $ sudo apt-get autoremove

Leave a Comment