如何在 /boot 中释放更多空间?

use*_*722 590 filesystem boot init hard-drive disk-usage

我的/boot分区快满了,每次重新启动系统时都会收到警告。我已经删除了旧的内核包(linux-headers ...),实际上我这样做是为了安装自动更新附带的较新内核版本。

安装新版本后,分区又快满了。那我还能删除什么?是否有其他一些与旧内核映像相关的文件?

这是我的/boot分区上的文件列表:

:~$ 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
Run Code Online (Sandbox Code Playgroud)

目前,我正在使用3.0.0-14-generic内核。

Lek*_*eyn 659

你有很多未使用的内核。删除除最后一个内核之外的所有内核:

sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}
Run Code Online (Sandbox Code Playgroud)

这是以下的简写:

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
Run Code Online (Sandbox Code Playgroud)

删除linux-image-x.x.x-x包也将删除linux-image-x.x.x-x-generic.

头文件安装/usr/src在构建外树内核模块(如专有的 nvidia 驱动程序和 virtualbox)时使用。如果linux-image-*没有安装匹配的内核包 ( ),大多数用户应该删除这些头包。

要列出所有已安装的内核,请运行:

dpkg -l linux-image-\* | grep ^ii
Run Code Online (Sandbox Code Playgroud)

显示所有可以删除的内核和头文件的命令,不包括当前正在运行的内核:

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

它选择所有以linux-headers-<some number>or开头linux-image-<some number>的包,打印已安装包的包名,然后排除当前加载/运行的内核(不一定是最新的内核!)。这符合在删除旧的已知工作内核之前测试新内核的建议。

