Ubuntu: How do I free up more space in /boot?



Question:

My /boot partition is nearly full and I get a warning every time I reboot my system. I already deleted old kernel packages (linux-headers...), actually I did that to install a newer kernel version that came with the automatic updates. After installing that new version, the partition is nearly full again. So what else can I delete? Are there some other files associated to the old kernel images?

Here is a list of files that are on my /boot partition:

:~$ ls /boot/  abi-2.6.31-21-generic         lost+found  abi-2.6.32-25-generic         memtest86+.bin  abi-2.6.38-10-generic         memtest86+_multiboot.bin  abi-2.6.38-11-generic         System.map-2.6.31-21-generic  abi-2.6.38-12-generic         System.map-2.6.32-25-generic  abi-2.6.38-8-generic          System.map-2.6.38-10-generic  abi-3.0.0-12-generic          System.map-2.6.38-11-generic  abi-3.0.0-13-generic          System.map-2.6.38-12-generic  abi-3.0.0-14-generic          System.map-2.6.38-8-generic  boot                          System.map-3.0.0-12-generic  config-2.6.31-21-generic      System.map-3.0.0-13-generic  config-2.6.32-25-generic      System.map-3.0.0-14-generic  config-2.6.38-10-generic      vmcoreinfo-2.6.31-21-generic  config-2.6.38-11-generic      vmcoreinfo-2.6.32-25-generic  config-2.6.38-12-generic      vmcoreinfo-2.6.38-10-generic  config-2.6.38-8-generic       vmcoreinfo-2.6.38-11-generic  config-3.0.0-12-generic       vmcoreinfo-2.6.38-12-generic  config-3.0.0-13-generic       vmcoreinfo-2.6.38-8-generic  config-3.0.0-14-generic       vmcoreinfo-3.0.0-12-generic  extlinux                      vmcoreinfo-3.0.0-13-generic  grub                          vmcoreinfo-3.0.0-14-generic  initrd.img-2.6.31-21-generic  vmlinuz-2.6.31-21-generic  initrd.img-2.6.32-25-generic  vmlinuz-2.6.32-25-generic  initrd.img-2.6.38-10-generic  vmlinuz-2.6.38-10-generic  initrd.img-2.6.38-11-generic  vmlinuz-2.6.38-11-generic  initrd.img-2.6.38-12-generic  vmlinuz-2.6.38-12-generic  initrd.img-2.6.38-8-generic   vmlinuz-2.6.38-8-generic  initrd.img-3.0.0-12-generic   vmlinuz-3.0.0-12-generic  initrd.img-3.0.0-13-generic   vmlinuz-3.0.0-13-generic  initrd.img-3.0.0-14-generic   vmlinuz-3.0.0-14-generic  

Currently, I'm using the 3.0.0-14-generic kernel.


Solution:1

You've a lot unused kernels. Remove all but the last kernels with:

sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}  

This is shorthand for:

sudo apt-get purge linux-image-3.0.0-12 linux-image-2.6.31-21 linux-image-2.6.32-25 linux-image-2.6.38-10 linux-image-2.6.38-11 linux-image-2.6.38-12 linux-image-2.6.38-8  

Removing the linux-image-x.x.x-x package will also remove linux-image-x.x.x-x-generic.

The headers are installed into /usr/src and are used when building out-tree kernel modules (like the proprietary nvidia driver and virtualbox). Most users should remove these header packages if the matching kernel package (linux-image-*) is not installed.

To list all installed kernels, run:

dpkg -l linux-image-\* | grep ^ii  

One command to show all kernels and headers that can be removed, excluding the current running kernel:

kernelver=$(uname -r | sed -r 's/-[a-z]+//')  dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver  

It selects all packages named starting with linux-headers-<some number> or linux-image-<some number>, prints the package names for installed packages and then excludes the current loaded/running kernel (not necessarily the latest kernel!). This fits in the recommendation of testing a newer kernel before removing older, known-to-work kernels.

So, after upgrading kernels and rebooting to test it, you can remove all other kernels with:

sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")  


Solution:2

Your boot partition is full. Since this is a kernel update, these files will be copied to the boot partition so you need to clean in out. Here is a blog post that will show you how to clear the old kernel images with one command. I'll give a basic synopsis of the method. Use this command to print out the current version of your kernel:

uname -r  

Then use this command to print out all the kernels you have installed that aren't your newest kernel:

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'  

Make sure your current kernel isn't on that list. Notice how this is the majority of the final command (down below). To uninstall and delete these old kernels you will want to pipe these arguments to:

sudo apt-get -y purge  

