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


123

我尝试这样做,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

输出加入ls -l /bootuname -a你的问题。
jippie 2012年

还将输出添加dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'到您的问题。
jippie 2012年

ls -as /boot可能会有用。它将仅包括文件的大小。
adempewolff 2012年

LS的输出-l /启动是相当长的太张贴在这里,所以这里就是引擎收录pastebin.com/yM1aEJUx

5
不它不是。这是造成您问题的原因。如果您的问题确实时间太长,则有人会对其进行编辑。使用诸如pastebin之类的外部服务将破坏问题的价值,以备将来参考。
jippie 2012年

Answers:


160

您的/ 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 withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" 查找当前正在运行的内核版本
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d 除去所有行,但包含当前正在运行的内核版本号的行除外
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ 对于每行列表,仅软件包名称
  • /[0-9]/!d 删除不包含数字的行。

为了解决Frederick Nord的问题,我认为可以将命令修改如下:

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

它基本上增加了一个额外的过滤器:

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

/ Intermezzo

在哪里some-kernel-package可以替换为列出的软件包之一。请注意,不要删除当前正在使用的内核软件包(如所列出uname -a)。sudo apt-get purge -y linux-headers-3.0.0-12等等

可以使用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

2
此解决方案的灵感来自OzzyFrank在ubuntugenius.wordpress.com/2011/01/08/…
jippie 2012年

6
是的,为什么这是一个问题?这不应该由用户来处理。
伊莱贾·林恩

2
FWIW:这对我也匹配linux-libc-dev:amd64。因此,它可能会有点过于慷慨。
弗雷德里克·诺德

4
It does that sometimes, not sure why it is never fixedUbuntu决定好坏决定是提供常规的新内核作为新软件包,而不是作为对现有软件包的升级,以提供安装多个内核并随意切换的选项。我同意这个假设并不适合95%的人,他们只需要最新的内核(如果出现新的引导问题,可能只是一个回退),而又不想自己管理安装的内核。也许将来Ubuntu会改变这种行为。现在,确保/ boot很大。
thomasrutter 2014年

1
@thomasrutter如果您(像我和您所谈论的95%的人一样)认为此错误很重要,请在此处对其进行
FriendFX

46

sudo apt-get autoremove

帮了我大忙,成功清除了所有未使用的内核包。


3
这是不正确的。from man apt-getautoremove用于删除为满足某些软件包的依赖性而自动安装且不再需要的软件包。不会安装内核来满足依赖关系,而是在升级过程中安装它们。
dward

5
@neon_overload我刚刚发布了它,因为它对我有用。
裸照

1
@dward它确实为我腾出了一些空间: 在autremove之前: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot 之后: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan

6
在“没有足够的可用磁盘空间”对话框中,应该有一个按钮来执行此任务。这将特别有助于不熟悉命令行的新手用户。
Martin R.

1
在不破坏我的操作系统的情况下完成了技巧
Ruthvik Vaila

8

等效于公认的答案-另一种(可能)更简单的方法是安装该ubuntu-tweak工具,可以从此处下载该工具。转到“管理员”,然后选择“旧内核”进行清理。只需单击几下即可完成。(在14.04台式机上测试)

在此处输入图片说明


缺少空间的/boot情况一直在发生,因此这是我最喜欢的解决方案-易于运行的应用程序,只需单击一下即可完成工作。
s3m3n 2015年

2

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

基于Zenity和Bash的解决方案

Zenity为终端提供了一个不错的GUI界面,可以处理列表并使用单选按钮选择项目:

rm内核1

引导时使用的当前内核无法删除,也不包含在列表中。报告的大小是将保存在/boot目录中的大小。由于内核二进制文件也位于其他区域,因此可以节省更多磁盘空间。2017年7月27日注意:目录/usr/src/*kernel_version*/lib/modules/*kernel_version*现在也包括在内。

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

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] 

编码

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

#!/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 '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --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 w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-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-header的文件大小为125 MB,linux-image的文件大小为220 MB,因为du除非文件在高速缓存中,否则可能会非常缓慢。要使用来获取实际大小du,请向脚本传递任何参数。

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

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


你真厉害!真的非常感谢!你让我开心!
zhartaunik

0

您可以通过突触包管理器轻松处理内核。但是首先,您应该在终端提示符下知道当前使用的内核发行版名称:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic 因此,至少这个版本应该保持不变。打开突触并开始填写快速过滤器占位符,如下所示: 在此处输入图片说明 现在,您可以选择要删除的所有软件包并执行以下操作: 标记为完全删除->应用。我建议至少保留一个最新的当前内核软件包和一个先前的内核。例如,在这种情况下,您可以放心地删除linux-image-4.4.0-66-genericlinux-image-extra-4.4.0-66-generic,但是最好保留4.4.0-72 ,当然4.4.0-75



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.