因此,在升级内核并重新启动以进行测试后,您可以使用以下命令删除所有其他内核:

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

  • 很棒的答案。另一条信息会有所帮助:您如何确定(确定)您正在使用哪些内核?大概你不能假设它是最后一个...... *编辑*:它*看起来*答案是`uname -a`。可能最好确保您没有挂起的重新启动安装新内核挂起(正如我所做的那样;但我注意到 `uname -a` 和“最新”内核之间的不匹配)。 (19认同)
  • 如果 apt-get purge 由于未满足的依赖关系而失败,那么您可以按照 http://askubuntu.com/questions/171209/my-boot-partition-hit-100-and-now-i-cant-upgrade-cant 上的建议进行操作-remove-old-kernels-to/171225#171225 (12认同)
  • 非常彻底的答案并且仍然有效......并且在 2014 年仍然需要​​。有点荒谬的是它仍然没有由 GUI 工具自动完成。 (11认同)
  • @byf-ferdy 内核是操作系统的重要组成部分,如果最新版本不知何故不能完全与您的硬件兼容,那么您仍然可以选择其他版本进行引导。一个不错的功能可能是删除所有自动安装的超过一个月的内核(除了最近的两个)。 (6认同)
  • @freddyb 完成。请注意,这些命令会打印/删除 ** 加载/启动内核以外的内核**。 (5认同)
  • 为什么这是必要的?为什么 Ubuntu 本身不会删除未使用的旧内核?这对新用户来说不是更舒服吗? (3认同)
  • @Lekensteyn 对我来说, /boot 正在运行的 GUI 警告主要是在升级后出现。所以你说这也会删除尚未启动的最新版本?:/ (2认同)
  • `sudo dpkg --remove` 可用于删除未使用的内核([来源](http://kevinjmorse.ca/articles/gzip-stdout-no-space-left-device-when-doing-apt-get-f-安装))。当我的空间严重不足时运行上面的 `purge` 命令对我不起作用,但是在我手动删除一个内核后它确实起作用了。 (2认同)
  • 我不确定为什么它对我不起作用,但我最终使用了 bootnukem 并且有效 https://github.com/erichs/bootnukem (2认同)

dwa*_*ard 231

您的启动分区已满。由于这是内核更新,因此这些文件将被复制到引导分区,因此您需要清除。这是一篇博客文章,将向您展示如何使用一个命令清除旧的内核映像。我将给出该方法的基本概要。使用此命令打印出内核的当前版本:

uname -r
Run Code Online (Sandbox Code Playgroud)

然后使用此命令打印出您安装的所有不是最新内核的内核:

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

确保您当前的内核不在该列表中。请注意这是最终命令的大部分内容(如下所示)。要卸载和删除这些旧内核,您需要将这些参数通过管道传输到:

sudo apt-get -y purge
Run Code Online (Sandbox Code Playgroud)

现在我们可以通过将最后两个命令组合成这个邪恶的混乱来做我们想做的一切:

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
Run Code Online (Sandbox Code Playgroud)

一个命令将为您处理一切。我会确认这确实有效,但永远不要相信互联网上的任何人。:) 有关更多信息,博客文章很好地解释了命令的每个部分的作用,因此请通读它,以便您对它执行您想要的操作感到满意。

  • 该命令听起来不错,但是当我运行它时,我遇到了与我想安装某些东西时遇到的错误相同的错误,但由于启动已满而无法安装:--------------- -----------以下软件包具有未满足的依赖项: linux-image-extra-4.2.0-27-generic : Depends: linux-image-4.2.0-27-generic 但它不会要安装 linux-image-extra-4.2.0-30-generic :取决于: linux-image-4.2.0-30-generic 但它不会被安装 (11认同)

小智 114

sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

该命令正在自动完成这项工作。

  • 顾名思义,apt-get AUTOremove 是一种自动化操作,系统会在其中“最佳猜测”您要实现的目标。它不应用作常识系统管理的替代品。这种方法的问题:如果您(或更新)删除属于此依赖项列表的包,自动删除功能想要删除依赖项列表中的所有其他包,使您的系统无法工作桌面(有时即使系统完全损坏)。 (7认同)
  • 如果安装了 linux-image-generic 并且没有明确安装新内核,这将删除旧内核。常识是不先阅读系统的任何更改就不要接受它们。如果在使用此命令之前已经使用了常识,那么就不会有问题。 (7认同)
  • 如果在 **before** 存在空间不足的情况下使用 autoremove 有效。但是,一旦 apt 空间不足并中止(并且用户最终注意到问题),那么运行 autremove 或任何其他基于 apt 的解决方案为时已晚。如果您是这种情况,请尝试其中一种基于 dpkg 的解决方案。 (5认同)
  • @Rinzwind - 此命令通过删除旧的“linux headers”清空了 250 mb 的磁盘空间 (2认同)

fos*_*dom 40

Synaptic Package Manager 可用于轻松选择和删除旧的内核映像。 Synaptic 包管理器的屏幕截图

如果您还没有安装 Synaptic:

sudo apt-get install synaptic
Run Code Online (Sandbox Code Playgroud)

启动应用程序并选择显示的选项。

根据 /boot 文件夹中的文件,您应该能够突出显示所有版本为“2.6.x”的“linux-”包,其中 x 介于 31 到 38 之间。

右键单击这些 linux 软件包中的每一个,然后选择选项“标记为完全删除”。最后点击应用按钮。这将删除所有文件和任何关联的文件。您的/boot文件夹现在应该更整洁了。

  • 不好了。我无法安装 Synaptic,因为 `/boot` 上没有空间! (8认同)

小智 25

感谢您详细说明您的问题,这使我朝着正确的方向前进。虽然保留以前的内核文件很有用,但您可以一次性删除所有这些文件,请查看这篇文章:
如何删除所有未使用的 Linux 内核头文件、映像和模块

通过命令行完成。如果您通过远程使用 WINSCP 之类的工具打开终端会话并将其粘贴到其中,则效果很好。

这是从文章链接复制的,我建议您阅读全文:

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
Run Code Online (Sandbox Code Playgroud)


Rma*_*ano 23

这是一个旧问题的新答案,但清理这个东西(以及更多)的一个简单方法是安装Ubuntu Tweak。要安装它

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak
Run Code Online (Sandbox Code Playgroud)

然后你可以运行 Ubuntu Tweak,转到“管理员”选项卡,从这里点击三下:

Ubuntu 为旧内核调整管理员

不过,为了安全起见,最好保留最后一个内核(你永远不知道)或一个众所周知的工作内核;但这很容易定制。

您可以使用相同的工具来清理很多东西——请记住,如果您清理缩略图缓存或 TB 缓存,那么系统将不得不在需要时重建它们。


Phr*_*ogz 20

我能够通过使用dpkg直接删除包来解决问题。尽管软件包仍列在 中dpkg -l,但文件已从 中删除/boot,从而释放空间。

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`
Run Code Online (Sandbox Code Playgroud)

在此之后,apt-get -f install解决了我的依赖问题,一切都很好。

然而,我不会接受我的这个答案,因为我仍然需要知道我是否应该增加我的/boot尺寸或做其他事情。

  • 和图像的“sudo dpkg --remove linux-image-3.5.0-28*”,通过“df -h”检查 (2认同)

psu*_*usi 17

您可以停止使用单独的 /boot 分区,那么那里的空间就不会那么有限。为此,请卸载分区,然后将其挂载到其他位置并将那里的所有文件复制到根分区的 /boot 目录中,然后从 /etc/fstab 中删除该条目并重新安装 grub。例如(您需要使用正确的分区):

sudo -s
umount /boot
mount /dev/sda2 /mnt
cp -a /mnt/* /boot/
umount /mnt
gedit /etc/fstab
grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 gparted 删除旧的 /boot 分区,并可能扩展根分区以使用该空间。要扩展根分区,您需要从 livecd 引导,并且可用空间需要立即在右侧。如果 /boot 分区当前位于根分区的左侧,那么您需要先将根分区移动到左侧,然后扩展它,但这可能需要非常非常长的时间,因此可能不值得麻烦。

  • 将 /boot 移动到我的主分区对我来说不是一个解决方案,因为除 /boot 之外的所有内容都是加密的。你不能从我的问题中知道这一点,抱歉。 (7认同)

use*_*408 13

充分利用上述答案,我经过验证的方法是这样的:

  • uname -a 找到正在运行的内核。
  • dpkg -l linux-{headers,image}-\* | grep ^ii列出所有当前安装的内核相关软件包。这将包括正在运行的内核。
  • sudo apt-get purge linux-{image,headers}-3.16.0-{xx,yy,zz}删除旧内核。替换xx,yy,zz为要删除的内核构建列表——这些是上一个命令列出的比当前运行的内核更旧的所有构建。确保您没有删除当前正在运行的内核——您的系统将变得无法启动。您可能还需要将内核版本更改3.16.0为系统上安装的任何版本。
  • 或者,做一个额外的sudo apt-get autoremove——这将删除当前内核不再需要的旧内核的任何剩余依赖项,释放更多空间。

您可能有没有安装匹配内核版本的头文件,反之亦然——只需在命令中包含所有这些版本。APT 会抱怨某些软件包由于未安装而无法删除,但这不会造成任何伤害。

如果某事失败...

  • 如果APT命令将失败,因为设备上没有剩余空间误差,使用相应的dpkg命令:sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}
  • 如果 dpkg 命令仍然不起作用,因为相同版本linux-imagelinux-headers软件包(您也想卸载)需要这些软件包,则 dpkg 可能无法解决该问题。重新检查输出dpkg -l并在命令行上指定任何包名称后缀。例如,在我的一个系统上,最终起作用的命令是sudo dpkg --purge linux-{image,headers}-3.16.0-{xx,yy,zz}-generic-pae.
  • 如果您遇到任何其他错误,请寻求帮助 - 您遇到的问题可能与您想象的不同。


Hem*_*rat 9

列出所有内核:

dpkg --list 'linux-image*'
Run Code Online (Sandbox Code Playgroud)

显示当前内核:

uname -r
Run Code Online (Sandbox Code Playgroud)

列出当前内核之外的所有内核:

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

确保您当前的内核不在该列表中。

删除当前内核之外的所有内核:

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
Run Code Online (Sandbox Code Playgroud)

清除其他内容:

sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

如果它仍然给你安装/卸载文件的启动磁盘空间错误,那么直接从 /boot 目录中删除OLD映像之一,

ls -lh /boot/*-3.13.0-119*;

rm /boot/*-3.13.0-119*; 
Run Code Online (Sandbox Code Playgroud)

注意:在删除任何映像之前,请再次查看当前的内核映像。

如果它仍然抛出任何错误,则重复以下命令以删除不需要的内核,

sudo dpkg --purge linux-image-X.X.X-XXX-generic linux-image-extra-X.X.X-XXX-generic linux-signed-image-X.X.X-XXX-generic
sudo dpkg --purge linux-image-Y.Y.Y-YYY-generic linux-image-extra-Y.Y.Y-YYY-generic linux-signed-image-Y.Y.Y-YYY-generic

sudo apt-get -f install

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
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,这两个apt-get purgedpkg --remove两个失败。所以我不得不从 /boot 中删除了几个旧的内核映像rm -f

  • 这不是删除包的好方法。虽然这个答案并不是很具体地说明为什么以正确的方式删除它们失败了,但我确信如果提供了该信息(当然是在一个单独的问题中),我们将能够尝试找出问题的原因。 (4认同)
  • 我相信它失败了,因为`/boot` 分区已满。此命令首先尝试将内核升级到最新版本,并在生成 initrd.img 时崩溃并显示“设备上没有剩余空间” (2认同)
  • 警告,直接删除文件可能会导致问题,因为 linux 固件包的更新可以为它认为根据包信息安装的每个版本重新创建 initrd.img 文件。请参阅:http://askubuntu.com/questions/865577/how-to-avoid-update-of-package-linux-firmware-creating-initrd-img-files (2认同)
  • 谢谢,这是在没有其他任何工作的情况下挽救生命的最终解决方案。 (2认同)

归档时间:

查看次数:

643568 次

最近记录:

4 年,9 月 前