Modificar los kernel que se guardan en Ubuntu

Modificar los kernel que se guardan en Ubuntu, Fedora y todos sus derivados.

En este artículo quiero responder a varios usuarios, que me han hecho la misma pregunta por privado. Vemos una de ellas a modo de ejemplo. Nuestro fiel lector Octavio de Cuba, nos escribe…

Hola sololinux, una duda que tengo. ¿Los archivos de arranque en el grub, los initrd.img-5.4.0-26-generic y demás versiones, se podrán borrar? Y como se hace?, en estos momentos la PC debe estar arrancando por la versión initrd.img-5.4.0-83-generic que es la última actualizada, si sabe usted y si es recomendable hacerlo claro, saludos

Buenas, amigo Octavio, es evidente que si se pueden borrar. El principal problema reside en que al instalar o actualizar un kernel, a veces se generan más archivos o se modifican configuraciones, que si no tienes los suficientes conocimientos pueden resultar difíciles de identificar.

En realidad no resulta nada práctico borrar los kernel de forma manual, cualquier error puede romper tu sistema de manera casi irremediable. Para Ubuntu, Linux Mint y derivados, te quiero proponer un método que consiste en limitar el número de núcleos antiguos que debe guardar tu sistema de forma automática.

Arquitectura del Linux Kernel

Arquitectura del Linux Kernel

 

Modificar los kernel que se guardan en Ubuntu

Si hablamos de Fedora, CentOS, Alma Linux y derivados. Modificar el número de Kernel que se guardan es tarea sencilla, tan solo debes editar el archivo correspondiente a tu administrador de paquetes (dnf o yum).

sudo nano /etc/dnf.conf

# o

sudo nano /etc/yum.conf

Busca la siguiente línea y modifica el valor numérico, por los kernel que quieres que guarde el sistema.

installonly_limit=5

Imagen de ejemplo.

Limitar el numero de nucleos instalados en Fedora

Limitar el número de núcleos instalados en Fedora

 

En Ubuntu, Linux Mint y derivados el proceso es muy diferente. Existe un archivo de configuración llamado «apt-auto-removal», en el cual puedes modificar los núcleos que quieres que se guarden en el sistema. Lamentablemente, este sistema resulta algo complejo y puede inducir a errores fatales. De todas formas vemos un ejemplo…

sudo nano /etc/kernel/postinst.d/apt-auto-removal

Busca la siguiente línea:

previous_version="$(echo "$debverlist" | sed -n 2p)"

Y la modificas por ejemplo así…, guarda el archivo y cierra el editor.

previous_version="$(echo "$debverlist" | sed -n 2,4p)"

De esta forma se guardarán 3 núcleos viejos, más el que usas actualmente. El archivo «apt-auto-removal», es un script bash, por tanto los cambios no surtirán efecto hasta que lo ejecutas manualmente, o se instale un nuevo kernel.

Numero de nucleos instalados en el sistema

Número de núcleos instalados en el sistema

 

Yo te propongo otra opción que te resultara más atractiva, y no es otra que modificar el script bash con una variable que adjuntara el valor deseado. Abrimos el archivo con nano.

sudo nano /etc/kernel/postinst.d/apt-auto-removal

Al principio del script, agrega lo siguiente. En el primer valor, debes indicar los kernel antiguos que quieres guardar.

NKER=2
NKER=$((NKER+1))

En nuestro ejemplo, dos kernel + uno.

#!/bin/sh
set -e
# Mark as not-for-autoremoval those kernel packages that are:
#  - the currently booted version
#  - the kernel version we've been called for
#  - the latest kernel version (as determined by debian version number)
#  - the second-latest kernel version
#
# In the common case this results in two kernels saved (booted into the
# second-latest kernel, we install the latest kernel in an upgrade), but
# can save up to four. Kernel refers here to a distinct release, which can
# potentially be installed in multiple flavours counting as one kernel.

# Especifica la cantidad de nucleos que quieres conservar.
NKER=2                  <<<------------ 
NKER=$((NKER+1))        <<<------------

eval $(apt-config shell APT_CONF_D Dir::Etc::parts/d)
test -n "${APT_CONF_D}" || APT_CONF_D="/etc/apt/apt.conf.d"
config_file="${APT_CONF_D}/01autoremove-kernels"

eval $(apt-config shell DPKG Dir::bin::dpkg/f)
test -n "$DPKG" || DPKG="/usr/bin/dpkg"

Ahora buscas la línea…

previous_version="$(echo "$debverlist" | sed -n 2p)"

Y la sustituyes por esta otra.

previous_version="$(echo "$debverlist" | sed -n 2,${NKER}p)"

Guardas el archivo y cierra el editor nano. Recuerda que los nuevos valores no surtirán efecto, hasta que no ejecutes el script manualmente o no se instale un nuevo kernel.

 

