我正在管理几个用于核心服务(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.13
,3.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)。
希望这有帮助。