每次安装新的Linux内核时,它都会留在grub_config中,从而使引导菜单每次都更长。

我知道我可以手动搜索已安装的软件包并将其删除。

Ubuntu是否提供任何更简便的方法来清理它们或阻止它们显示在引导列表中?

评论

有一个称为purge-old-kernels的ubuntu命令可以完成这项工作。请参阅我的答案以获取更多信息。

sudo apt-get autoremove应该可以在Ubuntu 14.04+上完成操作

旧内核的积累是一个bug,正在进行修复:bugs.launchpad.net/bugs/1357093。修复程序发布后,默认情况下,较旧的内核将自动删除。

@hobs如果尚未自动安装内核,而是通过软件更新程序安装的,则该命令不会在Ubuntu Studio 14.04中为我解决问题。

我继续返回此页面... @hobs的评论仅在您的内核已自动安装时才起作用-但是您使sudo apt-get autoremove-通过遵循https:// help上的apt-mark建议清除答案.ubuntu.com / community / RemoveOldKernels

#1 楼

16.04和更高版本的Ubuntu

sudo apt autoremove


此命令删除为解决依赖关系而自动安装的软件包,但现在不再依赖它们。这包括linux-headers-*linux-image-*的旧版本。 (此过程也很聪明,留下了一个备用的内核版本作为后备!)

11.10和更高版本的Ubuntu

GRUB2及其所有内核的显示

在Ubuntu中安装的最新版本的Grub2会自动显示最新的内核,并隐藏您可能已安装的旧内核。



如果您看不到grub-然后请记住在启动时按Shift。

如您所见,只会显示最新的内核。

如果选择显示的选项(按Enter键),所有旧内核都将可见并可以从中启动。


如何永久删除旧内核

首次启动最新的可用内核。

有多种删除旧内核的方法。就个人而言,我不会接触计算机管理员,因为它被认为会破坏您计算机的建议。


替代方法是Synaptic(sudo apt install synaptic

搜索linux-image,右键单击一个内核并选择“完全删除”,最后单击“应用”按钮删除该内核。



重复搜索但这次是linux-header-您可以删除先前选择的内核映像的关联头。内核-甚至通过此工具删除所有内核,使您无法启动Ubuntu !。

请记住检查您使用的是哪种内核:

uname -r


结果将类似于:



记住结果和编号-确保不要删除相应的图像或标题。

推荐

我的建议是保留至少两个或最好三个内核,包括最新的。建议的原因是,至少有一个/两个其他内核可用于启动,无论出于何种原因而无法启动最新的内核或引入了诸如无线中断之类的退化功能。

评论


使用synaptic删除旧的“ linux-image *”软件包,也与10.04兼容。 (我提到它是因为标题表明它可能仅适用于11.10及更高版本)

– mivk
2012年5月17日下午16:35

必须在apt-get行的末尾使用-y开关,否则apt-get只是要求确认,并且由于输入是管道,因此它只会中止。所以它应该以:结尾xargs sudo apt-get清除-y

–乔什
13年8月26日在16:30

删除大约20个旧的linux-image和linux-headers版本可以释放我机器上的4.5GB空间。

–毛泽东
2014年1月7日19:30

此方法效果很好,但是删除每个内核都会过度重新生成grub.cfg,这需要时间。有什么方法可以禁用此功能以批量删除,然后重新生成一次吗?

–spacediver
2014年3月25日23:47

我第二个问题来自@spacediver-当您有38个不需要的内核时,这是一个疯狂的过程,因为在卸载每个内核时,它会遍历所有其余的内核,同时生成一个新的grub.cfg。那就是我们所说的N ^ 2操作-它处理内核大约(38 ^ 2/2)= 722次,并且非常慢。当然,Ubuntu可以提供更好的东西。

–nealmcb
2014年11月2日,3:12



#2 楼

首先,重新启动系统以确保它使用的是最新内核。然后打开终端并检查您当前的内核:

uname -r 


请勿删除该内核!

接下来,键入以下命令以查看/列出系统上所有已安装的内核。

dpkg --list 'linux-image-*'


查找所有低于当前内核的内核。当您知道要删除的内核时,请继续以下操作将其删除。运行以下命令以删除您选择的内核。

sudo apt-get purge linux-image-x.x.x-x-generic 


最后,运行以下命令以更新grub2

sudo update-grub2 


重新启动系统。

评论


在10.04和12.04中执行此操作时,我发现update-grub在清除过程中自动运行。

–aidan
13年1月2日,0:45

可以使用bash的大括号扩展名,例如sudo apt-get purge linux-image-3.2.0-3 {0..5} -generic(删除30,31,..,35)

– ajo
13年3月19日在9:04

之后无需重新启动系统。实际上,您应该在执行这些步骤之前重新引导系统,以确保您使用的是可能刚刚下载并安装的最新内核版本(在此之前您进行了apt-get更新和&& apt-get升级,对吗?)

–Ricket
2014年2月28日在2:27



您可能还希望卸载UEFI系统中可能安装的linux-signed-image软件包:sudo apt-get purge linux-signed-image-3.11.0- {12,14,24} -generic,它将删除12, 14和24

– devius
2014年7月1日在10:53

@jarno我不知道我是否正在使用签名内核,但是uname -r在我的系统上没有任何签名字符串。我似乎确实安装了签名映像,并且该ls命令的输出为:/boot/vmlinuz-3.19.0-16-generic.efi.signed。

– devius
15年5月13日在14:38

#3 楼

我的一句话是删除旧内核(这也释放了磁盘空间)。

下一个)



