'apt' 如何决定保留多少旧内核?

ion*_*lex 33 server apt kernel purge

我正在管理几台用于核心服务(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
Run Code Online (Sandbox Code Playgroud)

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

请满足我的好奇心!谢谢

Ter*_*nce 40

有一个自动生成的文件,用于说明要自动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 
#
# 将以下内核包标记为 not-for-autoremoval:
# - 当前启动的版本
# - 我们需要的内核版本
# - 最新的内核版本(使用从 grub 复制的规则确定)
# 决定启动哪个内核的包)
# - 第二个最新的内核版本,如果启动的内核版本是
# 已经是最新的,并且这个脚本是为同一个版本调用的,
# 以确保在新安装的情况下回退仍然可用
# 此 ABI 的内核无法启动
# 在一般情况下,这会导致正好保存两个内核,但它可以
# 结果保存了三个内核。最好是在一边犯错
# 保存太多内核比保存太少内核。
#
# 我们生成这个列表并保存到 /etc/apt/apt.conf.d 而不是标记
# 数据库中的包,因为这是从 postinst 脚本运行的,并且 apt
# 将在退出时覆盖数据库。

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

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

sudo apt-mark auto ^linux-image-
Run Code Online (Sandbox Code Playgroud)

然后,当您运行该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-generic
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-generic
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 autoremove
[sudo] 露台密码: 
阅读包裹清单...完成
构建依赖树       
读取状态信息...完成
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-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-generic) 和下一个最新内核 (3.16.0-37-generic) 之外的所有旧内核。

希望这会有所帮助。

  • 如果 Ubuntu 在某处的配置中只是有一个像“MAX_INSTALLED_KERNELS = 1”(意味着保留 1 个附加内核而不是 ~3 个内核)之类的标志,那就太好了。多年来,这一直是系统管理员的烦恼。“哦,/boot/突然没空间了!” 99% 的时间都是未使用的内核。 (7认同)