Now we can do everything we want by combining these last two commands into this unholy mess:

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

And that one command will take care of everything for you. I will confirm that this does work perfectly but never trust anybody on the internet. :) For more info, the blog post gives a very good explanation of what each part of the command does so read through it so you are satisfied that it does what you want it to do.


Solution:3

sudo apt-get autoremove  

This command is doing the job automatically.


Solution:4

The Synaptic Package Manager can be used to easily select and remove old kernel images. Screenshot of Synaptic Package Manager

If you don't already have Synaptic installed:

sudo apt-get install synaptic  

Start the application and select the options shown.

You should be able to highlight all the "linux-" packages with the version "2.6.x" where x is between 31 to 38 according to the files in your /boot folder.

Right-click each of those linux packages and choose the option "Mark for Complete Removal". Finally click the apply button. This will remove all the files and any associated files. Your /boot folder should now be a bit tidier.


Solution:5

Thank you for your detailed post of your problem, this got me going in the right direction. Although it is useful to keep previous kernel files you can remove all of them in one go, check this post:
How to Remove All Unused Linux Kernel Headers, Images and Modules

Done via command line. If you are doing this via remote use something like WINSCP to open a terminal session and just paste it in, works very well.

Here it is copied from article link, I suggest you read the full article:

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  


Solution:6

This is a new answer to an old question, but an easy way to clean this thing (and more) is to install Ubuntu Tweak. To install it:

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

then you can run Ubuntu Tweak, Going to the "janitor" tab, and from here it's a matter of three clicks:

Ubuntu tweak janitor for old kernels

It is better to leave the last kernel (you never know) or a well-known working kernel for safety, though; but that's easily customizable.

You can use the same tool to clean a lot of things --- just remember that if you clean thumbnail cache or TB cache then the system will have to rebuild them if they are needed.


Solution:7

I was able to fix the problem by using dpkg to remove the packages directly. Although the packages are still listed in dpkg -l, the files are removed from /boot, freeing up space.

phrogz@planar:/boot$ sudo dpkg --remove linux-image-2.6.32-30-server  (Reading database ... 145199 files and directories currently installed.)  Removing linux-image-2.6.32-30-server ...  Running postrm hook script /usr/sbin/update-grub.  Generating grub.cfg ...  Found linux image: /boot/vmlinuz-2.6.32-35-server  Found linux image: /boot/vmlinuz-2.6.32-34-server  Found initrd image: /boot/initrd.img-2.6.32-34-server  Found linux image: /boot/vmlinuz-2.6.32-33-server  Found initrd image: /boot/initrd.img-2.6.32-33-server  Found linux image: /boot/vmlinuz-2.6.32-32-server  Found initrd image: /boot/initrd.img-2.6.32-32-server  Found linux image: /boot/vmlinuz-2.6.32-31-server  Found initrd image: /boot/initrd.img-2.6.32-31-server  Found memtest86+ image: /memtest86+.bin  done    # Repeat for kernels -31 and -32 and -33, up to (but not including)  # the version listed by `uname -a`  

After this, apt-get -f install fixed my dependency problems, and all was well with the world.

I'll not be accepting this answer of mine, however, as I still need to know if I should be increasing my /boot size or doing something else.


Solution:8

You can stop using a separate /boot partition, then you won't have such limited space there. To do this, unmount the partition, then mount it somewhere else and copy all of the files there to the /boot directory in your root partition, then remove the entry from /etc/fstab and reinstall grub. For example ( you will need to use the correct partition ):