|列出所有已安装的软件包

dpkg --list查找已安装的linux映像

grep linux-image仅输出第二列(包名称)

awk '{ print }'按版本号对项目进行排序

sort -V在当前内核之前打印行

sed -n '/'`uname -r`'/q;p'清除找到的内核

展开xargs sudo apt-get -y purge调用:



sed告诉-n安静

sed输出当前安装的当前内核版本-我们将其包含在反引号中,以便将输出包含在命令中(您也可能会将此视为`uname -r`

$(uname -r)说,当您匹配“某物”时停止(在此情况下,输出的是/something/q) -uname -r包围正则表达式

/是print
p是命令分隔符,因此;说当您匹配某些内容时退出,否则print

一起, /something/q;p会打印行,直到与当前内核名称匹配为止。

如果您像我一样偏执,可以做最后一部分sed -n '/'`uname -r`'/q;p'以便打印清除旧内核的命令,那么在运行它之前,您可以检查是否未包含任何意外内容。


修改后的版本可以删除标头:注意:xargs echo sudo apt-get -y purge调用已修改。 sed"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")"中仅提取版本(例如“ 3.2.0-44”),而不提取“ -generic”或类似版本。


多合一版本可删除图像和标题(组合上面的两个版本):

dpkg --list | grep linux-image | awk '{ print  }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge


评论


请注意,将当前内核版本匹配为正则表达式是有点危险的:点与任何字符匹配,而3.1.2-23与3.1.2-2匹配(或者反之亦然)。另请参阅我的答案。

– jarno
15年5月16日在1:22

这是一个经过调整的多合一版本:sudo apt-get purge $(用于“ linux-image”“ linux-headers”中的标记;执行dpkg-query -W -f'$ {Package} \ n'“ $ tag -[0-9] *。[0-9] *。[0-9] *“ |排序-V | awk'index($ 0,c){exit} //'c = $(uname -r | cut -d- -f1,2);完成)另请参阅我的回答。

– jarno
15年5月18日在12:38

@jarno帮了我很大的忙。

– Clain Dsilva
2015年9月4日在4:14

由于未满足的依赖性,我需要将其与dkpg -Pinstead一起使用。这是完整版本:dpkg --list | grep'linux-headers'| awk'{print $ 2}'|排序-V | sed -n'/'“ $(uname -r | sed” s / \([0-9 .-] * \)-\([^ 0-9] \ + \)/ \ 1 /“)”'' / q; p'| xargs sudo dpkg -P

–塞巴斯蒂安·萨斯特(Sebastian Sastre)
16年6月22日在21:55



