由于/ boot上的磁盘空间不足而无法升级

我尝试do-release-upgrade但后来我得到:

没有足够的可用磁盘空间

升级已中止。 升级在磁盘’/ boot’上总共需要25.7 M的可用空间。 请在’/ boot’上至少额外增加25.7 M的磁盘空间。 使用’sudo apt-get clean’清空垃圾箱并删除以前安装的临时包。

输出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 

为什么靴子上没有空间? 这是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 

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 

你的/ boot分区充满了旧内核。 有时这样做,不确定为什么它永远不会被修复。 如果您知道它们来自哪个软件包,您可以轻松删除旧内核。

首先检查uname -a以检查当前版本。

然后运行以下命令:

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

此命令将列出您不再需要的所有包。 我不喜欢自动删除它们,我喜欢在删除内核时控制它们。 因此,列出的每个包都执行以下操作:

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

间奏曲

此内容更详细地描述了命令如何工作并尝试解决linux-libc-dev:amd64 。 大多数用户可以跳过此段落。

  • dpkg -l 'linux-*'列出所有名称以’linux-‘开头的软件包
  • sed '/^ii/!d; remove all lines that do *not* start with sed '/^ii/!d; remove all lines that do *not* start with ii` sed '/^ii/!d; remove all lines that do *not* start with
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/"找到当前正在运行的内核版本
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d删除所有行,除了包含的行当前运行的内核版本号
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/对于每个行列表只有包名
  • /[0-9]/!d删除不包含数字的行。

为了解决弗雷德里克诺德的问题,我认为命令可以修改如下:

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

它基本上增加了额外的filter:

  • / ^ linux-(headers \ | image)/!d删除所有不以linux-headerslinux-image开头的行

/间奏曲

some-kernel-package可以用列出的其中一个some-kernel-package替换。 请注意,不要删除当前使用的内核包(如uname -a所列),例如。 sudo apt-get purge -y linux-headers-3.0.0-12 etc.

它可以使用xargs命令进一步自动化,但我不喜欢它。 这是个人的事情。 但是,这是执行此操作的命令:

 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 

这是我的/boot样子,一个备用内核(2.6.38-11)以防万一,3.2.0-24是最新的:

 $ 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 

和文件系统用法:

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

sudo apt-get autoremove

为我做了诀窍,它成功地清理了所有未使用的内核包。

相当于接受的答案 – 另一种(可能)更简单的方法是安装ubuntu-tweak工具,它可以从这里下载。 转到“Janitor”,然后选择“Old Kernel”进行清理。 只需点击几下即可完成。 (在14.04桌面上测试)

在此处输入图像描述

与此处的其他GUI答案相比,此答案的优点是使用本机Ubuntu Bash而无需安装第三方应用程序。

Zenity和Bash为基础的解决方案

Zenity为终端提供了一个很好的GUI界面来处理列表并使用单选按钮选择项目:

rm-kernels 1

您启动的当前内核无法删除,也不包含在列表中。 报告的大小是/boot目录中保存的大小。 更多内容保存在磁盘上,因为内核二进制文件也位于其他区域。 2017年7月27日注:目前还包含目录/usr/src/*kernel_version*/lib/modules/*kernel_version*

使用stat命令发现修改日期 。 在我的系统上,每次使用此内核启动时都会“触摸”日期( 如何查找上次启动特定内核版本的时间? ) cron reboot script。 但是,在您的系统上,日期将是内核发布日期,而不是您上次启动它的日期。

apt-get purge让你有机会中止

您将有机会查看将要清除的所有内容,并查看将要恢复的总磁盘空间(有些误导):

 The following packages will be REMOVED: linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic* linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic* linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic* linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic* linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic* linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic* linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic* linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic* linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic* linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic* linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic* linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic* 0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded. After this operation, 2,330 MB disk space will be freed. Do you want to continue? [Y/n] 

代码

将此代码复制到/usr/local/bin名为rm-kernels的可执行文件:

 #!/bin/bash # NAME: rm-kernels # PATH: /usr/local/bin # DESC: Provide zenity item list of kernels to remove # DATE: Mar 10, 2017. Modified Jul 28, 2017. # NOTE: Will not delete current kernel. # With 10 kernels on an SSD, empty cache from sudo prompt (#) using: # # free && sync && echo 3 > /proc/sys/vm/drop_caches && free # First time for `du` 34 seconds. # Second time for `du` 1 second. # PARM: If any parm 1 passed use REAL kernel size, else use estimated size. # By default `du` is not used and estimated size is displayed. # Must be running as sudo if [[ $(id -u) != 0 ]]; then zenity --error --text "root access required. Use: sudo rm-kernels" exit 99 fi OLDIFS="$IFS" IFS="|" choices=() current_version=$(uname -r) for f in /boot/vmlinuz* do if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version [[ $f =~ vmlinuz-(.*) ]] v=${BASH_REMATCH[1]} # example: 4.9.21-040921-generic v_main="${v%-*}" # example: 4.9.21-040921 # Kernel size in /boot/*4.9.21-040921-generic* s=$(du -ch /boot/*-$v* | awk '/total/{print $1}') if [[ $# -ne 0 ]] ; then # Was a parameter passed? if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then # Kernel headers size in /usr/src/*4.9.21-040921* s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}') else s2="0M" # Linux Headers are not installed fi # Kernel image size in /lib/modules/4.9.21-040921-generic* s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}') else # Estimate sizof of optional headers at 125MB and size of image at 220MB if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then s2="125M" else s2="0M" # Linux Headers are not installed fi s3="220M" fi # Strip out "M" provided by human readable option of du and add 3 sizes together s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} )) t=$(( t + s )) s=$s" MB" d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display choices=("${choices[@]}" false "$v" "$d" "$s") done # adjust width & height below for your screen 640x480 default for 1920x1080 HD screen # also adjust font="14" below if blue text is too small or too large choices=(`zenity \ --title "rm-kernels - Total: $t MB excluding: $current_version" \ --list \ --separator="$IFS" \ --checklist --multiple \ --text 'Check box next to kernel(s) to remove' \ --width=640 \ --height=480 \ --column "Select" \ --column "Kernel Version Number" \ --column "Modified Date" \ --column " Size " \ "${choices[@]}"`) IFS="$OLDIFS" i=0 list="" for choice in "${choices[@]}" ; do if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop ((i++)) short_choice=$(echo $choice | cut -f1-2 -d"-") header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l) # If -lowlatency and -generic are purged at same time the _all header directory # remains on disk for specific version with no -generic or -lowlatency below. if [[ $header_count -lt 3 ]]; then # Remove all wxy-zzz headers list="$list""linux-image-$choice- linux-headers-$short_choice" else # Remove wxy-zzz-flavour header only, ie -generic or -lowlatency list="$list""linux-image-$choice- linux-headers-$choice" fi done if [ "$i" -gt 0 ] ; then apt-get purge $list fi 

注意:您需要sudo权限才能创建文件,因此请使用:

 gksu gedit /usr/local/bin/rm-kernels 

要使文件可执行使用:

 sudo chmod +x /usr/local/bin/rm-kernels 

注意:对于此脚本的服务器(基于文本,而不是GUI)版本,请参阅: 如何删除旧内核版本以清除启动菜单?


2017年7月28日更新

每个内核的计算大小取自/boot/*kernel_version* ,这是5个文件,总计约50 MB。 公式已更改为包含/usr/src/*kernel_version*/lib/modules/*kernel_version* 。 每个内核的计算大小现在约为400 MB。 上面的rm-kernelsrm-kernels-server代码已经更新。 但是,上面的示例屏幕尚未反映这些变化。

默认情况下,估计linux-headers的文件大小为125 MB,linux-image为220 MB,因为除非文件位于缓存中,否则du会非常缓慢。 要使用du获取实际大小,请将任何参数传递给脚本。

现在,标题栏中显示了所有内核大小(不包括当前正在运行的版本,无法删除)的总和。

用于显示每个内核的上次访问日期的对话框。 在备份或类似操作期间,可以为所有内核大量覆盖此日期。 该对话框现在显示修改日期

您可以通过synaptic包管理器轻松处理内核。 但首先你应该在终端提示符中知道当前使用的内核版本名称:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic所以至少这个版本你应该保持不变。 打开synaptic并开始填写快速filter占位符,如下所示: 在此处输入图像描述 现在,您可以选择要删除的所有包,并执行以下操作: 标记为完全删除 – >应用 。 我建议至少保留一个最新的当前内核包和一个以前的内核。 例如,在这种情况下,您可以安全地摆脱linux-image-4.4.0-66-genericlinux-image-extra-4.4.0-66-generic ,但它很好地保留4.4.0-72当然4.4.0-75

对于命令行缓解:

https://github.com/erichs/bootnukem

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

然后

 sudo bootnukem --dry-run 

适用于Linux Mint 18.3(基于Ubuntu 16.04)。

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

资料来源: https : //ubuntuforums.org/showthread.php?t = 2248846&p = 13146650#post13146650