我的/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内核。

评论

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

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

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

help.ubuntu.com/community/RemoveOldKernels

#1 楼

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

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 }' | 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 }' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")


评论


很棒的答案。进一步的信息会有所帮助:您如何确定(确定)正在使用的内核?大概你不能仅仅假设它是最后一个...编辑:而且看起来答案像是-a。最好是确保没有待处理的重新启动到新内核的挂起(就像我所做的那样;但是我注意到uname -a和“最新”内核之间的不匹配)。

– T.J.拥挤者
2012年6月14日在8:39



@freddyb完成。请注意,该命令将打印/删除除已加载/引导的内核以外的其他内核。

– Lekensteyn
12年8月13日在13:57

如果由于未满足依赖关系而导致apt-get清除失败,则可以按照askubuntu.com/questions/171209/…的建议进行操作。

– svandragt
13年8月7日在8:33

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

– allprog
2014年4月3日在8:30

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

– Lekensteyn
2014年11月1日14:23

#2 楼

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

uname -r


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

dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print }' | 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 }' | 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)
14年8月29日在16:39

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

– ConfusedStack
14-10-12在0:37

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

–奖品
2014年10月14日19:01

该命令听起来不错,但是当我运行它时,我得到的错误与我要安装某些东西时出现的错误相同,并且由于引导已满而无法执行:--------------- -----------以下软件包具有未满足的依赖性: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
16-10-1在3:29



#3 楼

sudo apt-get autoremove


此命令自动执行工作。

评论


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

–灵风
2012年11月5日上午10:09

参考:以上评论中的1个来源:linuxquestions.org/questions/debian-26/…

–灵风
2012年11月5日,10:10

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

– mchid
2015年3月1日23:34

@Rinzwind-该命令通过删除旧的“ Linux标头”清空了250 MB的磁盘空间

– Chinmaya B
15年7月28日在4:41

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

–user535733
17年2月2日,14:25

#4 楼

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


如果尚未安装Synaptic:

sudo apt-get install synaptic


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

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

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

评论


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

–瑞安
16年7月9日在20:32

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

– John McGehee
16年9月16日在20:14

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

– FlipMcF
17年4月3日在20:10

#5 楼

感谢您提供有关问题的详细信息,这使我朝着正确的方向前进。尽管保留以前的内核文件很有用,但您可以一次性删除所有内核文件,请查看以下文章:如何删除所有未使用的Linux内核头文件,映像和模块

通过命令行完成。如果您通过远程方式执行此操作,则可以使用WINSCP之类的工具来打开终端会话并将其粘贴,效果很好。

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

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


#6 楼

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

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


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



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

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

评论


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

–JayCouture.com
2015年5月10日13:57

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

–罗马诺
15年5月11日在22:15



#7 楼

我可以使用dpkg直接删除软件包来解决此问题。尽管dpkg -l中仍列出了这些软件包,但已从/boot中删除了文件,从而释放了空间。

但是,我不会接受我的回答,因为我仍然需要知道是否应该增加我的apt-get -f install尺寸或做其他事情。

评论


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

–psusi
2011年12月4日4:07在

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

– TiloBunt
13年7月16日在17:34



和sudo dpkg-删除linux-image-3.5.0-28 *作为映像,通过df -h检查

– TiloBunt
13年7月16日在17:57

谢谢,这也为我服务。我删除了一些旧内核(不是我当前正在使用的内核),然后安装了apt-get -f。另外,不要忘记稍后执行apt-get autoremove,可能会删除不需要的其他对象。

– Yajo
19年4月4日在12:40

#8 楼

您可以停止使用单独的/ 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分区当前位于根分区的左侧,则需要首先将根分区移至左侧,然后将其扩展,但这可能需要非常非常长的时间,因此可能不值得麻烦。

评论


因为/ boot以外的所有内容均已加密,所以将/ boot移至主分区对我来说不是解决方案。很抱歉,您无法从我的问题中得知这一点。

–user6722
2011-12-24 14:15

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

– svandragt
2014年7月10日在8:26



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

–psusi
2014年7月11日在1:59

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

–大卫·卡希尔(David Cahill)
15年4月13日在17:37



lsblk可用于确定哪个分区是什么

–紫色先生
16年5月9日在9:51



#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-这将删除当前内核不再需要的旧内核的所有剩余依赖项,释放更多的空间。

您可能具有未安装匹配内核版本的头文件,反之亦然-仅在命令中包括所有这些版本。 APT会抱怨一些软件包因为没有安装而无法删除,但这不会造成危害。

如果出现故障...


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


评论