Hace tiempo que este script no sufre ningún cambio, es el mismo en las últimas versiones LTS de Ubuntu, Mint y derivados. Por tanto… si quieres puedes sustituir el script original de tu sistema, por uno exactamente igual, pero ya modificado con los añadidos que hemos comentado anteriormente. Copia y pega lo siguiente.

#!/bin/sh
set -e
# Mark as not-for-autoremoval those kernel packages that are:
#  - the currently booted version
#  - the kernel version we've been called for
#  - the latest kernel version (as determined by debian version number)
#  - the second-latest kernel version
#
# In the common case this results in two kernels saved (booted into the
# second-latest kernel, we install the latest kernel in an upgrade), but
# can save up to four. Kernel refers here to a distinct release, which can
# potentially be installed in multiple flavours counting as one kernel.

# Especifica la cantidad de nucleos que quieres conservar.
NKER=2
NKER=$((NKER+1))

eval $(apt-config shell APT_CONF_D Dir::Etc::parts/d)
test -n "${APT_CONF_D}" || APT_CONF_D="/etc/apt/apt.conf.d"
config_file="${APT_CONF_D}/01autoremove-kernels"

eval $(apt-config shell DPKG Dir::bin::dpkg/f)
test -n "$DPKG" || DPKG="/usr/bin/dpkg"

list="$("${DPKG}" -l | awk '/^[ih][^nc][ ]+(linux|kfreebsd|gnumach)-image-[0-9]+\./ && $2 !~ /-dbg(:.*)?$/ && $2 !~ /-dbgsym(:.*)?$/ { print $2,$3; }' \
   | sed -e 's#^\(linux\|kfreebsd\|gnumach\)-image-##' -e 's#:[^:]\+ # #')"
debverlist="$(echo "$list" | cut -d' ' -f 2 | sort --unique --reverse --version-sort)"

if [ -n "$1" ]; then
    installed_version="$(echo "$list" | awk "\$1 == \"$1\" { print \$2;exit; }")"
fi
unamer="$(uname -r | tr '[A-Z]' '[a-z]')"
if [ -n "$unamer" ]; then
    running_version="$(echo "$list" | awk "\$1 == \"$unamer\" { print \$2;exit; }")"
fi
# ignore the currently running version if attempting a reproducible build
if [ -n "${SOURCE_DATE_EPOCH}" ]; then
    unamer=""
    running_version=""
fi
latest_version="$(echo "$debverlist" | sed -n 1p)"
previous_version="$(echo "$debverlist" | sed -n 2,${NKER}p)"

debkernels="$(echo "$latest_version
$installed_version
$running_version
$previous_version" | sort -u | sed -e '/^$/ d')"
kernels="$( (echo "$1
$unamer"; for deb in $debkernels; do echo "$list" | awk "\$2 == \"$deb\" { print \$1; }"; done; ) \
   | sed -e 's#\([\.\+]\)#\\\1#g' -e '/^$/ d' | sort -u)"

generateconfig() {
    cat <<EOF
// DO NOT EDIT! File autogenerated by $0
APT::NeverAutoRemove
{
EOF
    for package in $(apt-config dump --no-empty --format '%v%n' 'APT::VersionedKernelPackages'); do
        for kernel in $kernels; do
            echo "   \"^${package}-${kernel}$\";"
        done
    done
    echo '};'
    if [ "${APT_AUTO_REMOVAL_KERNELS_DEBUG:-true}" = 'true' ]; then
        cat <<EOF
/* Debug information:
# dpkg list:
$(dpkg -l | grep '\(linux\|kfreebsd\|gnumach\)-image-')
# list of installed kernel packages:
$list
# list of different kernel versions:
$debverlist
# Installing kernel: $installed_version ($1)
# Running kernel: ${running_version:-ignored} (${unamer:-ignored})
# Last kernel: $latest_version
# Previous kernel: $previous_version
# Kernel versions list to keep:
$debkernels
# Kernel packages (version part) to protect:
$kernels
*/
EOF
    fi
}

generateconfig "$@" > "${config_file}.dpkg-new"
mv -f "${config_file}.dpkg-new" "$config_file"
chmod 444 "$config_file"

 

Canales de Telegram: Canal SoloLinux – Canal SoloWordpress

Espero que este artículo te sea de utilidad, puedes ayudarnos a mantener el servidor con una donación (paypal), o también colaborar con el simple gesto de compartir nuestros artículos en tu sitio web, blog, foro o redes sociales.

Chat de SoloLinux en Telegram

 

2 Comentarios

  1. Octavio
    29/08/2021
    • Sergio G.B.
      29/08/2021

Agregar comentario

1 logo sololinux

Suscríbete a SoloLinux

Recibe todos los nuevos artículos es tu correo electrónico

You have Successfully Subscribed!

Ir al contenido