如何删除旧的内核版本以清理启动菜单?


701

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

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

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


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

29
sudo apt-get autoremove应该在Ubuntu 14.04+上发挥作用
滚刀

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

1
@hobs如果内核不是通过软件更新程序自动安装的,则该命令不会在Ubuntu Studio 14.04中为我提供帮助。
jarno

1
我继续返回此页面... @hobs的评论仅在您的内核已自动安装的情况下才有效-但是您可以通过遵循https://help.ubuntu.com/community/RemoveOldKernelssudo apt-get autoremove --purge apt-mark
earcam

Answers:


602

16.04和更高版本的Ubuntu

sudo apt autoremove

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

11.10和更高版本的Ubuntu

GRUB2及其所有内核的显示

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

GNU GRUB

如果看不到g头,则请记住Shift在启动时按。

如您所见,仅显示最新内核。

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

GNU GRUB以前的版本

如何永久删除旧内核

首次引导使用最新的可用内核。

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

突触的

另一种是Synapticsudo apt install synaptic

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

突触包管理器

重复搜索,但是这次是linux-header-您可以删除先前选择的内核映像的关联头。

Synaptic不会尝试验证要删除的内容……您可能会无意中删除最新的内核,甚至通过此工具删除所有内核,从而导致无法启动的Ubuntu!。

请记住检查您正在使用的内核类型:

uname -r

结果将类似于:

终端<uname -r>

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

建议

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


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

4
该行-y末尾的开关apt-get是必需的,否则apt-get只是要求确认,并且由于输入是管道,因此它将中止。因此,结尾应为:| xargs sudo apt-get purge -y
乔什(Josh)2013年

37
删除机器上约20个旧版本linux-imagelinux-headers释放4.5GB的空间。
安德鲁·毛

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

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

384

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

uname -r 

不要删除该内核!

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

dpkg --list 'linux-image-*'

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

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

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

sudo update-grub2 

重新启动系统。


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

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

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

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

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

283

我的一线删除旧内核(这也释放了磁盘空间)

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

说明(记住,|使用上一个命令的输出作为下一个命令的输入)

  • dpkg --list 列出所有已安装的软件包
  • grep linux-image 寻找已安装的linux映像
  • awk '{ print $2 }' 只输出第二列(包名称)
  • 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)时停止- /环绕正则表达式
  • p 正在打印
  • ;是命令分隔器,所以/something/q;p当您匹配某项内容时说退出,否则打印

总共sed -n '/'`uname -r`'/q;p'打印行,直到与当前内核名称匹配为止。

如果您像我一样偏执,可以做最后一部分,xargs echo sudo apt-get -y purge以便打印清除旧内核的命令,然后您可以在运行之前检查是否未包含任何意外内容。


修改版本以删除标题:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

注意:sed调用已修改。"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"仅提取版本(例如“ 3.2.0-44”),而不提取“ -generic”或类似版本uname -r


多合一版本,用于删除图像和标题(将以上两个版本组合在一起):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

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

19
这是一个经过调整的多合一版本:sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)另请参阅我的答案
jarno 2015年

1
@jarno帮了我很大的忙...
恭喜

5
由于未满足的依赖关系,我需要改用它dkpg -P。这是完整版:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
塞巴斯蒂安·萨斯特

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

60

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

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

sudo purge-old-kernels --keep 3

1
该命令是一个shell脚本,您可以通过找到该脚本的位置which purge-old-kernels
佳诺2015年

很高兴他们在16.04中使此操作变得更加轻松!希望这个答案不断提高……
Toby J

在Ubuntu 16.04上,我purge-old-kernels没有Bikeshed(还没有永久住所的随机有用工具)软件包或任何特定软件包apt-get -y。同样在这里,它是autoremove决定保留多少个旧内核的方式。
巴勃罗A

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

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

43

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

内核太多?

  • 如果不确定当前使用的内核,请在终端中输入uname -r

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

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

  • 安装ubuntu调整

  • 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菜单中删除Memtest86 +
sudo chmod -x /etc/grub.d/20_memtest86+

  • 运行update-grub命令以允许将更改合并到grub.cfg中

资源

注意: 内核更新后,将在GRUB菜单中添加一个新条目。您可以根据需要删除较旧的条目,但是,大多数有经验的用户会建议您至少保留一个备用条目,以防升级出现问题。需要引导较早的内核版本以进行故障排除。

删除内核条目的另一种方法(低于10.04)

对于GRUB而不是GRUB2

启动经理 安装启动管理器

您可以在System >> Administration >>下找到它。您可以 替代文字
替代文字
在第二个屏幕快照中选择显示多少个内核?我通常将其保持为1,但是当我进行内核升级时,我总是在重新启动之前将其更改为2,因此如果新内核出现硬件问题,则可以选择较旧的内核。知道新内核运行良好后,将其更改回1。


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

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

startupmanager已过时。参见grup-customizer
muhasturk 2014年

39

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

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

9
那里开始的dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
单线

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

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

1
@Kees Cook,awk参数不应该只用单引号引起来吗?如果您打算将“ linux-image-”添加到管道线之前,则仅在使用时才起作用awk '{print "linux-image-" $0}'
2013年

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

35

更新:purge-old-kernels现在不推荐使用

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

如果您只想清除早于当前使用的内核的内核(以及相关的软件包),则在系统未损坏时,可以使用此脚本

还有,我关于删除旧内核贡献了Ubuntu的文档页面在这里


看起来purge-old-kernels不是Bikeshed的精确版本(1.22)。是否有合理/安全的方法来获取更新的精确车棚?还是只安装脚本会更简单/更安全?我宁愿不过,使用回购,尽管依赖的一长串..
drevicko

1
@drevicko看到这里
jarno

1
@drevicko,可以肯定,dlocate -lsbin bikeshed
jarno 2015年

1
@drevicko,
jarno 2015年

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

29

您可以按照使用“无人参与升级”包款自动安全更新在Ubuntu维基文章来执行此。

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

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

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

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

同时删除或注释该行

"^linux-image.*"; 

在文件/etc/apt/apt.conf.d/01autoremove的“ NeverAutoRemove”部分中


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

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

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

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

27

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

sudo apt-get autoclean

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

sudo apt-get clean

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

sudo apt-get autoremove

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


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

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

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

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

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

25

10.04 GUI方法

Computer Janitor可以清理旧的内核,并且我相信它默认安装在Ubuntu(但不是Kubuntu)中。

如果您使用GRUB 1,则可以选择GRUB 1,/boot/grub/menu.lst以指定它最多可以显示多少个内核。据我所知,GRUB 2没有。


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

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

25

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

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]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[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]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[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年

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

我想当时linux-libc-dev的版本号与当前文件的版本号匹配。这里dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'打印linux-libc-dev:amd64
jarno 2015年

为了安全起见,我仍然无法重现您的发现,但是,我通过添加其他过滤器-修改了命令grep -E "(image|headers)"
mikewhatever

1
首先,请尝试不-y使用清除标志。
危险89年

16

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

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

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

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


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

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

14

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

在此处输入图片说明单击包清洁程序,然后清洁内核。它不会显示当前使用的内核,因此您将永远安全。


8

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

如何删除不使用的内核:

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

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

6

您可以linux-image-...使用Synaptic 卸载旧内核(程序包),这将从引导菜单中将其删除。注意不要删除正在运行的内核(可以使用查看其版本uname -r)。

请记住,如果出现问题,拥有一个或两个较旧的版本可以帮助您进行故障排除。

另外,您可以手动编辑/删除条目(gksu gedit /boot/grub/grub.cfg),但是当您更新到较新的内核时,它们将重新生成。如果您正在考虑删除recovery mode选项,那就不要。如果您破坏了阻止启动的功能,它们可以派上用场。


请参阅此页面。


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

4

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

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

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 2015年

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

4

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

基于Zenity的解决方案

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

服务器版本

rm-kernels-server是用于一次选择性删除所有内核的服务器版本。基于GUI的对话框代替了GUI(图形)对话框,而是用于选择要清除的内核。

  • 在运行脚本之前,您需要使用以下命令安装对话框功能

    sudo apt install dialog

对话框位于默认的Ubuntu桌面安装中,而不位于Ubuntu Server中。

样本画面

rm内核服务器1

rm-kernels-server bash代码

#!/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 $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
    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不喜欢)替换为“ + ----- +”。如果您不喜欢这种外观,则可以使用--no-lines完全不带框的指令。


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,请向脚本传递任何参数。

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

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


2

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

dpkg --purge $(aptitude search ?obsolete)

但是,这将丢失其他软件包仍然推荐的软件包,并且-R /-without-recommends参数不能解决此问题。

用'o'切换排序模式后的dselect将显示所有过时的软件包,包括那些能力不合格的软件包,但是有些人不喜欢使用它。


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

2

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年

我想您会参考 sed解决方案。
jarno 2015年

@jarno:grep -Po "^linux-image-[^-]+-[^-]+-generic\b"grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"grep -Po ".*(?=-[a-z]*$)"grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"grep -Po "[0-9].*(?=-[a-z]*)"用替换怎么样grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"
萨迪

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

1
谢谢。其他方法对我不起作用。你的工作了。
菲利普·德尔泰

1

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


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

1

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

删除标题和图像(当前图像除外)以释放空间

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)+

1

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

只要记住保留最后安装的2个,显然是“运行中”的内核即可。

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

u

您可以在Synaptic中找到ukuu,或在此处找到说明:

OMG!Ubuntu ukuu安装说明


1

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

#!/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 $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | 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 $1 | awk '{ print $2 }' | 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

(用于apt-get -y毫无疑问地删除)


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

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

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

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

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

0

这是我所做工作的粗略概述,请小心,因为我不是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等。

希望有人觉得这有帮助,因为我花了一段时间才弄清楚...在任何地方都看不到这个解决方案...


3
这个答案似乎太过分了。最好只删除旧内核。
Scott Severance,2012年

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

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

0

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

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


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

0

要对保留哪些版本有更多控制,请显式选择要删除的版本。例如,如果要删除内核版本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

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


0

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

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

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

    
#!/ bin / bash

#将n作为命令行参数传递,它将找到所有已安装的
#内核,仅保留n个最新内核=>卸载所有较旧的内核

#dpkg -l'linux- *'| sed'/ ^ ii /!d; /'“ $(uname -r | sed” s /\(.*\)-\([^ 0-9] \ + \)/ \ 1 /“)”'/ d; s / ^ [^] * [^] * \([^] * \)。* / \ 1 /; / [0-9] /!d'
#此命令列出了除最新内核以外的所有软件包的列表。
#来源:https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = $ 1

#查找已安装的内核版本:
#dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep。| 排序-n
#给出版本号,每行一个
#dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep。| sed's /\...$// g'| grep -v'\ ... $'| 排序-u
#仅给出出现在linux-image中的内容

#后缀,例如-generic-pae
#引导进入的内核类型
suffix = $(uname -r | sed's:^ [0-9] \。[0-9] \。[0-9] \-[0-9] \ {2 \} :: g')

command =“ apt-get purge”

$(dpkg-query -W -f ='$ {Version} \ n''linux-image- *'| grep中的版本| sed's /\...$// g'| grep -v' \ ... $'|排序-u |头-n-$ {n})
做
    command = $ {command}“ ^ linux-image-$ {version} $ {suffix}”
完成

$ command

样品用法:

#./keep-n-kernels.sh 4#启动apt-get命令以删除除4个最新内核以外的所有内核

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


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

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

请分享@jarno。很高兴知道这个想法似乎有用。
桑卡尔普,2015年

好的,它是:链接
jarno,2015年

0

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



0

如果您使用ansible来控制机器,则该手册可能会有所帮助。

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
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.