sudo -s  umount /boot  mount /dev/sda2 /mnt  cp -a /mnt/* /boot/  umount /mnt  gedit /etc/fstab  grub-install /dev/sda  

You can then use gparted to delete the old /boot partition, and possibly extend the root partition to use that space. To extend the root partition you will need to boot from the livecd, and the free space needs to be immediately to the right. If the /boot partition is currently to the left of the root partition, then you will need to first move the root partition to the left, then extend it, but this can take a very, very long time, so may not be worth the trouble.


Solution:9

For me both apt-get purge and dpkg --remove both failed. So I had to deleted a couple of older kernel images from /boot with rm -f.


Solution:10

Taking the best from the answers above, my tried-and-true approach is this:

  • uname -a to find the running kernel.
  • dpkg -l linux-{headers,image}-\* | grep ^ii to list all currently installed kernel-related packages. This will include the running kernel.
  • sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz} to remove the old kernels. Replace xx,yy,zz with a list of the kernel builds you want to remove â€" these are all the builds listed by the previous command which are older than the currently running kernel. Make sure you don't remove the currently running kernel â€" your system will become unbootable. You may also need to change the kernel version from 3.16.0 to whatever is installed on your system.

  • If the apt command fails due to a no space left on device error, use the corresponding dpkg command instead: sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}. If the apt command fails for any other reason, seek help - you may have a different problem than you thought.

You may have header files without matching kernel versions installed, or vice versa â€" just include all of these versions in the command. APT will complain that some packages can't be removed because they are not installed, but that will do no harm.


Solution:11

I already deleted old kernel packages (linux-headers...)

linux-headers-* aren't kernels. Kernel packages are the ones named linux-image-*. The ones named linux-headers-* are development packages for compiling kernel modules: they don't live in the /boot directory and are not required for general day to day use of your system.

The files you listed in /boot do include several old kernel images (vmlinuz*) and compiled initrd images (initrd.img*) for those kernels, which is an indication that you still have a lot of old kernel packages installed.

You should be able to list your installed kernels with

aptitude search ~ilinux-image  

(Note that this will probably return packages that aren't kernels, too).

There is usually no need for more than two kernels to be installed - the one currently in use and the previous one to that (as a fallback). So you can start removing the older ones, one by one, like this:

sudo apt-get autoremove linux-image-3.2.0-23-generic  

Make sure you substitute "3.2.0-23-generic" with the actual kernel version you want to remove! Also, don't remove packages such as linux-image-generic. You have to be really careful not to remove the currently running kernel or you won't be able to boot (Ubuntu may or may not warn you about doing this).

You can find your currently running kernel with:

uname -r  


Solution:12

git clone https://github.com/erichs/bootnukem.git  cd bootnukem  sudo ./install.sh  

Use at your own risk, but it worked for me:

sudo bootnukem  


Solution:13

I had this problem and more as I removed some initrd-img-xxx files manually from the /boot and I had a problem that these old versions keep generated and filling in the /boot folder. To fix it I followed the following:

  • I removed the generated old kernel version manually so to free space.
  • You’ll be editing a text configuration file as superuser, so paste the following into a terminal:

    sudo gedit /etc/initramfs-tools/update-initramfs.conf  
  • Locate the line update_initramfs=yes and change it to update_initramfs=no. Save and exit the file, then run:

    sudo dpkg --configure -a  

That solved my problem. That was based on this blog

Hopefully, everything should be fine when you reboot, and later you can try changing the no back to yes in update-initramfs.conf.


Solution:14

In aptitude or synaptic there is a section "old or manually installed packaged". There should be the old linux packages there.


Solution:15

There's a bash script which I wrote give below that makes the process a bit more user-friendly.

YMMV - it was made for Mint 14. Still learning BASH so it's probably a bit clunky. Use at own risk, but it works for me!

#!/bin/bash    endCol='\e[0m'  bold_red='\e[1;31m'  bold_green='\e[1;32m'  bold_yellow='\e[1;33m'    title_color='\e[0;30;47m'    function show_kernel_info {  clear  current_kernel=$(uname -r)  echo "Current ACTIVE kernel is:"  echo -e "  "$bold_yellow$current_kernel$endCol  echo "This kernel will be TOTALLY EXCLUDED from all actions in this script."  echo "Also, one fallback non-active kernel will be always left untouched."  echo ""  echo "These are the non-active kernels stored in /boot:"  count_of_old_kernels_in_boot=$(ls -o /boot/initrd* | grep -c -v "$current_kernel")  if [ $count_of_old_kernels_in_boot = 0 ]; then    echo " * No non-active kernels found! *"  else    ls -o /boot/initrd* | grep -v "$current_kernel"  fi  echo ""  list_of_old_kernels=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic")  current_old_kernel=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic" | head -n 1)  count_of_old_kernels_installed=$(dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -c -v "linux-image-generic")  echo "Listing of all unused kernels still installed in the system (these may not exist in /boot):"  if [ $count_of_old_kernels_installed = 0 ]; then    echo " * No unused kernel installs found! *"  else    dpkg --list | grep linux-image | awk -F' ' '{ print $2 }' | grep -v "$current_kernel" | grep -v "linux-image-generic"  fi  echo ""  }    function exit_script {  free_space_after=$(df -BM /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)  let freed_space=$free_space_after-$free_space_before  echo ""  echo "Results (in MB)"  echo "---------------"  echo "Free space in /boot before script was run: "$free_space_before  echo "Free space now: "$free_space_after  echo ""  echo "Amount of space freed up = "$freed_space  echo ""  echo "Press any key to exit."  read -s -n 1  echo ""  exit  }    # Main code  echo ""  echo -e $title_color" --------------------------- "$endCol  echo -e $title_color" -   Kernel Cleanup v1.0   - "$endCol  echo -e $title_color" --------------------------- "$endCol  echo ""  echo "Maximise this window for readability."  echo "Press any key to continue."  read -s -n 1  echo ""  echo "This script will remove old unused kernels, but it will prompt you before removing each one."  echo "It will never remove the current running kernel, and will also leave one fallback kernel."  echo "It can also remove source files from /usr/src for each kernel removed."  echo "This is normally safe to do and will free up lots more space."  echo ""  echo "Do you want that done as well? (y/n, enter=yes)"  valid_input=0  while [ "$valid_input" = "0" ]; do    read -s -n 1 YesNo_input    if [ "$YesNo_input" = "" ]; then      YesNo_input="y"    fi    case $YesNo_input    in      y)      RemoveSource="y"      valid_input=1      ;;        Y)      RemoveSource="y"      valid_input=1      ;;        n)      RemoveSource="n"      valid_input=1      ;;        N)      RemoveSource="N"      valid_input=1      ;;    esac  done    free_space_before=$(df -h /boot | tail -n 1 | awk -F' ' '{ print $4 }' | tr -d M)  show_kernel_info  while [ $count_of_old_kernels_in_boot -gt 1 ]; do    # failsafe check if somehow the current kernel is about to be removed!    if [ "$current_old_kernel" = "$current_kernel" ]; then      echo -e $bold_red"ERROR!"$endCol" Somehow the current kernel has crept into the removal process!"      echo "I refuse to do that! Aborting script."      exit_script    fi    # failsafe check if somehow a linux-image-generic entry is about to be removed    if [ "$current_old_kernel" = "linux-image-generic" ]; then      echo -e $bold_red"ERROR!"$endCol" Somehow one of the linux-image-generic entries has crept into the removal process!"      echo "I refuse to do that! Aborting script."      exit_script    fi    echo "Command about to be executed is:"    echo "  $ sudo apt-get purge \"$current_old_kernel\""    check_in_boot=$(echo $current_old_kernel | sed 's/linux-image/initrd.img/g')    if [ -e /boot/$check_in_boot ]; then      echo -e $bold_yellow"Note:"$endCol" This kernel exists in /boot but it NON-active, so it's OK to remove."    else      echo -e $bold_green"Totally safe to remove:"$endCol" This kernel does NOT exist in /boot."    fi    echo ""    echo "Are you sure you want to remove this kernel?"    echo "(*upper case* Y=yes / any other key will exit the script)"    read -s -n 1 yes_no    echo ""    # Only entering a single upper case Y will work!    if [ "$yes_no" != "Y" ]; then      echo "Aborting script."      exit_script    fi    echo "Removing kernel "$current_old_kernel"..."    sleep 1    sudo apt-get -y purge $current_old_kernel    if [ "$RemoveSource" = "y" ]; then      current_old_source=$(echo $current_old_kernel | sed 's/linux-image/linux-headers/g')      current_old_source=$(echo $current_old_source | sed 's/-generic//g')      current_old_source=$(echo $current_old_source | sed 's/-pae//g')      sudo apt-get -y purge $current_old_source    fi    show_kernel_info  done    if [ $count_of_old_kernels_in_boot = 0 ]; then    echo -e $bold_red"There are no NON-active kernels to remove!"$endCol  else    echo -e $bold_red"There is only one NON-active kernel left in /boot!"$endCol    echo "This script will not remove the last non-active kernel so that you have at least one backup kernel."  fi  echo "Aborting script."  exit_script  


Solution:16

[As an AskUbuntu noob I can't comment until reputation = 50 so don't down-vote because of this.]

My server was doing this, too. Literally none of the expected answers here worked since these require some working room on /boot for them to complete. If the boot partition is full, it will abruptly end without deleting any of the images.

The only thing that worked for me was to review the current image, then to manually sudo rm filename for the oldest image files (each had -3.16.0-30 in their names). Once that was done, then sudo apt-get autoremove had the wiggle-room it needed to do its job. It did highlight some errors associated with that version, for example: "depmod: FATAL: could not load /boot/System.map-3.16.0-30-generic: No such file or directory" but that is to be expected.

When finished, the df returned a 42% in use for /boot to indicate that it's healthy again.


Solution:17

I wrote this bash script to selective purge old kernels all at once:

rm kernels real size

All the bash code and instructions are included in the link.


Solution:18

If you cannot remove more unused files and if you have other partition with/or free space on same device, you can resize of /boot partition by parted/gparted. (It is included on installation media, too.)

Warning: Resizing of partition is dangerous operation, save your important data on other media before doing it!


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »