¿Por qué apt-get autoremove no elimina mis núcleos antiguos?

53

Mi partición de arranque está en un SSD, por lo que no tiene espacio para más de aproximadamente 8 versiones de kernel instaladas, y eventualmente alguna actualización del kernel no se instalará porque mi partición de arranque está llena de versiones antiguas. Hay muchas preguntas sobre cómo eliminar versiones antiguas (incluso cómo automatizar el proceso), pero mi pregunta es simplemente esta: ¿por qué no las apt-get autoremovedetecta y las elimina automáticamente, y hay alguna manera de que pueda hacerlo ? Quiero decir, apt-getes lo que los instaló de todos modos, por lo que sabe sobre ellos, entonces, ¿por qué elige dejar todas las versiones antiguas?

BlueBomber
fuente
3
posible duplicado de ¿Por qué Ubuntu no elimina los núcleos antiguos automáticamente?
Restablecer a Monica - M. Schröder
1
AutoRemove no eliminar los granos de edad en la mayoría de las circunstancias. Los núcleos se acumulan porque el sistema no ejecuta automáticamente el movimiento automático por defecto. Esa es una configuración en las actualizaciones desatendidas, y se puede cambiar. Autoremove no puede eliminar los núcleos antiguos cuando fallan las acciones de apt previamente en cola (como instalar un nuevo núcleo) (debido a la falta de espacio). Ver bugs.launchpad.net/bugs/1357093 para un parche para desatendidas-mejoras que va a comenzar a eliminar los granos más antiguas automáticamente.
user535733

Respuestas:

36

En cuanto a por qué, consulte el archivo /etc/apt/apt.conf.d/01autoremove-kernels

ingrese la descripción de la imagen aquí

Como se puede ver, apto se le dice que nunca se AutoRemove los granos, según lo dicho por otro archivo (script), /etc/kernel/postinst.d/apt-auto-removal. Y aquí está:

ingrese la descripción de la imagen aquí

Si instala manualmente 2 núcleos elegidos, es decir, el primero y el actual, entonces apt-autoremove solo eliminará las versiones anteriores que no instaló manualmente, por lo que siempre tendrá esas 2 opciones más cualquiera que sea la última.

Actualizar:

En el /etc/kernel/postinst.d/apt-auto-removalhay esta parte:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

Entonces, si compara la salida del 01autoremove-kernelsarchivo y uname -rse dará cuenta de que el script que se está ejecutando actualmente y el más reciente, nunca se eliminará con ese script. Resulta que hay otro archivo /etc/apt/apt.conf.d/01autoremove, donde hay líneas:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

Así que podría comentarlos y le permitirá eliminar automáticamente los núcleos con apt-autoremove, aunque recuerde: haga esto bajo su propio riesgo

Sergiy Kolodyazhnyy
fuente
1
¡Muy interesante! Mi /etc/apt/apt.conf.d/01autoremove-kernelstiene muchas líneas, pero solo dos versiones entre todas: 3.13.0. {39,43}. Pero dpkg -l linux-*enumera cuatro versiones, 3.13.0. {39,40,41,43}, entonces algo más que /etc/apt/apt.conf.d/01autoremove-kernelsmantener esas versiones intermedias, ¿verdad?
BlueBomber
1
TL: DR: 01autoremovees el archivo que desea, 01autoremove-kernelsprobablemente sea solo una protección, de modo que apt no elimine el kernel instalado actualmente y el más reciente (por si acaso el más reciente lo arruina)
Sergiy Kolodyazhnyy
1
A menos que esté leyendo mal 01autoremove, solo protege contra la eliminación automática de los paquetes de dependencia, como linux-image-extra. Cambiarlo no debería afectar si linux-image-3.16.0-31-genericse quita automáticamente o no . Ninguno de los patrones en él coincide con los nombres de paquetes que queremos eliminar automáticamente.
Peter Cordes
1
@PeterCordes No elimine ni comente líneas /etc/apt/apt.conf.d/01autoremove. Eso no lo ayuda a eliminar automáticamente los paquetes de kernel con versiones antiguas, pero puede tener efectos no deseados. El archivo no protege contra la eliminación automática, linux-image-extrasino paquetes que coinciden con expresiones regulares en la NeverAutoRemovesección.
jarno
2
@BlueBomber, la razón por la apt-get autoremovecual no elimina los núcleos que no figuran en la lista /etc/apt/apt.conf.d/01autoremove-kernelses que esos núcleos están marcados como instalados manualmente; ver a mi respuesta .
jarno
8

Para mí, ayudó a instalar la última (X) ubuntu (15.10). En versiones anteriores, los paquetes del kernel pueden marcarse como instalados manualmente, al menos, si se instalan utilizando Software Updater, para que sudo apt-get autoremove --purgeno se puedan eliminar. Hay informes de errores relacionados con el problema: error # 1175637 , error # 1439769

En una versión anterior, podría intentar marcar los paquetes del núcleo instalados automáticamente sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")y ejecutarlos sudo apt-get autoremove --purgeposteriormente para ver si hay alguna diferencia. El comando aún no debe eliminar los paquetes de kernel que se muestran en /etc/apt/apt.conf.d/01autoremove-kernels, pero es más seguro ejecutar primero apt-get autoremovecon la --dry-runopción.

jarno
fuente
Oh, el comando autoremove tiende a eliminar demasiados núcleos, vea Bug # 1440608
jarno
1
la apt-markhizo el truco para mí, desearía poder upvote 10 veces: P
Mike Gleason jr Couturier