请勿这样做! “那个班轮看上去有点危险,但是肯定有220名支持者不会错!”我自言自语,一味地复制粘贴。重新启动,直接进入GRUB。该命令擦除了我所有的内核,包括我正在使用的内核。也许我正在运行实时内核,甚至不记得了。目前正在我家四处寻找USB记忆棒,以在:(

–安德烈亚斯·詹森(Andreas Jansson)
17年8月26日在21:04

#4 楼

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic


Ubuntu 15.10及以下版本:

我发现这是最简单,最快的方法。它保留了最新的内核以及另外两个内核:

sudo apt-get install bikeshed
sudo purge-old-kernels


要更改保留的其他内核数: />

评论


该命令是一个shell脚本,您可以在其中找到哪个purge-old-kernels。

– jarno
2015年5月16日13:46

很高兴他们在16.04中使此操作变得容易得多!希望这个答案能继续增加...

– Tobias J
17 Mar 30 '17 at 13:53

在Ubuntu 16.04上,我使用了不带Bikeshed(还没有永久住所的随机有用工具)软件包或任何特定软件包的旧内核,避免使用apt-get -y选项,就像闭着眼睛希望所有事情都会发生一样好的。同样在这里,它是autoremove决定保留多少个旧内核的方式。

–巴勃罗·比安奇(Pablo Bianchi)
17年5月21日在15:06



在16.04中,byobu软件包提供了purge-old-kernels(提示:apt-file search purge-old-kernels)。同意apt-get -y,我将其删除。

– bmaupin
17年5月21日在18:34

@Dan因为我不使用非LTS版本,所以我不确定它何时启动。但是我可以肯定地说sudo apt-get autoremove不会在14.04中删除内核。如果您知道答案是什么,请随时用特定的版本更新答案!

– bmaupin
17年9月12日在13:41

#5 楼

从Grub 2删除条目
应通过编辑或删除/etc/grub.d文件夹中的文件来删除条目。 /boot/grub/grub.cfg文件是只读文件,通常不需要编辑。
内核太多?


如果不确定内核,则可以当前正在使用的终端类型为uname -r。


通过APT删除的内核(Synaptic,“ apt-get remove”等)将自动更新grub.cfg,并且没有用户需要采取措施。


卸载内核(和菜单项)的一个很好的工具是Ubuntu-Tweak,它是一种安全且易于使用的GUI应用程序。


安装ubuntu tweak


Ubuntu-Tweak将在“应用程序”>“系统工具”下提供。


删除旧的内核条目


在左侧选择“ Package Cleaner”,在右侧面板中选择“ Clean Kernel”。


按右下角的“解锁”按钮,输入密码。


从显示的列表中选择要删除的内核映像和标题。未列出正在使用的内核。


按右下角的“清理”按钮删除所选的内核映像和头文件。


从Grub菜单中删除操作系统


以root身份运行“ update-grub”后,从计算机中删除的其他操作系统也将从菜单中删除。


菜单项通过脚本放置在Grub2菜单上。如果您不想在菜单中输入其他操作系统,请禁用/etc/grub.d/30_osprober


运行此命令以停止脚本运行sudo chmod -x /etc/grub.d/30_os-prober
/

/ etc / default / grub中的DISABLE_30_OS-PROBER ='true'


从Grub菜单sudo chmod -x /etc/grub.d/20_memtest86+中删除Memtest86 +

运行update-grub命令以允许将更改并入grub.cfg


注:
内核更新后,将在GRUB菜单中添加一个新条目。您可以删除较旧的条目。但是,有经验的用户会建议您至少保留一个备用条目,以防升级出现问题并且您需要启动旧版本的内核以进行故障排除。
删除内核条目(在10.04之前)的替代方法
对于GRUB而不是GRUB2

startupmanager

您可以在System >> Administration >>
下找到它。在第二张屏幕截图中,您可以选择显示多少个内核?我通常将其设置为1,但是当我进行内核升级时,我总是将其更改为2,然后再重新启动,因此如果新内核出现硬件问题,则可以选择较旧的内核。一旦知道新内核运行良好,就将其更改回1。

评论


实际上,在Ubuntu 10.04上,startupmanager dint给了我一个这样的窗口,相反,它只是给了一个带有两个选项卡的窗口-> Boot options和Advanced ..,而在高级情况下,dint可以选择限制内核数量。因此,请更新Ubuntu 10.04的答案。(这就是为什么我对此投票否定..)

–森
2010-12-13在5:12



任何想法如何在未安装GUI(服务器)的计算机上定义“要保留的内核数量”?

–西尔维努尔格
13年3月28日在9:24

startupmanager已过时。请参阅grup-customizer

– muhasturk
2014年9月6日在2:23



#6 楼

纯粹是命令行,这将除去当前和第二高的电流(通过下面的head命令中的“ -2”):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" q4312078q " linux-headers-" q4312078q}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge


评论


从那里开始一线:dpkg -l linux- * | awk'/ ^ ii / {print $ 2}'| grep -v -e`uname -r |切-f1,2 -d“-”`| grep -e [0-9] | xargs sudo apt-get -y清除

–德米特里·韦克霍图洛夫(Dmitry Verkhoturov)
2012年8月5日19:31



@DmitryPaskal,您应该将此添加为新答案。

–saji89
13年3月12日在10:26

@DmitryPaskal和往常一样,不要在不理解它们的情况下复制粘贴它们。在我的机器上,此一线还匹配linux-libc-dev:amd64,不应删除它。

–Jamesadney
13年3月12日在20:19

@Kees Cook,awk参数不应该只用单引号引起来吗?如果您打算在管道的行首加上“ linux-image-”,这似乎只有在您使用awk'{print“ linux-image-” $ 0}'时才有效。

–马克
2013年6月12日17:33

这对我不起作用,它包括我自定义安装的内核(Ubuntu 14.04和3.17)

– Alex R
2015年2月5日,9:39

#7 楼

更新:purge-old-kernels现在已过时。

即使在棘手的情况下,我也编写了一个脚本来清除内核。它被称为linux-purge,您可以在这里找到它。使用此脚本。

这里还有一个关于删除旧内核的Ubuntu文档页面。

评论


看起来清除旧内核的版本不符合Bikeshed的精确版本(1.22)。是否有合理/安全的方法来获取更新的精确车棚?还是只安装脚本会更简单/更安全?尽管依赖项列表很长,但我还是希望使用仓库。

– drevicko
2015年6月8日在2:32

@drevicko看到这里。

– jarno
15年6月8日在8:27

@drevicko,可以,请确定-lsbin bikeshed

– jarno
2015年6月9日在4:57



@drevicko,请参阅另一个问题

– jarno
2015年6月9日下午4:59

@ChrisW是的。我只是对该脚本做了一点改进,所以最好使用最新版本。

– jarno
19-09-5在14:28

#8 楼

您可以按照Ubuntu Wiki上“自动安全更新”中的“使用无人参与的升级包”部分执行此操作。

您需要在/etc/apt/apt.conf中更改以下行。 d / 50unattended-upgrades文件;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";




Unattended-Upgrade::Remove-Unused-Dependencies "true";


自动删除旧软件包,包括内核。

也删除或注释文件/etc/apt/apt.conf的“ NeverAutoRemove”部分中的行

"^linux-image.*"; 


。 d / 01autoremove。

评论


我这样做了,但它仍在收集3个以上的旧内核,它们消耗了100兆的MB。因此,我将apt-get autoremove添加到了实际执行升级的日常cron作业中,因为它并不总是通过内置的update-manager进行。

– Marcos
2012年8月24日在12:01

我认为这在Trusty中仅适用于已自动安装的内核。

– jarno
16年2月10日在10:52

这对于防止在自动升级程序包时阻止旧内核的建立非常有用。无人值守的升级。但是,如果不重新启动,可能会发现当前正在运行的内核的软件包已被卸载!这可能导致以下问题:插入的新设备可能无法工作,因为无法热加载用于它们的模块,因为它们不再位于磁盘上。 (对此的快速修复方法是再次安装内核软件包,然后拔出并重新插入设备。)

– joeytwiddle
17年3月18日在17:32



我创建了针对上述问题的自动化解决方案。如果您认为这是一个好方法,请随时将其添加到Qwerty的答案中。

– joeytwiddle
17年5月21日在6:04

#9 楼

Ubuntu随附的最快/更简单的方法(至少自12.04起适用)是apt-get。如果要删除所有未使用的较旧的内核版本,请执行以下操作(除了上一个未使用的内核版本。这是为了确保如果当前的内核版本以某种方式失败,则有一种解决方法)回到先前的状态)。请执行以下操作:

