‘apt’ 如何决定保留多少个旧内核?

‘apt’ 如何决定保留多少个旧内核?

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

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

所有服务器都以相同的方式维护,不知道我能做什么,一定是某个地方的参数,但找不到它!

请满足我的好奇心!谢谢

答案1

更新2022-10-03:

看来 Canonical/Debianapt从 2.4.5 版本开始就直接实现了这些设置,以保护两个内核

apt changelog apt

apt (2.4.5) unstable; urgency=medium

  * Only protect two kernels, not last installed one (LP: #1968154)
  * Fix segfault in CacheSetHelperAPTGet::tryVirtualPackage()

 -- Julian Andres Klode <[email protected]>  Fri, 08 Apr 2022 12:22:23 +0200

该漏洞的直接链接https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1968154


旧信息:

有一个自动生成的文件,告知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脚本中:

# 作者:Steve Langasek
#
# 将以下内核包标记为不自动删除:
#-当前启动的版本
#——我们被要求的内核版本
# - 最新的内核版本(使用从 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 标头-3.16.0-34
Linux 标头-3.16.0-34-通用
Linux 标头-3.16.0-36
Linux 标头-3.16.0-36-通用
Linux 标头-3.16.0-37
Linux 标头-3.16.0-37-通用
Linux 标头-4.0.0-040000
Linux 标头 4.0.0-040000-通用
Linux-映像-3.16.0-34-通用
Linux-映像-3.16.0-36-通用
Linux-映像-3.16.0-37-通用
Linux-映像-4.0.0-040000-通用
Linux-image-extra-3.16.0-34-通用
Linux-image-extra-3.16.0-36-通用
Linux-image-extra-3.16.0-37-通用

这显示当前正在运行的内核。

terrance@terrance-Linux:~$ uname -r
4.0.1-040001-通用
terrance@terrance-Linux:~$ sudo apt-get autoremove
[sudo] terrance 的密码:
正在读取软件包列表...完成
构建依赖关系树       
正在读取状态信息...完成
升级了 0 个,新安装了 0 个,要删除 0 个,并且未升级 0 个。
terrance@terrance-Linux:~$ sudo apt-mark auto ^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 autoremove
正在读取软件包列表...完成
构建依赖关系树       
正在读取状态信息...完成
下列软件包将被删除:
  Linux-image-3.16.0-34-通用 Linux-image-3.16.0-36-通用
  Linux-image-4.0.0-040000-通用 Linux-image-extra-3.16.0-34-通用
  Linux-image-extra-3.16.0-36-通用
升级了 0 个,新安装了 0 个,删除了 5 个,并且未升级 0 个。
此操作后,将释放613 MB的磁盘空间。
您想继续吗?[Y/n]

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

希望这有帮助。

相关内容