Ubuntu – Can’t upgrade due to low disk space on /boot

disk-usagekernelupgrade

I try to do do-release-upgrade
but then I get:

Not enough free disk space

The upgrade has aborted. The upgrade needs a total of 25.7 M free
space on disk '/boot'. Please free at least an additional 25.7 M of
disk space on '/boot'. Empty your trash and remove temporary packages
of former installations using 'sudo apt-get clean'.

Output of df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

How come there is no space left on boot? Here's the output of ls -as /boot:

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

Output of uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux

Best Answer

  • Your /boot partition is filled with old kernels. It does that sometimes, not sure why it is never fixed. You can easily remove the old kernels if you know which packages they came in.

    First check uname -a to check your current version.

    Then run the following command:

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

    This command will list all packages that you no longer need. I don't like removing them automatically, I like to be in control when it comes to removing kernels. So for every package listed do the following:

    sudo apt-get -y purge some-kernel-package
    

    Intermezzo

    This intermezzo describes in more detail how the commands work and tries to fix an issue with linux-libc-dev:amd64. Most users can skip this paragraph.

    • dpkg -l 'linux-*' list all packages that have a name starting with 'linux-'
    • sed '/^ii/!d; remove all lines that do *not* start withii`
    • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" find the current running kernel version
    • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Remove all lines, except the ones containing the current running kernel version number
    • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ For each line list only the package name
    • /[0-9]/!d Remove lines that do not contain numbers.

    To fix Frederick Nord's issue I think the command can be amended as follows:

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

    It basically adds an extra filter:

    • /^linux-(headers\|image)/!d Delete all lines that do not start with linux-headers or linux-image

    /Intermezzo

    Where some-kernel-package can be replaced with one of the packages listed. Just beware that you don't remove the kernel packages that are in current use (as listed by the uname -a) eg. sudo apt-get purge -y linux-headers-3.0.0-12 etc.

    It can be automated further using the xargs command, but I don't like that. It is a personal thing. However, here's the command to do so:

    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
    

    This is what my /boot looks like, one spare kernel (2.6.38-11) just in case and 3.2.0-24 being current:

    $ ls -l /boot
    total 59388
    -rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
    -rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
    -rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
    -rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
    drwxr-xr-x 3 root root     5120 May 27 17:46 grub
    -rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
    -rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
    drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
    -rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
    -rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
    -rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
    -rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
    -rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
    -rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
    -rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic
    

    And file system usage:

    $ df -h /boot
    Filesystem Size Used Avail Use% Mounted
    /dev/sda5  228M  63M  154M  29% /boot
    
  • Related Question