sudo apt-get autoclean


这将消除您可能拥有的所有旧文件(包括内核版本)。请注意,如果您有许多旧版本,则需要一段时间,因为它必须确保删除内核版本没有问题。对我来说,删除最后12个内核版本大约需要2分钟。您还可以执行以下操作:

sudo apt-get clean


这将消除在apt的缓存文件夹中下载和存储的所有内容。最后,您有:

sudo apt-get autoremove


,它将检查是否有未使用的软件包,并在必要时将其删除。对于那些不再需要安装任何应用程序的库和依赖程序包,这非常有用。

评论


我认为这在新版本中已更改,因为在14.04中,这仅清除程序包缓存,而不会影响已安装的程序包或grub。

– jarno
15年5月16日在12:35

我可以确认sudo apt-get autoremove确实在14.04中删除了旧的(超过一个版本)内核。在升级内核之前和之后,您可能必须运行它。当我在升级前运行时,它仅删除了旧内核的通用版本。然后,在升级内核之后,它也删除了旧内核的低延迟版本。

–tekNorah
15年5月16日在20:24



我的意思是sudo apt-get autoclean命令。 @tekNorah我安装了几个旧的内核,然后在Ubuntu Studio 14.04中运行sudo apt-get autoremove。它没有删除任何内核。我只安装了低延迟内核。为什么同时安装了-generic和-lowlatency内核?

– jarno
15年5月18日在11:05

是的,这对我来说效果很好,可以正确清理所有旧内核,并且不依赖疯狂的单行脚本!推荐,希望我可以多次投票!

–杰夫·阿特伍德
2015年8月8日在5:59



@JeffAtwood很好,它可能会删除更多安全的内核。查看错误报告

– jarno
16年1月30日在7:11

#10 楼

10.04 GUI方法
Computer Janitor可以清理旧内核,并且我相信它默认安装在Ubuntu中(但不是Kubuntu)。
GRUB 1,如果使用的话,请在/boot/grub/menu.lst中指定一个选项它最多应显示多少个内核。据我所知,GRUB 2没有。

评论


不应使用计算机管理员-它有问题,现在已被默认为natty / oneiric / precise中的默认应用程序。

–fossfreedom♦
2012年2月13日在16:04

而是按照另一个答案(自己的PPA)中的说明安装“ Ubuntu Tweak”,它具有自己的“计算机管理员”(不要与在较早的ubuntu版本中临时可用的“计算机管理员”混淆)

–迈克尔
13年2月4日,2:10

#11 楼

要弄清楚安装了哪些内核和头文件,请使用

dpkg -l | grep linux-image

dpkg -l | grep linux-headers


,然后可以将它们一个或一个地删除,只需确保保持最新状态即可。

还有一些方便的命令和脚本可以自动执行删除操作。

http://ubuntuforums.org/showthread.php?t=1658648

以下声明可以删除所有未使用的内核和头文件:

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


(使用apt-get -y可以毫无问题地删除)

在运行时会发生什么18.04.1:

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

\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic


评论


