¿Cómo decide 'apt' cuántos núcleos antiguos mantener?

23

Estoy administrando un par de servidores para servicios básicos (NTP, DNS, etc.) y se me ocurrió que uno de los servidores parece mantener los 3 núcleos más recientes, en lugar de 2 en los otros:

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

Todos los servidores se mantienen de forma idéntica, no sé lo que podría haber hecho, debe ser un parámetro en alguna parte, ¡pero no puedo encontrarlo!

¡Por favor alimenta mi curiosidad! Gracias

ionreflex
fuente

Respuestas:

32

Hay un archivo que se genera automáticamente y que indica apt-getqué núcleos se deben eliminar automáticamente y cuáles mantener.
El archivo que dice de apt-getqué núcleos son es el /etc/apt/apt.conf.d/01autoremove-kernelsque se genera /etc/kernel/postinst.d/apt-auto-removal.

Por lo general, lo que sucede es que cuando recibe actualizaciones del núcleo, cuando la versión del núcleo cambia, digamos de 3.13a 3.16, /etc/apt/apt.conf.d/01autoremove-kernelsse actualiza para mantener los 3.16*núcleos y luego se configura para eliminar todos los 3.13núcleos, a menos que el script de generación no lo especifique.

Del apt-auto-removalguión:

# Autor: Steve Langasek 
# #
# Marque como no para auto-eliminación los paquetes de kernel que son:
# - la versión actualmente arrancada
# - la versión del kernel para la que hemos sido llamados
# - la última versión del kernel (determinada usando reglas copiadas del grub
# paquete para decidir qué núcleo arrancar)
#: la segunda versión más reciente del núcleo, si la versión del núcleo arrancada es
# ya es el último y este script se llama para esa misma versión,
# para garantizar que haya una reserva disponible en caso de que el recién instalado
# kernel en este ABI no puede arrancar
# En el caso común, esto da como resultado exactamente dos núcleos guardados, pero puede
# da como resultado que se guarden tres núcleos. Es mejor errar del lado de
# guardar demasiados núcleos que guardar muy pocos.
# #
# Generamos esta lista y la guardamos en /etc/apt/apt.conf.d en lugar de marcar
# paquetes en la base de datos porque esto se ejecuta desde un script postinst y apt
# sobrescribirá el db cuando salga.

Sin embargo, esto a veces no los marcará para la eliminación automática ya que parte de la codificación ha cambiado sobre las versiones para evitar que esto suceda.

Si desea marcar los núcleos anteriores a autoremoveexcepción de los núcleos necesarios basados ​​en los scripts, ejecute el siguiente comando desde una ventana de terminal:

sudo apt-mark auto ^linux-image-

Luego, cuando ejecuta el apt-get autoremovecomando, solo se pueden eliminar los que son antiguos y que ya no son necesarios. He puesto ejemplos a continuación:

Este primero muestra todos los núcleos en el sistema menos el núcleo actual en ejecución.

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

Este muestra el núcleo actual en ejecución.

terrance @ terrance-Linux: ~ $ uname -r
4.0.1-040001-genérico
terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
[sudo] contraseña para terrance: 
Leyendo listas de paquetes ... Hecho
Construyendo árbol de dependencia       
Leyendo información del estado ... Hecho
0 actualizado, 0 recién instalado, 0 para eliminar y 0 no actualizado.
terrance @ terrance-Linux: ~ $ sudo apt-mark auto ^ linux-image-
linux-image-extra-3.16.0-33-generic no se puede marcar porque no está instalado.
linux-image-extra-3.13.0-27-generic no se puede marcar porque no está instalado.
linux-image-3.13.0-44-lowlatency no se puede marcar porque no está instalado.
linux-image-3.13.0-27-generic no se puede marcar porque no está instalado.
linux-image-3.16.0-31-lowlatency no se puede marcar porque no está instalado.
linux-image-3.16.0-36-generic establecido para instalarse automáticamente.
linux-image-lowlatency-lts-utopic no se puede marcar porque no está instalado.
linux-image-extra-3.13.0-36-generic no se puede marcar porque no está instalado.
linux-image-3.13.0-36-generic no se puede marcar porque no está instalado.
linux-image-4.0.0-040000-generic establecido para instalarse automáticamente.
linux-image-extra-3.13.0-45-generic no se puede marcar porque no está instalado.
linux-image-3.16.0-25-generic no se puede marcar porque no está instalado.

NOTA: El anterior era demasiado largo para enumerarlo, así que lo trunqué un poco.

terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
Leyendo listas de paquetes ... Hecho
Construyendo árbol de dependencia       
Leyendo información del estado ... Hecho
Los siguientes paquetes serán eliminados:
  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 actualizado, 0 recién instalado, 5 para eliminar y 0 no actualizado.
Después de esta operación, se liberarán 613 MB de espacio en disco.
¿Quieres continuar? [S / n]

Entonces, después de ejecutar esos comandos, puede ver que ahora puedo eliminar automáticamente todo el kernel antiguo pero el actual (4.0.1-040001-generic) y el próximo más nuevo (3.16.0-37-generic).

Espero que esto ayude.

Terrance
fuente
Ubuntu no elimina automáticamente por defecto, ¿verdad? Tenemos la opción, pero (todavía) se consideró imposible decidir qué es un núcleo "no deseado" (en otro sistema operativo "no deseado" es igual a "no utilizado").
Rinzwind
Okay.
Leí
1
@Terrance Traté de pasar sudo apt-mark auto ^linux-image-seguido sudo apt-get autoremove --purgepero fue en vano; sin embargo, un poco dist-upgrademodificado 2 núcleos (3.13.0-52 y 3.16.0.37) y lo siguiente autoremovese deshizo de 3.13.0-51 ...
ionreflex
1
@ionreflex Me alegra que hayas encontrado eso. No todas las respuestas son perfectas, y puede que no funcione para todos. Pero me parece agradable que personas como usted puedan solucionar un poco y encontrar una forma de eliminarlos. Estoy pensando que el dist-upgradeque corriste inició el /etc/kernel/postinst.d/apt-auto-removalque luego modificó el y /etc/apt/apt.conf.d/01autoremove-kernelsluego le dijo cuáles guardar.
Terrance
1
@Terrance Estoy bastante seguro de que lo hice dist-upgradeantes, pero tal vez el hecho de que los núcleos se hayan actualizado esta mañana fue el truco ... de todos modos, saludos, y gracias por su respuesta, ¡he aprendido mucho a través de él!
ionreflex