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


563

我的/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

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


5
值得一提的是,并不是每个Ubuntu安装都将有一个单独的/ boot分区-通常它都只是一个大分区。此答案适用于确实具有单独的/ boot分区的用户。使用LVM或“全盘”加密的用户需要单独的/ boot,否则可能是可选的。
thomasrutter 2014年

4
如果其他任何人都和我有同样的问题:/ boot没有剩余空间,则为生成的内核重新生成initrd文件或通过检查update-initramfs脚本认为已安装的内核时,“ apt-get upgrade”将失败。 / var / lib / initramfs-tools的内容。在这种情况下,无法使用apt-get删除旧内核,因为fscking / boot分区在设备上没有剩余空间。可以使用“ dpkg -P”执行此操作,然后清除/ boot中的相应条目(以释放空间)和/ var / lib / initramfs-tools(不会生成initrd映像)。
wojci '02

3
正确答案的关键是它们告诉您删除包含旧版本内核的软件包。许多解决此问题的网页建议直接删除/ boot分区中的文件;可能会工作一段时间,但最终您可能会更新一个软件包,以重新创建具有该软件包的内核版本所缺少的文件,从而使您的空间不足。
kgrittn

Answers:


629

您有很多未使用的内核。使用以下命令删除除最后一个内核以外的所有内核:

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

这是以下内容的简写:

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

删除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

一个命令显示所有可以删除的内核和头文件,当前运行的内核除外:

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

它选择所有以linux-headers-<some number>或开头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]+//')")

16
很棒的答案。进一步的信息会有所帮助:您如何确定(确定)正在使用的内核?大概您不能仅仅假设它是最后一个... 编辑看起来答案是uname -a。可能最好的方法是确保您没有挂起的“重新安装新内核”挂起(就像我所做的那样;但是我注意到uname -a与“最新”内核之间的不匹配)。
TJ Crowder 2012年

5
@freddyb完成。请注意,该命令将打印/除去已加载/引导的内核以外的内核
Lekensteyn 2012年

9
如果由于未满足依赖关系而导致apt-get清除失败,那么您可以按照askubuntu.com/questions/171209/…
svandragt 2013年

11
非常详尽的答案,仍然有效……并且在2014年仍然需要​​。有点荒谬的是,GUI工具仍无法自动完成它。
2014年

6
@ byf-ferdy内核是操作系统的重要组成部分,如果最新版本无法完全与您的硬件配合使用,那么您仍然可以选择其他内核来启动。一个不错的功能可能是删除一个月以上(最近两个月除外)的所有自动安装的内核。
Lekensteyn

217

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

uname -r

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

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

确保您当前的内核不在该列表中。请注意,这是最终命令的主要部分(下方)。要卸载和删除这些旧内核,您需要将这些参数传递给:

sudo apt-get -y purge

现在,我们可以通过将以下两个命令组合到这个令人讨厌的混乱中来做我们想要的一切:

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

而这一命令将为您处理所有事情。我将确认这确实可以正常工作,但永远不要信任互联网上的任何人。:)有关更多信息,博客文章对命令的每个部分做了什么都提供了很好的解释,因此请通读它,以便您对命令的作用感到满意。


这也匹配linux-libc-dev:amd64
Frederick Nord

意外删除“ linux-libc-dev:amd64”会导致什么?
ConfusedStack 2014年

@FrederickNord感谢您的注意。解决此问题。编译c程序会遇到一些困难。
dward

8
该命令听起来不错,但是当我运行它时,我得到的错误与我要安装某些东西时出现的错误相同,并且由于引导已满而无法执行:--------------- -----------以下软件包具有未满足的依赖项:linux-image-extra-4.2.0-27-generic:依赖于:linux-image-4.2.0-27-generic但它不会继续要安装linux-image-extra-4.2.0-30-generic:取决于:linux-image-4.2.0-30-generic,但不会被安装
Alex

109
sudo apt-get autoremove

该命令自动执行该作业。