您在论坛中找到的脚本有问题。它可能不会删除某些所需的头文件包(如果您碰巧使用了一些旧的-pae内核),另一方面,它可能会删除您想要保留的某些文件包。

– jarno
2015年4月17日在23:36

感谢您的评论。该脚本可能并不完美,但是,我已经使用了多年,主要在12.04和14.04、32和64位上使用,并且没有任何问题。 ...是的,已安装linux-libc-dev。

–无论如何
2015年4月18日在3:59



我猜想linux-libc-dev的版本号与当前内核的版本号匹配。此处dpkg -l linux-libc-dev | sed'/ ^ ii /!d; s / ^ [^] * [^] * \([^] * \)。* / \ 1 /; / [0-9] /!d'打印linux-libc- dev:amd64

– jarno
15年4月18日在9:49

一种执行原始脚本应该达到的目的的方法是:sudo apt-get purge $(dpkg -l'linux- *'| tail -n +6 | awk -vc =“ $(uname -r | cut- d- -f1,2)“'match($ 2,” [0-9] + \\。[0-9] + \\。[0-9] +-[^-] +“)&& substr($ 2 ,RSTART,RLENGTH)!= c {print $ 2}')或使用dpkg-query的更简单方法:sudo apt-get purge $(dpkg-query -W'linux- *'| awk -vc =“ $(uname- r | cut -d- -f1,2)“'match($ 1,” [0-9] + \\。[0-9] + \\。[0-9] +-[^-] +“) && substr($ 1,RSTART,RLENGTH)!= c {print $ 1}')

– jarno
15年5月16日在11:50

首先,请尝试不带-y标志并进行清除。

–danger89
18-4-24在20:44



#12 楼

为了删除较旧的Linux映像内核,请先在要保留的内核中启动。

您还可以使用命令uname -r检查内核版本,以免错误地删除错误的版本。

现在转到突触软件包管理器并搜索linux-image和删除较旧的版本,但upper命令显示的版本除外。通常,我更喜欢使用最新的。

现在,当您重新启动时,您会看到一个更干净的grub菜单。

评论


这可能是最没有安装计算机管理员的用户的最基本方法。

–泡沫
2010-09-17 21:34

从Ubuntu 11.04开始,grub菜单默认情况下仅显示当前内核,而较早的内核则隐藏在“ Previous kernels”菜单中。此方法仍然可以清除较旧的方法。

–安迪
2011年5月16日16:03

#13 楼

您可以安装ubuntu-tweak,然后转到“应用程序”->“系统工具”->“ ubuntu tweak”,然后单击

单击程序包清理程序并清理内核。它不会显示当前使用的内核,因此您将永远是安全的。

#14 楼

我个人喜欢使用Synaptic。这使我对正在发生的事情感到更加安全。我使用过的唯一可以删除旧内核的应用程序是Ubuntu Tweak。

如何删除不使用的内核:


打开UbuntuTweak
在左侧窗格的“应用程序”下单击“ Package Cleaner”。
在“清理视图”的右侧,按“清理内核”
选择所有内核-我认为未列出使用中的那个,以防万一请检查在终端中运行uname -a


评论


在Synaptic中,您可以过滤“组件”->“内核和模块”,其中包括所有内核。并按第一列排序:“ S”(状态),这样您就可以将所有已安装的内核置顶。实际上,建议使用update-grub。

–danger89
18-4-24在20:48



#15 楼

您可以使用Synaptic卸载旧内核(linux-image-...软件包),这将从引导菜单中将其删除。注意不要删除正在运行的内核(可以使用uname -r来检查其版本)。 >
或者,您可以手动编辑/删除条目(gksu gedit /boot/grub/grub.cfg),但是当您更新到较新的内核时,它们会重新生成。
如果您正在考虑删除recovery mode选项-不要。如果您遇到破坏启动的问题,它们可以派上用场。


请参阅此页面。

评论


现在,每次安装新内核时,Grub2都会构建它的grub条目。使用update-grub将重写所有这些内核。

– Marco Ceppi♦
2010-12-12 18:47

#16 楼

这是一个纯命令行解决方案。

首先生成所有已安装内核版本的列表,但当前正在运行的内核除外:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))


最后两个除外的所有已安装内核版本的列表:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)


检查该列表。确保要保留的内核版本不在列表中。使用命令uname -r查看当前运行的内核的版本。

如果对结果满意,可以使用apt-get删除软件包。

首先进行空运行(以第一个发电机为例):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))


然后真实运行:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))


如果想要使过程自动化,然后添加--yes参数:

sudo apt-get --yes purge $(
  ...)


评论


@jarno感谢您为合并和优化命令行所做的努力。我删除了命令行,因为我更喜欢可读性和简单性。我特意为命令量身定制了易读性和简单性。至少对我的大脑来说是可读性和简单性。请张贴您的命令行作为评论或您自己的答案。

– Lesmana
15年5月16日在15:59

