Pourquoi les anciens fichiers initrd des noyaux désinstallés remplissent-ils la partition de démarrage / démarrage?

12

Sur plusieurs machines Ubuntu, je suis constamment confronté au problème d'une partition de démarrage complète bien que je supprime toujours tous les anciens noyaux. Le problème semble se produire, car de nombreux initrdfichiers se trouvent sur la partition de démarrage même si les noyaux associés ne sont pas réellement installés. Pour donner en exemple:

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

Mais seuls linux-image-4.4.0-104-generic et linux-image-4.4.0-109-generic sont installés:

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 je supprime manuellement les fichiers initrd inutiles, ils seront à nouveau générés dès que j'essaierai de faire une mise à niveau.

Quelle pourrait être la cause de ce problème et comment puis-je me débarrasser définitivement de ces fichiers?

user5950
la source
1
Comment avez-vous supprimé les packages correspondant à ces versions?
muru
1
@muru Je ne me souviens pas l'avoir fait autrement que de les purger apt-get autoremove.
user5950

Réponses:

12

Vous devez vérifier les noyaux partiellement supprimés avec

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

et les retirer avec par exemple sudo apt-get purge linux-image-4.4.0-101-generic.

La purge supprimera les règles de génération d'initramfs de /var/lib/initramfs-tools/.

Si cela n'aide pas, vous pouvez les supprimer manuellement de la liste 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

Habituellement, je cours purge-old-kernelssuivi de sudo apt-get autoremoveseulement 2 noyaux récents.

Vous pouvez réinstaller les noyaux installés avec leurs initramfses:

sudo apt-get install --reinstall \
$(dpkg -l linux-image-\* | grep ^ii | awk '{print $2}')
N0rbert
la source
1
Cela semble assez bien fonctionner. Pour résumer: certains comment il y avait beaucoup de grains seulement partiellement enlevés. Je les ai repérés et retirés comme décrit ci-dessus. Ensuite, j'ai dû supprimer initrdmanuellement les fichiers inutiles du démarrage pour libérer de l'espace, et voilà le problème résolu! Merci!
user5950
Comme je l'ai lu, c'est une mauvaise forme à utiliser rmpour tout ce qui concerne les initrdnoyaux ou les en-têtes. Certaines commandes sont disponibles pour gérer la suppression des fichiers kernels / headers / initrd.img partiellement supprimés pour vous. Tu vois update-initramfs. Voir ma réponse ci-dessous pour plus de détails.
Daniel
1

Si vous avez déjà utilisé dpkgpour purger les noyaux / en-têtes et si vous avez déjà vérifié dpkg -let ne voyez toujours pas les noyaux / en-têtes installés là-bas, mais vous voyez toujours des références à ces anciens noyaux sous /bootforme de initrd-imgfichiers, alors la bonne façon purger ces références et fichiers se fait avec la update-initramfscommande.

Par exemple, si vous avez seulement 4.4.0-109installé, mais que vous voyez toujours ce qui suit dans /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

Vous pouvez supprimer en toute sécurité 4.4.0-104et 4.4.0-103de /bootles commandes suivantes:

$ 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

Les deux premières commandes suppriment les références à ces noyaux dans initramfsles règles de génération ainsi que les fichiers dans /boot. La dernière commande indique à initramfs de régénérer les initrd.imgfichiers en fonction des règles mises à jour.

Théoriquement, vous pouvez également utiliser

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

pour supprimer plusieurs noyaux à la fois, mais pour une raison quelconque, cela n'a pas fonctionné pour moi.

Daniel
la source
+1 - C'est la méthode (et la réponse) correcte pour les initrd orphelins.
bshea