7
顾名思义,apt-get AUTOremove是一种自动化操作,系统将根据其“最佳猜测”来尝试实现目标。它不应替代常识系统管理。这种方法的问题:如果您(或更新)删除了此依赖项列表中的一个软件包,则自动删除功能希望删除该依赖项列表中的所有其他软件包,从而使您的系统无法在台式机上工作(有时即使系统完全崩溃)。
Rinzwind

参考文献:1的多源高于此评论:linuxquestions.org/questions/debian-26/...
Rinzwind

7
如果已安装linux-image-generic且未显式安装新内核,则将删除旧内核。常识是不先阅读它们就不接受对系统的任何更改。如果在使用此命令之前已使用常识,则不会有任何麻烦。
mchid 2015年

1
@Rinzwind-此命令通过删除旧的“ Linux标头”来清空我的250 MB磁盘空间
Chinmaya B

3
如果空间不足的条件存在之前使用autoremove,则该方法有效。但是,一旦apt空间不足并中止(并且用户最终注意到了问题),则运行autremove或任何其他基于apt的解决方案为时已晚。如果是这种情况,请尝试一种基于dpkg的解决方案。
user535733 '17

40

Synaptic软件包管理器可用于轻松选择和删除旧的内核映像。 Synaptic软件包管理器的屏幕快照

如果尚未安装Synaptic:

sudo apt-get install synaptic

启动应用程序,然后选择显示的选项。

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

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


我在14.04。我过去已经通过命令行处理了这种情况,但是我决定今天尝试这种方法...对我来说,我的linux映像位于已安装(手动)下,而不是已安装(本地或过时)下
Ryan

8
不好了。我无法安装Synaptic,因为上没有空间/boot
John McGehee

@JohnMcGehee fsck和parted应该为您解决该问题。
FlipMcF

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

23

这是对一个老问题的新解答,但是清除此问题(以及更多)的一种简单方法是安装Ubuntu Tweak。要安装它

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

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

Ubuntu调整旧内核的管理员

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

您可以使用同一工具来清理很多东西---请记住,如果您清理缩略图缓存或TB缓存,则系统将必须在需要时重建它们。


我试图安装Ubuntu tweak,也要访问存储库网站。它说它仅适用于13.10及之前。您是否有15.04的更新版本?
JayCouture.com 2015年

@ JayCouture.com该站点中的版本适用于14.04(“适用于13.10及之前”是指向较早发行版的链接)。我忽略是否有14.10或15.04的版本。
Rmano

19