这结合了两个目标:保留最后两个内核,并使内核比当前的sudo apt-get清除更新-$(ls -1U / boot / vmlinuz * | cut -d- -f2,3 | sort -uV | head- n -2 | awk -vc = $(uname -r | cut -d- -f1,2)'($ 0 == c){exit} //'| sed -r -e's / \ ./ \\ ./g'-e's /.*/-&($ |-)/')。由于apt-getcan可处理正则表达式,因此无需dpkg-query。请注意我如何转义点,并在正则表达式中添加前缀和后缀。在我自己的答案中使用脚本,您还可以保留一些比当前内核更旧的内核。

– jarno
15年5月17日在10:39

#17 楼

该答案的优点是无需安装第三方应用程序即可使用本机Ubuntu Bash。不使用aptdpkg的自定义内核的用户可以更改此bash脚本以满足他们的需求。
此答案基于(如何一次有选择地清除所有旧内核)。

基于Zenity的解决方案

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



如标题所示,启动时使用的当前内核无法删除,也不包含在列表中。报告的大小是将在/boot目录中保存的大小。由于内核二进制文件也位于其他区域,因此可以节省更多磁盘空间。 2017年7月27日注意:现在还包括目录/usr/src/*kernel_version*/lib/modules/*kernel_version*。在我的系统上,每次使用此引导程序启动内核时,都会“触及”日期(您如何查找特定内核版本的最后启动时间?)cron reboot脚本。但是,在您的系统上,日期将是内核发布日期,而不是上次引导它的日期。


stat使您有机会中止

提供了最后的机会来查看将清除的所有内容并查看将要恢复的总磁盘空间(有些误导):

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] 


代码
< br将此代码复制到apt-get purge中名为rm-kernels的可执行文件中:



 /usr/local/bin 


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

 #!/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 }')

    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 }')
        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 }')
    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
 


要使文件可执行,请使用:

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



服务器版本

sudo chmod +x /usr/local/bin/rm-kernels 是用于一次有选择地删除所有内核的服务器版本。代替GUI(图形)对话框,而是使用基于文本的对话框来选择要清除的内核。



在运行脚本之前,您需要安装对话框功能使用:

rm-kernels-server


默认的Ubuntu桌面安装中有对话框,但Ubuntu Server中没有。

示例屏幕




sudo apt install dialog bash代码

 rm-kernels-server 


注意:在对#!/bin/bash # NAME: rm-kernels-server # PATH: /usr/local/bin # DESC: Provide dialog checklist of kernels to remove # Non-GUI, text based interface for server distro's. # 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 echo "root access required. Use: sudo rm-kernels-server" exit 99 fi # Must have the dialog package. On Servers, not installed by default command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed. Aborting."; exit 99; } OLDIFS="$IFS" IFS="|" item_list=() # Deviate from rm-kernels here. current_version=$(uname -r) i=0 for f in /boot/vmlinuz* do if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version [[ $f =~ vmlinuz-(.*) ]] ((i++)) # Item List 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 }') 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 }') 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 }') 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 item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off) done cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \ --title "Use space bar to toggle kernel(s) to remove" \ --column-separator "!" \ --separate-output \ --ascii-lines \ --checklist " Kernel Version --------- Modified Date Size" 20 60 15) selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty) IFS=$OLDIFS if [ $? -ne 0 ] ; then echo cancel selected exit 1 fi i=0 choices=() for select in $selections ; do ((i++)) j=$(( 1 + ($select - 1) * 3 )) choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!") done 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 的调用中,传递了指令dialog,以将画图扩展字符集(--ascii-lines不喜欢)替换为绘图框的“ + ----- +”。如果您不喜欢这种外观,则可以根本不使用ssh指令。


2017年7月28日更新

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

默认值是估计linux-header的文件大小为125 MB,linux-image的文件大小为220 MB,因为rm-kernels-server可能会非常缓慢除非文件在缓存中。要使用du获得实际大小,请将任何参数传递给脚本。

所有内核大小的总和(不包括无法删除的当前运行版本)现在显示在标题栏中。 >
该对话框用于显示每个内核的上次访问日期。在备份或类似操作期间,此日期可能会被所有内核大量覆盖。现在,对话框将显示修改日期。

#18 楼

要摆脱几乎所有过时的软件包,不再存在于任何软件包列表中的软件包以及过时的内核,一种简单的方法是执行以下操作之一:

dpkg --purge $(aptitude search ?obsolete)
,这会遗漏其他软件包仍然推荐的软件包,并且-R /-without-recommends参数不能解决此问题。

使用'o'切换排序模式后的dselect将显示所有过时的程序包,包括那些不熟练的程序,但有些人不喜欢使用它。

评论


给定的命令不会清除旧内核,也不会影响我的经验中的grub菜单。

– jarno
2015年5月16日12:39

#19 楼

接受的使用sed永久删除较旧内核的答案存在一些缺陷,如果有人在升级内核后仍未重新引导计算机,则该命令也会删除较新的内核。

这是一个替代解决方案,将考虑所有仅删除实际较旧内核的情况:

 #!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done
 


如果您有更新的版本比当前版本要多,这将给您警告,请先重新启动计算机。还要注意,保留旧内核是有充分的理由的,这是一个很好的理由,如果您以某种方式弄乱了当前内核,使系统不稳定,那么您应该能够启动到任何旧内核中。

评论


这将不会删除低延迟内核或具有其他非常规内核的内核。

– jarno
2015年5月10日17:11



我想您会参考此sed解决方案。

– jarno
2015年5月16日14:39

@jarno:用grep -Eo“ ^ linux-(image | headers | tools)-[^-]替换grep -Po” ^ linux-image-[^-] +-[^-] +-generic \ b“ ] +-[^-] +(| -generic)\ s“ | sed -e“ s / \ s // g”和grep -Po“。*(?=-[az] * $)”与grep -Eo“ ^ [0-9] + \。[0-9] + \。[0-9] +-[0-9] +“和grep -Po” [0-9]。*(?=-[az] *)“与grep -Eo” [0-9] + \ 。[0-9] + \。[0-9] +-[0-9] +“?

– Sadi
2015年11月15日在21:23

@ Sadi,wel,l也不会找到低延迟内核。

– jarno
15年11月16日在13:41

谢谢。其他方法对我不起作用。你的工作了。

– Philippe Delteil
17/12/22在13:10

#20 楼

ailurus具有删除旧内核以及未使用配置的功能。我个人从突触中手动删除了它。您可以从getdeb以及ppa安装ailurus

评论


“ Ailurus是用于备份已安装软件的列表的工具。...过去,Ailurus具有许多功能。现在,它仅具有一个功能。因为我认为一个真正有用的功能要比数十个不太有用的功能要好。”

– jarno
15年5月18日在10:38

#21 楼

我有一个不需要为此花哨的字符串解析的脚本。

除去当前的头文件和图像以释放空间
sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+


#22 楼

您可以使用ukuu(全部为GUI)来更新和删除旧内核。

只记得保留最后的2个,显然是“运行中”的内核。

您还可以将ukuu设置为仅显示主版本,甚至RC内核,隐藏点发布。



您可以在Synaptic中找到ukuu,或者在这里找到说明:

OMG!Ubuntu ukuu安装说明

#23 楼

根据David Kemp先前的回答,以下脚本将清除除最后2个版本以外的所有标头和图像。 >

(使用#!/bin/sh # This script assumes that the installed linux-image and linux-headers packages # share the same versions (i.e. if a linux-image version number is installed, # the corresponding linux-headers package will also be installed, and vice # versa.) SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*//' | uniq | sed -n 2p) # get a list of package names matching the argument passed to the function, and # return only those package names which should be removed get_pkgs_to_remove_matching () { if [ -n "$SECONDTOLASTVER" ]; then echo $(dpkg --list | grep | awk '{ print }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p') fi } echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge 可以毫无问题地删除)