@ user535733通常的情况(至少是我一直遇到的情况)是/ boot上还有一些空间,不足以容纳另一个内核程序包。在这些情况下,上面的方法效果很好。不过,请随意添加相应的dpkg命令。至于清除,不是,不是“强制删除”。它与remove的不同之处在于,它也删除了配置文件。由于/只要内核软件包不安装任何配置文件,删除和清除将对内核软件包执行相同的操作。

–user149408
17年2月3日在23:55

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

–user535733
17年2月4日,0:02

#10 楼

列出所有内核:

dpkg --list 'linux-image*'


显示当前内核:

uname -r


列出所有内核,但当前内核除外:

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


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

除去当前内核以外的所有内核:

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


清除其他内容:

sudo apt-get autoremove


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

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

rm /boot/*-3.13.0-119*; 


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

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

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 }' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge


#11 楼

对我来说,apt-get purgedpkg --remove都失败了。因此,我不得不使用rm -f从/ boot删除了几个较旧的内核映像。

评论


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

–胸骨
2014年8月29日在9:55

我相信它失败了,因为/ boot分区已满。此命令首先尝试将内核升级到最新版本,并且在生成initrd.img时设备上没有剩余空间而崩溃

–vp_arth
15年12月3日在15:50

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

– kgrittn
17年1月5日在13:57

谢谢,这是挽救生命的最终解决方案。

– Jeff Puckett
17年8月17日在3:28

#12 楼


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


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

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

您应该能够用

列出已安装的内核
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


#13 楼

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


我手动删除了生成的旧内核版本,以便释放空间。

您将编辑文本配置文件。作为超级用户,因此将以下内容粘贴到终端:

sudo gedit /etc/initramfs-tools/update-initramfs.conf



找到行update_initramfs=yes并将其更改为update_initramfs=no。保存并退出文件,然后运行:

sudo dpkg --configure -a



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

希望重新启动后一切都很好,以后您可以尝试在no中将yes改回update-initramfs.conf

#14 楼

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

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

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

#15 楼

超级有用的实用程序,可以清除您的启动分区

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


使用时,后果自负,但对我有用:

sudo bootnukem


评论


为什么要投票?

–乔纳森
17年2月8日在2:30

#16 楼

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

#17 楼

我在下面编写了一个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  }' | grep -v "$current_kernel" | grep -v "linux-image-generic")
current_old_kernel=$(dpkg --list | grep linux-image | awk -F' ' '{ print  }' | 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  }' | 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  }' | 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  }' | 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  }' | 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


#18 楼

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

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

对我唯一有效的方法是查看当前图像,然后手动sudo rm filename获取最早的图像文件(每个人的名字都为-3.16.0-30)。一旦完成,sudo apt-get autoremove就拥有了完成其工作所需的摆动空间。它确实突出显示了与该版本相关的一些错误,例如:“ depmod:FATAL:无法加载/boot/System.map-3.16.0-30-generic:无此类文件或目录”,但这是可以预期的。 br />
完成后,df返回了/ boot使用的42%的数据,表明它再次正常运行。

评论


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

–muru
17年2月8日在2:02

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

–贾斯汀·凯斯(Justin Case)
17-2-8在18:36



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

–muru
17-2-9在4:56



#19 楼

我编写了这个bash脚本以一次有选择地清除旧内核:



链接中包含所有bash代码和说明。

#20 楼

将此脚本另存为/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

#21 楼

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

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

要遵循的步骤



/>检查Linux系统正在使用的当前安装的内核

uname -r

这应该为您提供系统上当前安装的内核映像的名称。
现在开始删除多余的文件,但系统上已安装了一个特定文件。

apt-get remove linux-image-XXXXX


还删除了头文件

apt-get remove linux-headers-XXXXX


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

cd /boot


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

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

rm linux-image-XXXXX


删除多余的文件在那里手动清理启动文件

rm linux-image-extra-XXXXXX


更新grub

apt-get -f install


>最后更新您的系统软件包

apt-get autoremove



#22 楼

linux-purge实用程序用于以下目的:
从Launchpad安装实用程序;您可以在此处找到说明。
运行:
sudo linux-purge --clear-boot --keep=1 --optimize

如果不行,请运行
sudo linux-purge --fix

,然后重试。
如果找到该软件中的错误,您可以在启动板中报告该错误。有关更多详细信息,请参见man linux-purge

#23 楼

如果无法删除更多未使用的文件,并且同一设备上还有其他分区具有/或可用空间,则可以按part / gparted调整/ boot分区的大小。 (它也包含在安装媒体中。)警告:调整分区大小是危险的操作,请在执行操作之前将重要数据保存在其他媒体上!

评论


小型/ boot分区的大多数用户在安装时都选择了“全盘加密”,这需要LVM。这种解决方案似乎会给他们带来更多的问题。

–user535733
17年2月2日在14:40