我可以通过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`

此后,apt-get -f install解决了我的依存关系问题,整个世界一切都很好。

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


首先,您应该没有单独的/ boot分区,或者由于100mb太小而应该增加其大小。
psusi 2011年

1
谢谢,我通过以下方式删除:sudo dpkg --remove linux-headers-3.5.0-28*
TiloBunt13年

2
sudo dpkg --remove linux-image-3.5.0-28*用于将图像,通过检查df -h
TiloBunt

谢谢,这也为我服务。我删除了一些旧内核(不是我当前正在使用的内核),然后执行了apt-get -f install。另外,不要忘了以后再做apt-get autoremove,可能会删除不需要的其他内容。
Yajo

15

您可以停止使用单独的/ 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

然后,您可以使用gparted删除旧的/ boot分区,并可能扩展根分区以使用该空间。要扩展根分区,您将需要从livecd引导,并且可用空间必须紧靠右侧。如果/ boot分区当前位于根分区的左侧,则需要首先将根分区移至左侧,然后将其扩展,但这可能会花费非常非常长的时间,因此可能不值得麻烦。


6
对我来说,将/ boot移到我的主分区不是一个解决方案,因为/ boot以外的所有内容都是加密的。很抱歉,您从我的问题中无法得知。
user6722 2011年

如果以上解决方案由于引导卷上根本没有空间而无法使用,或者反复出现“空间不足”的问题,则这是一个很好的解决方案。请先阅读为什么有时需要具有/ boot分区的原因:(help.ubuntu.com/community/DiskSpace
svandragt 2014年

@svandragt,这些天基本上没有理由需要/ boot分区了。剩下的唯一一个就是您的BIOS是否损坏并且看不到整个磁盘,并且过去十年中制造的任何计算机都没有这种限制。grub2现在可以正确处理其他传统情况,例如使用raid或LVM。
psusi 2014年

有一个单独的启动分区的原因有很多。但是我不确定增加复杂性设置的好处是否值得。1.操作系统可以受益于通过ext2更快地启动。2.可以通过将/ boot安装为RO来提高安全性。(rootkit等),甚至在OS运行时仍未卸载。3. grub(1)在ext4上仍然有一些问题。4.运行lvm(grubv1)所需。虽然这不适用于默认的ubuntu设置。
大卫·卡希尔

lsblk可以用来确定哪个分区是什么
紫色先生,

9

从上面的答案中获得最大的收获,我的可靠方法是:

  • 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
  • 如果您遇到任何其他错误,请寻求帮助-您可能遇到的问题与您想象的不同。

@ user535733的通常情况(至少是我一直遇到的情况)是在上面仍有一些空间/boot,不足以容纳另一个内核包。在这些情况下,上面的方法效果很好。不过,请随意添加相应的dpkg命令。至于purge,不,这不是一种“强制消除”。它与的不同之处remove在于,它也删除了配置文件。因为/只要内核软件包不安装任何配置文件,remove并且purge对内核软件包也一样。
user149408 '17

使用相应的dpkg命令添加了第四个项目符号。
user535733 '17

4

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


4
这不是删除软件包的好方法。虽然这个答案不是很清楚为什么以正确的方式删除它们失败了,但我可以确定是否提供了该信息(当然是在另一个问题中),我们将能够尝试找出问题的原因。
thomasrutter

2
我相信它失败了,因为/boot分区已满。此命令首先尝试将内核升级到最新版本,并No space left on device在生成时崩溃initrd.img
vp_arth 2015年

1
警告,直接删除文件可能会导致问题,因为linux-firmware软件包的更新可以根据软件包信息为它认为安装的每个版本重新创建initrd.img文件。参见:askubuntu.com/questions/865577/…–
kgrittn

1
谢谢,这是挽救生命的最终解决方案。
杰夫·普基特

4

列出所有内核:

dpkg --list 'linux-image*'

显示当前内核:

uname -r

列出所有内核除非当前之一:

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

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

删除所有内核除非当前之一:

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

清除其他内容:

sudo apt-get autoremove

如果仍然为您提供用于安装/卸载文件的启动磁盘空间错误,则直接从/ boot目录中删除OLD映像之一,

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

rm /boot/*-3.13.0-119*; 

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


2

我已经删除了旧的内核程序包(linux-headers ...)

linux-headers-*不是内核。内核软件包名为linux-image-*。命名的linux-headers-*是用于编译内核模块的开发包:它们不位于/ boot目录中,并且对于日常使用系统而言不是必需的。

您在/ boot中列出的文件确实包含几个旧的内核映像(vmlinuz*)和initrd.img*这些内核的已编译initrd映像(),这表明您仍然安装了许多旧的内核软件包。

您应该能够列出已安装的内核

aptitude search ~ilinux-image

(请注意,这也可能会返回非内核的软件包)。

通常不需要安装两个以上的内核-当前正在使用的一个内核,以及之前使用的一个(作为备用)。因此,您可以开始逐个删除旧版本,如下所示:

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

确保将“ 3.2.0-23-generic”替换为要删除的实际内核版本!另外,请勿删除软件包linux-image-generic。您必须非常小心,不要删除当前正在运行的内核,否则将无法启动(Ubuntu可能会或可能不会警告您这样做)。

您可以使用以下命令找到当前正在运行的内核:

uname -r

1

我有这个问题,甚至更多,因为我initrd-img-xxx从/ boot手动删除了一些文件,并且我遇到了一个问题,这些旧版本一直在生成并填充在/boot文件夹中。要修复它,我遵循以下内容:

  • 我手动删除了生成的旧内核版本,以便释放空间。
  • 您将以超级用户身份编辑文本配置文件,因此将以下内容粘贴到终端中:

    sudo gedit /etc/initramfs-tools/update-initramfs.conf
    
  • 找到该行update_initramfs=yes并将其更改为update_initramfs=no。保存并退出文件,然后运行:

    sudo dpkg --configure -a
    

那解决了我的问题。那是基于这个博客

希望重新启动时一切正常,以后可以尝试将其更改noyesin update-initramfs.conf


1

我表明,仍然在2017年,这个问题有新的评论和答案,但缺少一个我认为在这里非常有用的答案:

Ubuntu作为日常使用简单的桌面操作系统,没有理由使用单独的\ boot分区进行安装,而类似的东西将无法为“普通用户”提供某些东西。因此,解决方案是在没有\ boot分区的情况下进行全新安装。这样你永远不会有这样的问题

PS:我的答案可以删除,也可以在接受的答案中添加...(我认为这样可以对某些人有所帮助)



0

在智能或突触中有一个部分“旧的或手动安装的包装”。那里应该有旧的linux软件包。


0

我在下面编写了一个bash脚本,使该过程更加人性化。

YMMV-它是为Mint 14设计的。仍在学习BASH,因此可能有点笨拙。使用风险自负,但对我有用!

#!/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

0

[作为AskUbuntu菜鸟,我只能在声誉= 50之前发表评论,因此请不要投票。]

我的服务器也在这样做。从字面上看,这里没有一个预期的答案有效,因为它们需要/ boot上有一些工作空间才能完成。如果启动分区已满,它将突然结束而不会删除任何映像。

对我而言唯一有效的方法是查看当前图像,然后手动sudo rm filename查看最旧的图像文件(每个文件的名称均为-3.16.0-30)。一旦完成,sudo apt-get autoremove便有了完成其工作所需的摆动空间。它确实突出显示了与该版本相关的一些错误,例如:“ depmod:FATAL:无法加载/boot/System.map-3.16.0-30-generic:无此类文件或目录”,但这是可以预期的。

完成后,df返回42%的/ boot使用率,以表明它再次正常运行。


1
您正在寻找的帖子是askubuntu.com/questions/171209/…–
muru

@muru好吧,是的。。。我建议原始的海报也需要这个建议。一旦/ boot已满,尝试修复它的这些脚本版本也会失败,因为/ boot已满。
贾斯汀·凯斯

嗯,有两个类似的问题:a)系统警告您的磁盘已满,但apt-get有足够的空间继续运行; b)apt-get由于磁盘太满而失败。那是另一篇文章。
muru


0

将此脚本另存为/usr/local/bin/remove_kernels.sh(记住要赋予执行权限sudo chmod 755 /usr/local/bin/remove_kernels.sh):

#!/bin/sh
if test $(id -u) != 0; then
 echo Error: You must be root to run this script!
 exit 1
fi
apt purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
update-grub

然后删除所有旧内核,只需键入: sudo remove_kernels.sh


0

/ boot分区有时可能有点奇怪

不要直接开始删除内核文件。

遵循的步骤

  1. 检查linux系统正在使用的当前安装的内核

    uname -r

    这应该给您系统上当前安装的内核映像的名称

  2. 现在开始删除多余的文件,但系统上已安装一个特定的文件

    apt-get remove linux-image-XXXXX

  3. 还要删除头文件

    apt-get remove linux-headers-XXXXX

  4. 也可能apt存在停止工作的情况,在这种情况下,请切换到/ boot

    cd /boot

  5. 开始手动删除文件,但要非常小心,也要记住不要installed one's从系统中删除内核文件。

    rm linux-image-XXXXX

    rm linux-image-extra-XXXXXX

  6. 删除正确的文件后,清理部分安装(如果有)

    apt-get -f install

  7. 删除坐在那里的多余文件,以手动清理启动文件

    apt-get autoremove

  8. 更新grub

    update-grub

  9. 最后更新您的系统软件包

    apt-get update


-1

如果无法删除更多未使用的文件,并且同一设备上还有其他分区具有/或可用空间,则可以通过parted / gparted来调整/ boot分区的大小。(它也包含在安装媒体中。)

警告调整分区大小是危险的操作,在执行操作之前,请将重要数据保存在其他介质上!


小型/ boot分区的大多数用户在安装时选择了“全盘加密”,这需要LVM。这种解决方案似乎会给他们带来更多的问题。
user535733 '17
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.