评论


任何理由都被否决了吗?它对某人无效吗?复制/粘贴时,请确保粘贴时没有换行。我没有问题的工作。

–马克
2014年1月24日20:56

我的机器上最新的内核版本是3.13.0-43-lowlatency。该脚本将清除linux-headers-3.13.0-43-lowlatency。

– jarno
15年1月2日在20:40

@jarno您如何确定的?要尝试不进行任何实际操作,请在apt-get命令中添加“ -s”标志(或完全删除| xargs sudo apt-get -y purge)。如果它打印出3.13.0-43-lowlatency,则可能您的系统版本比系统上安装的版本高。

–马克
2015年1月4日在6:05



我尝试模拟。不,但是我删除了一些较早的内核版本,但没有清除,并且清除了相应的头文件包。

– jarno
15年1月4日在20:59

无论如何,我一直在根据Sankalp的答案构思脚本。

– jarno
2015年1月4日在21:13

#24 楼

这是我所做工作的粗略概述,请小心,因为我不是Linux专家,请确保您知道自己在做什么,并且已备份了要修改的所有文件。

gedit /boot/grub/grub.cfg


然后找到您想要保留的条目,我们将突出显示并复制它们

cd /etc/grub.d
ls


您将看到文件列表,例如10_linux和30_os-prober

sudo chmod -x 10_linux


这将停止自动将所有linux条目添加到grub引导菜单的形式。

gksudo gedit 40_custom


打开自定义启动菜单文件,然后返回grub.cfg(应该在gedit中仍然打开),然后复制要保留的条目。 ..如

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}


将它们粘贴到40_custom中,然后将其保存。

sudo chmod 755 40_custom


制作它可执行文件,然后我们最后更新grub,它将更改grub.cfg文件:

sudo update-grub


现在,请注意,如果您更新内核或操作系统,则引导菜单可能会不更新...您必须手动执行。但是执行此过程将使您更加自定义引导菜单,例如删除内核版本并仅添加ubuntu名称...即Ubuntu Lucid 10.04等...

希望有人发现这很有帮助,因为我花了一段时间才弄清楚...在任何地方都没有看到此解决方案...

评论


这个答案似乎有些矫kill过正。最好只删除旧内核。

–斯科特遣散费
2012年1月8日23:32



我读过,在恢复情况下,额外的内核可能很有用。同样,这是编辑启动项文本的简单方法。因此,与其说“ Ubuntu,Linux内核xxxx-yy --text1 -text2 -t3 -t4 --t5等”(其中--text条目仅表示一些我不理解的选项/参数),不如说将其更改为“ Ubuntu xx.yy”,尽管我有一个无法摆脱的“ {”括号。

–乔
2012年1月9日在22:35



我保留前一个内核,直到确认最新内核正常工作为止。如果有效,它就不会停止工作。因此,在验证了最新的内核(大约一周后)之后,我没有理由保留旧的内核。如果它不起作用,那么我可以使用最新的已知良好的内核。实际上,由于当前内核中的showstopper错误,我当前正在运行旧内核。但这并不会改变我的总体政策。您只需要一个已知的好内核。

–斯科特遣散费
2012年1月10日下午5:14

#25 楼

安装突触包管理器,然后转到过滤器选项卡(我认为过滤器,如果没有全部尝试5个),然后选择“本地”。这将向您显示系统上的孤立软件包,例如内核。卸载它们后,运行update-grub。该命令将更新grub的启动选项列表。

如果失败,可以随时尝试apt-get remove linux-image-version-generic

评论


在Synaptic中,您可以过滤“组件”->“内核和模块”,其中包括所有内核。并按第一列排序:“ S”(状态),这样您就可以将所有已安装的内核置顶。实际上,建议使用update-grub。

–danger89
18-4-24在20:48



#26 楼

要对保留哪些版本有更多控制,请显式选择要删除的版本。例如,如果要删除3.2.0。[49-53]内核版本,请使用简单的for循环:

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done


调整内核版本列表以适合。

#27 楼

试试这个。
以根用户身份运行。

将此脚本另存为,例如./keep-n-kernels.sh

将要保留的最新内核数作为命令行参数。

    
#!/bin/bash

# pass n as a command line argument, and it will find all the installed
# kernels and keep only the n most recent ones => uninstall all older ones

# dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'
# this command gives the list of all packages EXCEPT for the latest kernel.
# source : https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n=

# find the installed kernel versions :
# dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sort -n
# gives version numbers, one in each line
# dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u
# gives only the ones that appear in linux-image

# suffix, e.g. -generic-pae
# the kind of kernel you boot into
suffix=$(uname -r | sed 's:^[0-9]\.[0-9]\.[0-9]\-[0-9]\{2\}::g')

command="apt-get purge "

for version in $(dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u | head -n -${n})
do
    command=${command}"^linux-image-${version}${suffix} "
done

$command


样品使用方法:

# ./keep-n-kernels.sh 4 # launch the apt-get command to remove all but the 4 most recent kernels


如果您想[自己承担风险],则可以在apt-get命令中添加-y(或强制标志)并使其非交互式。

评论


如果您运行./keep-n-kernels.sh 0,它将删除所有内核。我认为后缀= $(uname -r | sed -r's / ^ [0-9。] *(-[0-9。] +)* //')或后缀= $(uname -r | egrep- -only-matching-'-[[:::-] + $')即可。

– jarno
15年1月2日,18:57

但我认为这个主意很好。我一直在改进脚本,也许在我认为它已经准备好了的时候会在这里发布。

– jarno
15年1月4日在21:07

请分享@jarno。很高兴知道这个想法似乎有用。

–桑卡普
15年1月6日在18:41

好的,它是:链接

– jarno
2015年1月8日,14:38

#28 楼

我正在使用KDE桌面,而我发现的最简单的选择是使用kde-config-grub2应用程序,如下所示:https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (我已经安装了用于设置背景图片,默认启动选项等)。在可以选择默认条目的下拉框旁边,有一个“删除旧条目”按钮。单击此按钮将显示所有已安装内核的列表,您可以选择要删除的内核。应用更改时,它将使用dpkg实际上将其从系统以及GRUB菜单中删除。

#29 楼

只是为了发出声音,您还可以以root身份发出

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

,该工作就会完成。

#30 楼

下次,当删除旧内核时,请打开终端并使用以下命令:

sudo apt-get autoremove linux-headers-2.6.38-10-generic


您可以使用Synaptic来获取要删除的内核的确切名称。只需打开Synaptic并搜索“ linux-headers”,然后选择要删除的内核条目即可。相关条目的末尾将带有“ -generic”标记。

要清除整个系统中所有未使用的(遗留的)依赖项,请单独使用以下命令:

sudo apt-get autoremove


评论


依赖项已删除,但/ boot文件夹中仍然有这些文件。

–Patryk
2011-10-10 13:43

我认为您应该使用--purge选项并清除相应的linux-image软件包以及linux-headers软件包。

– jarno
15年5月16日在12:10