¿Por qué los viejos archivos initrd de núcleos desinstalados están llenando / arrancando la partición?

12

En varias máquinas Ubuntu, constantemente enfrento el problema de una partición de arranque completa, aunque siempre elimino todos los núcleos antiguos. El problema parece ocurrir, ya que muchos initrdarchivos están en la partición de arranque a pesar de que los núcleos relacionados no están realmente instalados. Para dar, por ejemplo:

root@Jacobi:/boot# ls -lah
insgesamt 202M
drwxr-xr-x  3 root root 3,0K Jan 30 10:03 .
drwxr-xr-x 25 root root 4,0K Jan 30 10:03 ..
-rw-r--r--  1 root root 1,2M Dez 11 15:36 abi-4.4.0-104-generic
-rw-r--r--  1 root root 1,2M Jan  9 22:28 abi-4.4.0-109-generic
-rw-r--r--  1 root root 1,2M Jan 19 14:06 abi-4.4.0-112-generic
-rw-r--r--  1 root root 187K Dez 11 15:36 config-4.4.0-104-generic
-rw-r--r--  1 root root 187K Jan  9 22:28 config-4.4.0-109-generic
-rw-r--r--  1 root root 187K Jan 19 14:06 config-4.4.0-112-generic
drwxr-xr-x  5 root root 1,0K Jan 30 10:03 grub
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-3.13.0-39-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-101-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-103-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-104-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-109-generic
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-4.4.0-38-generic
-rw-r--r--  1 root root  10M Jan 30 10:03 initrd.img-4.4.0-45-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-59-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-77-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-81-generic
-rw-r--r--  1 root root 179K Jan 28  2016 memtest86+.bin
-rw-r--r--  1 root root 181K Jan 28  2016 memtest86+.elf
-rw-r--r--  1 root root 181K Jan 28  2016 memtest86+_multiboot.bin
-rw-------  1 root root 3,8M Dez 11 15:36 System.map-4.4.0-104-generic
-rw-------  1 root root 3,8M Jan  9 22:28 System.map-4.4.0-109-generic
-rw-------  1 root root 3,8M Jan 19 14:06 System.map-4.4.0-112-generic
-rw-------  1 root root 6,8M Dez 11 15:36 vmlinuz-4.4.0-104-generic
-rw-------  1 root root 6,8M Jan  9 22:28 vmlinuz-4.4.0-109-generic
-rw-------  1 root root 6,8M Jan 19 14:06 vmlinuz-4.4.0-112-generic

Pero solo linux-image-4.4.0-104-generic y linux-image-4.4.0-109-generic están instalados:

root@Jacobi:/boot# dpkg -l linux-image-\* | grep ^ii
ii  linux-image-4.4.0-104-generic       4.4.0-104.127 amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-109-generic       4.4.0-109.132 amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-104-generic 4.4.0-104.127 amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-109-generic 4.4.0-109.132 amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

Si elimino los archivos initrd innecesarios manualmente, se generarán nuevamente tan pronto como intente hacer una actualización.

¿Cuál podría ser la causa de este problema y cómo puedo deshacerme de esos archivos de forma permanente?

usuario5950
fuente
1
¿Cómo eliminó los paquetes correspondientes a estas versiones?
muru
1
@muru No recuerdo haberlo hecho de otra manera que no sea purgarlos apt-get autoremove.
user5950

Respuestas:

12

Debe verificar los núcleos parcialmente eliminados con

dpkg -l linux-image-\* | grep ^rc

y eliminarlos con por ejemplo sudo apt-get purge linux-image-4.4.0-101-generic.

La purga eliminará las reglas de generación de initramfs /var/lib/initramfs-tools/.

Si no ayuda, puede eliminarlos manualmente de la lista initramfs:

sudo rm /var/lib/initramfs-tools/3.13.0-39-generic
sudo rm /var/lib/initramfs-tools/4.4.0-101-generic
sudo rm /var/lib/initramfs-tools/4.4.0-103-generic
sudo rm /var/lib/initramfs-tools/4.4.0-38-generic
sudo rm /var/lib/initramfs-tools/4.4.0-45-generic
sudo rm /var/lib/initramfs-tools/4.4.0-59-generic
sudo rm /var/lib/initramfs-tools/4.4.0-77-generic
sudo rm /var/lib/initramfs-tools/4.4.0-78-generic
sudo rm /var/lib/initramfs-tools/4.4.0-81-generic

Por lo general, ejecuto purge-old-kernelsseguido de sudo apt-get autoremovetener solo 2 núcleos recientes.

Puede reinstalar los núcleos instalados con sus initramfses:

sudo apt-get install --reinstall \
$(dpkg -l linux-image-\* | grep ^ii | awk '{print $2}')
N0rbert
fuente
1
Esto parece funcionar bastante bien. Para resumir: de alguna manera, hubo muchos núcleos parcialmente eliminados. Los vi y los quité como se describe arriba. Luego tuve que eliminar los initrdarchivos innecesarios desde el arranque manualmente una vez más para liberar algo de espacio allí, y ¡voilà problema resuelto! ¡Gracias!
user5950
Como he leído, es una mala forma de usar rmpara cualquier cosa relacionada con initrdnúcleos o encabezados. Hay algunos comandos disponibles que manejarán la eliminación de los archivos kernels / headers / initrd.img eliminados parcialmente por usted. Ver update-initramfs. Vea mi respuesta a continuación para más detalles.
Daniel
1

Si ya ha utilizado dpkgpara purgar los kernels / cabeceras y si ya ha comprobado dpkg -ly todavía no ven los granos / cabeceras instaladas allí, pero que todavía ven referencias a estos antiguos núcleos en /bootla forma de initrd-imgarchivos, entonces la forma apropiada para purgar estas referencias y archivos es con el update-initramfscomando

Por ejemplo, si solo ha 4.4.0-109instalado, pero aún ve lo siguiente en /boot:

-rw-r--r--  1 root root  10M Jan 30 10:02 initrd.img-4.4.0-103-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-104-generic
-rw-r--r--  1 root root  38M Jan 30 10:02 initrd.img-4.4.0-109-generic

Puede eliminar de forma segura 4.4.0-104y 4.4.0-103desde /bootcon los siguientes comandos:

$ sudo update-initramfs -d -k 4.4.0-103-generic
$ sudo update-initramfs -d -k 4.4.0-104-generic
$ sudo update-initramfs -c -k all

Los primeros dos comandos eliminan las referencias a esos núcleos en initramfslas reglas de generación, así como los archivos en /boot. El último comando le dice a initramfs que regenere los initrd.imgarchivos según las reglas actualizadas.

Teóricamente también podrías usar

$ sudo update-initramfs -d -k 4.4.0-{103,104}-generic

eliminar múltiples núcleos a la vez, pero por alguna razón esto no funcionó para mí.

Daniel
fuente
+1: este es el método correcto (y la respuesta) para los initrd huérfanos.
bshea