Ma partition / boot a atteint 100% et maintenant je ne peux pas mettre à jour. Ne peut pas enlever les vieux noyaux pour faire de la place

154

Mon premier problème était quand j'ai essayé apt-get updateou apt-get upgrade. Lors de la mise à niveau, j'obtiens l'erreur suivante:

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

J'ai essayé de lancer apt-get install -f et c'était la sortie (après avoir dit oui à l'invite)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

J'ai essayé de courir apt-get autoremoveet ça me donne la même erreur que apt-get upgrade.

Quand je cours df, je reçois ceci pour /boot:

/dev/sda1                    233191     230297         0 100% /boot

J'ai donc lu ailleurs que je devrais essayer de purger les vieux noyaux. J'ai vérifié quels noyaux j'avais avec:

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

Quand j'essaie d'enlever le plus ancien avec ceci:

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Comment puis-je libérer ou étendre le démarrage sans gâcher mon installation?

Strifey16
la source
Je pense que la réponse de @ mreiter est peut-être la meilleure: il utilise le gestionnaire de paquets et fonctionne lorsque d'autres commandes du gestionnaire de paquets échouent, du moins pour moi: askubuntu.com/a/205776/247661
Aaron Hall
1
@dskrvk Oui! Pourquoi n'est Remove-Unused-Dependenciespas la valeur par défaut?
Steven R. Loomis

Réponses:

130

Libérer de l'espace sur le système de fichiers racine

Pour libérer de l'espace sur le système de fichiers racine, vous pouvez essayer de l'exécuter apt-get clean.

Si cela ne fonctionne pas, vous pouvez /var/cache/apt/archivessupprimer manuellement quelques fichiers du cache pour récupérer de l'espace, par exemple:

sudo rm linux-headers-*

Cela ne fera pas de mal de supprimer tous les .debfichiers ici si vous en avez besoin - c'est ce que vous faites apt-get clean. Ils seront automatiquement re-téléchargés par apts'ils sont nécessaires à nouveau.

Libérer de l'espace sur le système de fichiers / boot

L’affiche originale a une /bootpartition séparée , c’est ce qui est plein et empêche le aptsystème de fonctionner. Il lui faudra libérer de l'espace.

S'il y a presque assez d'espace libre, allez dans /bootet supprimez un fichier de configuration ou deux:

sudo rm config-3.2.0-19-generic-pae

par exemple, mais en utilisant le nom de l’une des versions du noyau que vous souhaitez malgré tout supprimer. Cela libérera un peu d’espace (environ 144K pièce).

Si vous avez besoin de plus d' espace supprimer individuellement vieux vmlinuz, initrd, abiet les System.mapfichiers jusqu'à ce que vous avez suffisamment d' espace (environ 22M pour un de mes versions du noyau i386).

Quoi que vous fassiez, ne les supprimez pas tous . Vous devez au moins conserver les deux dernières versions correspondantes de chaque type de fichier, pour chaque type de noyau que vous utilisez.

Continuez ensuite avec vos commandes apt-get install. Comme mentionné ci-dessus, ils devront peut-être télécharger à nouveau certaines des résolutions que vous avez supprimées, mais si c'est le cas, cela se fera automatiquement. Lorsque vous aurez à nouveau utilisé apt, nettoyez-le en utilisant apt-get pour supprimer les paquets correspondant aux fichiers que vous avez supprimés - pour que tout corresponde.


Le fichier de configuration présent /bootest la configuration du noyau utilisée par l’équipe du noyau pour construire le noyau du même nom. Il devrait être inoffensif de l'enlever à moins que vous ne le vouliez pour référence ou pour vous aider à construire vos propres noyaux.

Enfin, vous supprimez manuellement un ancien package de noyau ou deux de la /bootpartition pour laisser encore plus de place au nouveau.

John S Gruber
la source
J'ai essayé d'enlever presque toutes les configs. Il ne semble toujours pas avoir assez d'espace. Quels autres fichiers peuvent être supprimés en toute sécurité? Mon système de fichiers racine est loin d'être complet, je ne m'inquiète donc pas pour cela.
Strifey16
J'ai mis à jour ma réponse avec les autres fichiers à supprimer à la main. Il me semble que la suppression des ensembles 3.0.0.13 et 3.0.0.14 (cinq fichiers dans l’ensemble, y compris le fichier abi) serait suffisante.
John S Gruber
2
Cela l'a corrigé. J'ai réalisé que cela reviendrait probablement à supprimer les fichiers à la main, mais j'hésite toujours à le faire avec tout ce qui est installé par apt, j'ai donc pensé poser la question en premier.
Strifey16
9
Ne pas utiliser sudo rmpour retirer de / boot. Utilisez plutôt sudo dpkg --purgepour supprimer un ancien paquet linux-image. Par la suite, utilisez sudo apt-get -f installpour réparer la dépendance brisée.
Jarno
4
Bien que parfois le système soit si plein que même dpkg ne puisse pas fonctionner. Mais rmpeut être utilisé alors.
Jarno
66

Dans mon cas, les aptcommandes et la dpkgcommande n'ont pas pu être terminées ni supprimées. La mise à jour automatique a échoué lors de l'installation 2.6.32-56-server.

Ma première étape a été d'identifier l'espace à utiliser,

cd /boot
du -sk *|sort -n

J'avais environ 30 noyaux et fichiers de support.

J'ai fait un uname -apour obtenir le noyau en cours d’exécution, j’ai identifié que j’étais sur une machine de remplacement Linux 2.6.32-43-serveret j’ai fait l’une tardes 6 versions qui ne fonctionnaient pas et qui étaient anciennes.

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

J'ai ensuite fait une copie rm -rfde ce que j'avais sauvegardé:

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Je montre ces commandes à titre d'exemple, vous devrez décider avec quoi vous travaillerez dans votre situation.

Maintenant que j'avais de la place /boot, je pouvais courir

apt-get -f install 

Pour nettoyer l'installation échouée de 2.6.32-56-server.

J'ai ensuite fait un

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

Cela m'a donné de la place pour remettre ce que j'avais sauvegardé.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

Pour nettoyer, je pourrais alors exécuter:

apt-get autoremove

J'ai redémarré et je dois maintenant utiliser 4% de /boot.

AG Russell
la source
Ce fut la plus utile pour moi parmi toutes les suggestions. Merci beaucoup!
Joshua F. Rountree
supprimer des fichiers de / boot casse horriblement apt et dpkg puisque leurs scripts d’installation et de suppression échouent HARD lorsque les fichiers sont manquants. Je ne vois pas comment tu as réussi à faire fonctionner ça.
FizxMike
20

Vous pouvez utiliser à la dpkgplace de apt-getsupprimer les anciens noyaux:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
la source
Il y a peut-être des avantages à utiliser cela, mais la suggestion de @ mreiter a fonctionné pour moi alors que celle-ci ne fonctionnait pas (celle-ci a été suggérée sur le canal de support IRC d'ubuntu.)
Aaron Hall
3
@AaronHall Cette réponse contient simplement la partie clé de la réponse de mreiter (la dernière ligne) et est beaucoup plus courte puisqu'elle ne couvre pas le nettoyage des en-têtes (ce qui n'aide pas dans le cas d'une /bootpartition séparée ).
Melebius
9

J'ai remarqué qu'il y avait encore des fichiers des anciennes versions dans le répertoire de démarrage:

$ ls /boot
vmcoreinfo-2.6.31-17-server

Et le gestionnaire de paquets listerait les anciennes versions:

dpkg -l | grep linux-image

J'ai donc utilisé cette commande ( autoremovesupprimerait également les images plus récentes que je ne souhaite pas supprimer)

sudo apt-get purge linux-image-2.6.31-17-server

Il me restait quelques en-têtes:

dpkg -l | grep linux-headers

Alors j'ai fait ça:

sudo apt-get purge linux-headers-2.6.32-34

Enfin, il restait un paquet que je ne pouvais pas supprimer avec apt-get purge:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

Source: Supprimer un paquet marqué comme rc par dpkg

sudo dpkg --purge linux-image-2.6.28-11-server
Mreiter
la source
3

Vérifiez l'utilisation de /var/tmpavec du -sh /var/tmp/. Tous les fichiers de ce dossier peuvent être supprimés pour libérer de l'espace.

Vous pouvez ensuite exécuter ce qui suit pour supprimer les anciens noyaux:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub
Tertius
la source
Quel /var/tmprapport avec les vieux noyaux? Et il n’est pas toujours prudent de tout effacer /var/tmp...
fosslinux
3

C'est ce que j'ai utilisé:

sudo apt-get autoremove linux-image-xxxx

Faites cela pour tous les anciens noyaux et ne gardez que les deux plus récents.

Si vous voulez supprimer automatiquement les anciens noyaux et mettre à jour GRUB, voyez ceci: Documentation Ubuntu

Samer
la source
2
Cela devrait être la réponse acceptée. Si tout ne vous dérange pas de tout nettoyer, vous n'avez même pas besoin de spécifier l'image Linux.
CyberEd
2

J'ai trouvé que la seule chose qui fonctionnait pour moi utilisait Aptitude.

sudo aptitude

Ensuite, lorsqu’il s'ouvre, il indique généralement quelque chose à propos des dépendances non satisfaites. Vous pouvez appuyer sur la lettre gpour procéder à la suppression suggérée. Cela vous mènera à une page où il énumère ce qui va se passer.

Il devrait y avoir un moins à -côté des noyaux brisés. Appuyez à gnouveau pour supprimer les noyaux cassés. Appuyez sur qpour quitter. Ensuite, vous devriez pouvoir utiliser sudo apt-get autoremovepour vous débarrasser des vieux noyaux et libérer de l'espace.

Matthew Swanson
la source
1
c'est la SEULE réponse valide. toutes les autres réponses n'ont pas fonctionné, car le gestionnaire de paquets voulait installer un paquet avant de pouvoir supprimer quoi que ce soit.
machineaddict
2

Vous ne pouvez pas agir sur des paquetages, mais vous pouvez agir sur d'autres fichiers. Tout d’abord, parcourez votre dossier personnel et voyez s’il ya quelque chose que vous pouvez supprimer. Sinon, essayez de déplacer une bonne quantité de fichiers vers une autre partition (ou un lecteur flash), puis essayez sudo apt-get install -fde nettoyer les problèmes de dépendance des paquets (vous avez probablement installé un fichier .deb dpkg), puis purgez tous les anciens noyaux. Une fois que vous avez au moins 10 Mo en toute sécurité, essayez de purger les logiciels ou fichiers inutiles.

ζ--
la source
5
Le dossier de départ n'est pas dans / boot
Thorbjørn Ravn Andersen
1

Utilisez le gestionnaire de paquets Synaptic. Il suffit de choisir le paquet que vous voulez supprimer et il vous sera demandé de supprimer également les paquets qui en dépendent. D'après mon expérience, les packages de noyau sont toujours groupés par deux (ou plus, selon votre décompte) interdépendants. Vous pouvez généralement retrouver les anciens rapidement en utilisant le filtre "local / obsolète".

Wegko
la source
2
Par exemple, sur un serveur (texte uniquement), il n'y a pas de Synaptic. Donc, pas vraiment une solution viable pour les serveurs.
nerdoc
1

Je me suis battu avec ce problème de temps en temps, et je n'ai toujours pas trouvé de solution qui fasse le travail complet. Dans certains cas, la suppression de vieux noyaux aboutit à des dépendances qui m'empêchent de supprimer quoi que ce soit et j'ai dû supprimer les noyaux manuellement dans / boot. Cependant, je voulais toujours faire tout le travail car j'imagine que les noyaux supprimés manuellement sont enregistrés quelque part et peuvent causer de futurs problèmes, lorsqu'un élément signale des fichiers manquants à cause de mon enregistrement rm -rf sur les fichiers.

J'ai donc écrit ce script, basé sur de nombreuses suggestions recherchées dans Google, qui ne nécessite aucune installation supplémentaire. Le script a été modifié à quelques reprises pour prendre en charge certaines situations "inattendues". Par exemple, en exécutant ceci sur un Raspberry Pi, update-grub n’existe probablement pas. Et dans certains cas, lors de l'exécution des derniers programmes de mise à jour, les serveurs étaient bloqués avec IPv6 où certains sites étaient inaccessibles.

Le script détermine s'il doit supprimer de manière forcée les noyaux complètement bloqués en raison de la génération de dépendances, sinon s'il peut le faire de la "bonne" façon.

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi
Tomas Tornevall
la source
Avez-vous essayé linux-purge ? Cependant, il n’a pas cette fonction Force IPv4 pour le moment.
jarno
Votre script purgerait linux-image-generic dans mon système, ce qui est une mauvaise chose.
jarno
Ils sont pour une raison quelconque remis en place lorsque les anciens noyaux ont été nettoyés. Au moins, cela a été le cas pour moi depuis que j'ai construit ce script. Cependant, ce script est quelque chose que j’utilise quand il n’ya pas d’autres options pour avancer. Normalement, les mises à niveau s’occupent de cela elles-mêmes, mais pour ce qui est de ce moment où rien ne fonctionne, cela peut être une bonne option car il y a généralement plus de noyaux qui seront mis en place après le nettoyage. Si ce bien ou ce mal est probablement discutable.
Tomas Tornevall le
0

Courir simplement a sudo apt-get -f autoremoverésolu mon problème.

forzagreen
la source
2
Aviez-vous 100% d'espace disque / utilisation de démarrage?
fosslinux
En regardant mon historique de surveillance, il ne semblait pas. PS: Je suis sur Vagrant xenial et mon système de fichiers de démarrage /dev/sda1est monté sur/
forzagreen le
0

Lance ça:

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

Source: J'obtiens cette erreur après upgade. s'il vous plaît aider

Ardi Nusawan
la source
que fait sudo dpkg-reconfigure -a? Sur Ubuntu 16, son option inconnue -a
Shivam Kotwalia
Pour cette question, aptla suppression des packages du noyau échouera, car le processus de suppression lui-même génère des fichiers /bootdéjà pleins. C'est pourquoi apt-get autoremoveéchoue. La question que vous recherchez est askubuntu.com/q/142926/158442 , qui a déjà été autoremoverépertoriée.
Muru
@muru Je viens de l'afficher parce que c'est ce qu'il a fait pour moi: D
Ardi Nusawan
Je suis sûr que oui, ce que je dis, c'est que votre problème aurait été l'autre question, pas celle-ci.
mardi
@muru oh ok compris: D
Ardi Nusawan
0

J'ai vu quelques articles sur / boot en cours de saturation qui ne sont pas résolus par dpkg en purgeant les anciens noyaux Linux, car apt-get -f install ou apt-get -f autoremov réinstallent les noyaux.

Dans mon cas, au moins, les paquetages signés et supplémentaires devaient également être supprimés - les noyaux étant des dépendances de ces paquetages, ils les ont donc réinstallés. En règle générale, les packages de noyau associés doivent être purgés avant d'appeler «install». Si vous avez essayé de mettre apt-get à niveau juste après la purge, le message d'erreur aurait dû indiquer quels paquets avaient une dépendance non satisfaite du noyau que vous veniez de purger.

Dans mon cas, la tactique suivante a fonctionné:

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade
Rhandi Martin
la source
0

Installez l' outil linux-purge comme ceci .

Puis lancez dans le terminal:

sudo linux-purge --clear-boot --fix

Puis continuez à enlever les noyaux par exemple

sudo linux-purge --keep 1 --choose

Supplémentaire:

Si vous souhaitez utiliser linux-purge pour la suppression du noyau sans assistance au lieu de procéder à des mises à niveau sans assistance, vous devez désactiver la suppression des éléments inutilisés en modifiant /etc/apt/apt.conf.d/50unattended-upgrades et en configurant un service systemd. l'exécution

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

quand tu veux.

Jarno
la source