Skip to content

Instantly share code, notes, and snippets.

@jbgo
Last active April 19, 2023 20:47
Show Gist options
  • Star 76 You must be signed in to star a gist
  • Fork 25 You must be signed in to fork a gist
  • Save jbgo/5016064 to your computer and use it in GitHub Desktop.
Save jbgo/5016064 to your computer and use it in GitHub Desktop.
Free up space on /boot disk (ubuntu)

Free disk space when /boot is full (Ubuntu)

TL;DR

dpkg -l linux-image*
uname -r
sudo apt-get remove linux-image-2.6.32-{21,37,38,39,40,41,42,43,44}-server
sudo apt-get autoremove

This morning, I noticed New Relic that the /boot disk was almost full on several of our servers. It turns out that when the old kernel images are left on the disk after a kernel update. The solution is to delete old kernels that we don't need anymore.

1. Find packages to delete.

You can safely delete all but the latest package that matches the pattern linux-image-2.6.32-[0-9][0-9]-server. Leave linux-image-2.6.32-45-server on your system because you will need it to reboot!

$ dpkg -l linux-image*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                          Version                                       Description
+++-=============================================-=============================================-==========================================================================================================
un  linux-image                                   <none>                                        (no description available)
un  linux-image-2.6                               <none>                                        (no description available)
ii  linux-image-2.6.32-21-server                  2.6.32-21.32                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-37-server                  2.6.32-37.81                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-38-server                  2.6.32-38.83                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-39-server                  2.6.32-39.86                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-40-server                  2.6.32-40.87                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-41-server                  2.6.32-41.91                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-42-server                  2.6.32-42.96                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-43-server                  2.6.32-43.97                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-44-server                  2.6.32-44.98                                  Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-2.6.32-45-server                  2.6.32-45.104                                 Linux kernel image for version 2.6.32 on x86_64
ii  linux-image-server                            2.6.32.45.52                                  Linux kernel image on Server Equipment.

2. Identify the kernel version you are currenlty running

DON'T delete this kernel image! And if it's not the latest, don't delete the latest one either.

$ uname -r
2.6.32-45-server

3. Delete the old kernels.

Removing the old kernels is the same as removing any other package. I'm using shell expansion for the version numbers to save typing. It will prompt you with a list of packages that will be removed, so you can double check the list before continuing.

sudo apt-get remove linux-image-2.6.32-{21,37,38,39,40,41,42,43,44}-server

4. Remove dependencies.

There are some dependencies left on the system after removing the old kernels. Fortunately, you can easily clean these up, too.

sudo apt-get autoremove
@BETLOG
Copy link

BETLOG commented Mar 31, 2018

I just wrote this. My bash is a little rusty though

#!/bin/bash
# BETLOG - 2018-03-31--19-48-34
# based on https://gist.github.com/jbgo/5016064

echo -ne "CAUTION::\\nThis script apt-get removes all but the currently operational kernel"

read -p "Continue? (y/n)?" answer
case ${answer:0:1} in
    y|Y )
        sudo -v
        current=`uname -r`
        available=`dpkg -l | grep -Po "linux-image.*generic"`
        remove=()
        for name in $available; do
            if [[ ${name/$current/} == ${name} ]]; then
                remove+=("$name")
            fi
        done
        sudo apt-get remove ${remove[@]}
        sudo apt-get autoremove
        echo FINISHED
    ;;
    * )
        echo ABORTING;
    ;;
esac

@bmatthewshea
Copy link

Your very first code line:

dpkg -l linux-image*

Try this instead:

dpkg -l linux-image* | grep "ii"

otherwise the list will be too long on many systems. You may want to update that.

@ryul99
Copy link

ryul99 commented Apr 12, 2023

I fixed @BETLOG 's script cause It contains some redundant strings like arch, kernel version (not kernel name) , etc.
Also, I added filtering only 'ii'

#!/bin/bash
# ryul99 - 2023-04-13
# Origin: BETLOG - 2018-03-31--19-48-34
# based on https://gist.github.com/jbgo/5016064

echo -ne "CAUTION::\\nThis script apt-get removes all but the currently operational kernel"

read -p "Continue? (y/n)?" answer
case ${answer:0:1} in
    y|Y )
        sudo -v
        current=`uname -r`
        available=`dpkg -l | grep -Po "linux-image.* | grep ii" | cut -d ' ' -f 1`
        remove=()
        for name in $available; do
            if [[ ${name/$current/} == ${name} ]]; then
                remove+=("$name")
            fi
        done
        sudo apt-get purge ${remove[@]}
        sudo apt-get autoremove
        echo FINISHED
    ;;
    * )
        echo ABORTING;
    ;;
esac

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment