“ apt”如何决定保留几个旧内核?


23

我正在管理用于核心服务(NTP,DNS等)的几个服务器,但在我看来,其中一个服务器似乎保留了3个最新内核,而不是其他两个:

nul@quark:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@quark:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-51-generic       3.13.0-51.84                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-51-generic 3.13.0-51.84                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

...

nul@dwarf:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@dwarf:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

所有服务器的维护方式相同,不知道我能做些什么,必须在某处作为参数但找不到它!

请满足我的好奇心!谢谢

Answers:


32

有一个自动生成的文件,告诉您apt-get要自动删除哪些内核以及保留哪些内核。
告诉apt-get它们是哪个内核的文件/etc/apt/apt.conf.d/01autoremove-kernels是从生成的/etc/kernel/postinst.d/apt-auto-removal

通常发生的情况是,当您接收内核更新时,当内核版本更改时,例如从3.133.16/etc/apt/apt.conf.d/01autoremove-kernels然后进行更新以保留3.16*内核,然后将其设置为删除所有3.13内核,除非生成脚本指定不删除。

apt-auto-removal脚本中:

#作者:史蒂夫·兰加塞克 
#
#将以下内核软件包标记为非自动删除:
#-当前启动的版本
#-我们被称为的内核版本
#-最新的内核版本(使用从grub复制的规则确定
#决定启动哪个内核的软件包)
#-第二最新的内核版本,如果引导的内核版本是
#已经是最新版本,并且该脚本的版本相同,
#确保在新安装的情况下仍然可以使用后备广告
#此ABI的内核无法启动
#在通常情况下,这将导致保存了两个内核,但是可以
#导致保存三个内核。最好是站在一边
#保存太多的内核而不是保存太多的内核。
#
#我们生成此列表并将其保存到/etc/apt/apt.conf.d中,而不是标记
#数据库中的软件包,因为这是从postinst脚本运行的,并且apt
#退出时将覆盖数据库。

但是,这有时不会将它们标记为自动删除,因为某些编码已在版本上进行了更改,以防止发生这种情况。

如果要autoremove基于脚本标记除所需内核以外的先前内核,请从终端窗口运行以下命令:

sudo apt-mark auto ^linux-image-

然后,当您运行apt-get autoremove命令时,只能删除旧的且不再需要的命令。我将示例放在下面:

第一个显示了系统上的所有内核减去当前正在运行的内核。

root @ terrance-Linux:/ home / share#dpkg -l'linux- *'| sed'/ ^ ii /!d; /'“ $(uname -r | sed” s /\(.*\)-\([^ 0-9] \ + \)/ \ 1 /“)”'/ d; s / ^ [^] * [^] * \([^] * \)。* / \ 1 /; / [0-9] /!d'
linux-headers-3.16.0-34
linux-headers-3.16.0-34-generic
linux-headers-3.16.0-36
linux-headers-3.16.0-36-generic
linux-headers-3.16.0-37
linux-headers-3.16.0-37-generic
linux-headers-4.0.0-040000
linux-headers-4.0.0-040000-通用
linux-image-3.16.0-34-generic
linux-image-3.16.0-36-generic
linux-image-3.16.0-37-generic
linux-image-4.0.0-040000-通用
linux-image-extra-3.16.0-34-generic
linux-image-extra-3.16.0-36-generic
linux-image-extra-3.16.0-37-generic

此图显示了当前正在运行的内核。

terrance @ terrance-Linux:〜$ uname -r
4.0.1-040001通用
terrance @ terrance-Linux:〜$ sudo apt-get自动删除
[sudo] terraency的密码: 
正在阅读包装清单...完成
建立依赖树       
正在读取状态信息...完成
0已升级,0新安装,0已删除和0未升级。
terrance @ terrance-Linux:〜$ sudo apt-mark自动^ linux-image-
linux-image-extra-3.16.0-33-generic无法标记,因为它尚未安装。
linux-image-extra-3.13.0-27-generic无法标记,因为它尚未安装。
linux-image-3.13.0-44-lowlatency无法标记,因为它尚未安装。
linux-image-3.13.0-27-generic无法标记,因为它尚未安装。
linux-image-3.16.0-31-lowlatency无法标记,因为它尚未安装。
linux-image-3.16.0-36-generic设置为自动安装。
linux-image-lowlatency-lts-utopic无法标记,因为它尚未安装。
无法标记linux-image-extra-3.13.0-36-generic。
linux-image-3.13.0-36-generic无法标记,因为它尚未安装。
linux-image-4.0.0-040000-generic设置为自动安装。
无法标记linux-image-extra-3.13.0-45-generic。
linux-image-3.16.0-25-generic无法标记,因为它尚未安装。

注意: 以上内容太长,无法列出,因此我删节了一点。

terrance @ terrance-Linux:〜$ sudo apt-get自动删除
正在阅读包装清单...完成
建立依赖树       
正在读取状态信息...完成
以下软件包将被删除:
  linux-image-3.16.0-34-generic linux-image-3.16.0-36-generic
  linux-image-4.0.0-040000-generic linux-image-extra-3.16.0-34-generic
  linux-image-extra-3.16.0-36-generic
0已升级,0新安装,5已删除和0未升级。
此操作后,将释放613 MB磁盘空间。
你想继续吗?[是/否]

因此,在运行这些命令之后,您可以看到我现在可以自动删除所有旧的但当前的内核(4.0.1-040001通用)和下一个最新的内核(3.16.0-37通用)。

希望这会有所帮助。


Ubuntu默认情况下不会自动删除吗?我们确实有选择,但是(仍然)认为无法确定什么是“不需要的”内核(在其他操作系统上,“不需要的”等于“未使用的”)。
Rinzwind

好。我误解了您的帖子;-)
林茨温德(Rinzwind)2015年

1
@Terrance我试图通过sudo apt-mark auto ^linux-image-sudo apt-get autoremove --purge但没有结果;但是,稍作dist-upgrade修改的2个内核(3.13.0-52和3.16.0.37)以及以下的内核autoremove摆脱了3.13.0-51 ...
ionreflex 2015年

1
@ionreflex很高兴您发现了这一点。并非每个答案都是完美的,并且它可能不适用于每个人。但是,我发现像您这样的人可以做一些故障排除并找出一种删除它们的方法,这是很好的。我认为dist-upgrade您开始了/etc/kernel/postinst.d/apt-auto-removal,然后修改,/etc/apt/apt.conf.d/01autoremove-kernels然后告诉它要保留哪些。
Terrance

1
@Terrance可以肯定的是,我dist-upgrade之前做过,但是也许今天早上内核升级就可以了。
ionreflex 2015年
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.