Plus d'espace disque: Comment puis-je trouver ce qui prend de l'espace?

62

J'ai rencontré un problème sur l'un de mes serveurs sous 16.04: il ne reste plus d'espace disque.

Je n'ai aucune idée de ce qui prend de la place. Existe-t-il une commande permettant de répertorier les tailles de répertoire actuelles, afin que je puisse parcourir et terminer dans le répertoire occupant tout l'espace?

    
posée Karl Morrison 04.05.2017 - 17:21
la source

11 réponses

68

Comme toujours sous Linux, il existe plus d’une façon de faire le travail. Toutefois, si vous devez le faire à partir de la CLI, voici ma méthode préférée:

Je commence par l'exécuter en tant que root ou avec sudo:

du -cha --max-depth=1 / | grep -E "M|G"

Le grep limite les lignes renvoyées à celles qui renvoient des valeurs comprises dans la plage des mégaoctets ou des gigaoctets. Si vos disques sont suffisamment gros, vous pouvez également ajouter |T pour inclure les montants en téraoctets. Vous pouvez obtenir des erreurs sur /proc , /sys et / ou /dev car ce ne sont pas de vrais fichiers sur le disque. Cependant, il devrait toujours fournir une sortie valide pour le reste des répertoires en racine. Une fois que vous avez trouvé les plus gros, vous pouvez ensuite exécuter la commande à l’intérieur de ce répertoire afin de mieux cerner le coupable. Ainsi, par exemple, si /var était le plus gros, vous pouvez le faire comme suit:

du -cha --max-depth=1 /var | grep -E "M|G"

Cela devrait vous mener aux enfants à problèmes!

Considérations supplémentaires

Bien que la commande ci-dessus fasse certainement l'affaire, j'ai quelques critiques constructives dans les commentaires ci-dessous, qui soulignent certaines choses que vous pouvez également inclure.

  1. Le grep que j'ai fourni peut avoir pour résultat la valeur occasionnelle "K" si le nom du répertoire ou du fichier a une majuscule G ou M. Si vous ne voulez absolument pas que l'un des répertoires K soit affiché vous voudriez améliorer votre jeu regex pour être plus créatif et complexe. par exemple. grep -E "^[0-9\.]*[MG]"
  2. Si vous savez quel lecteur est le problème et s'il comporte d'autres lecteurs montés que vous ne souhaitez pas perdre de temps, y compris dans votre recherche, vous pouvez ajouter l'indicateur -x à votre commande du . Description de la page de manuel de ce drapeau:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Vous pouvez trier le résultat de la commande du de sorte que la valeur la plus élevée se trouve en bas. Il suffit d’ajouter ceci à la fin de la commande: | sort -h

réponse donnée TopHat 04.05.2017 - 17:36
la source
59

Vous pouvez utiliser ncdu pour cela. Cela fonctionne très bien.

sudo apt install ncdu

    
réponse donnée Duncan 04.05.2017 - 17:28
la source
16

J'utilise cette commande

sudo du -aBM -d 1 . | sort -nr | head -20

Parfois, j'ai besoin de l'exécuter à partir du répertoire / , car j'ai placé quelque chose dans un emplacement étrange.

    
réponse donnée Charles Green 04.05.2017 - 17:25
la source
11

Il existe déjà de nombreuses bonnes réponses sur les moyens de trouver des répertoires prenant le plus d’espace. Si vous avez des raisons de croire que le problème principal est peu de gros fichiers, plutôt que de nombreux petits, vous pouvez utiliser quelque chose comme find / -size +10M .

    
réponse donnée Luca Citi 04.05.2017 - 22:21
la source
10

Je ne connais pas Ubuntu et je ne peux pas vérifier ma réponse, mais publiez ici ma réponse basée sur mon expérience d'administrateur unix il y a longtemps.

  1. Découvrez quel système de fichiers manque d'espace

    df -h
    

    listera tous les systèmes de fichiers, leur taille et leur espace libre. Vous ne perdez du temps que si vous étudiez des systèmes de fichiers disposant de suffisamment d'espace. Supposons que le système de fichiers complet est / myfilesystem. vérifiez la sortie df s'il y a des systèmes de fichiers montés sur les sous-répertoires de / myfilesystems. Si tel est le cas, les tâches suivantes doivent être adaptées à cette situation.

  2. Découvrez la quantité d'espace utilisée par les fichiers de ce système de fichiers

    du -sh /myfilesystem
    

    L'option -x peut être utilisée pour garantir que seuls les fichiers membres de ce système de fichiers sont pris en compte. Certaines variantes d'Unix (par exemple, Solaris) ne connaissent pas l'option -x pour du. Ensuite, vous devez utiliser certaines solutions de contournement pour trouver le du de votre système de fichiers.

  3. Maintenant, vérifiez si le du des fichiers visibles est approximativement la taille de l’espace utilisé affiché par df. Si tel est le cas, vous pouvez commencer à rechercher les fichiers / répertoires volumineux du système de fichiers / myfilesystem à nettoyer.

  4. pour trouver les plus grands sous-répertoires d'un répertoire /.../dir use

    du -sk /.../dir/*|sort -n
    

    l'option -k force du à produire le fichier sie en kilo-octets sans unité. Cela peut être la valeur par défaut sur certains systèmes. Ensuite, vous pouvez omettre cette option. Les plus gros fichiers / sous-répertoires seront affichés au bas de la sortie.

  5. Si vous avez trouvé un fichier / répertoire volumineux dont vous n’avez plus besoin, vous pouvez le supprimer de manière appropriée. Ne vous préoccupez pas des petits répertoires en haut de la sortie. Cela ne résoudra pas votre problème si vous les supprimez. Si vous n’avez toujours pas assez d’espace, vous pouvez répéter l’étape 4 dans les sous-répertoires généraux affichés en bas de la liste.

Mais que s'est-il passé si la sortie du n'est pas approximativement l'espace disponible affiché par df?

Si la sortie du est plus grande, vous avez oublié un sous-répertoire dans lequel un autre système de fichiers est monté. Si la sortie du est beaucoup plus petite, les fichiers som ne figurent dans aucun répertoire inspecté. Il peut y avoir différentes raisons à son phénomène.

  1. certains processus utilisent un fichier déjà supprimé. Par conséquent, ces fichiers ont été supprimés du répertoire et du ne peuvent pas les voir. Mais pour le système de fichiers, leurs blocs sont encore utilisés jusqu'à ce que les processus soient fermés. Vous pouvez essayer de trouver les processus pertinents (par exemple avec lsof) et les forcer à fermer ces fichiers (par exemple en arrêtant l'application ou en supprimant les processus). Ou vous redémarrez simplement votre ordinateur.

  2. il existe des fichiers dans des répertoires qui ne sont plus visibles car un autre système de fichiers est monté sur l'un de leurs répertoires parents. Donc, si vous avez un fichier / myfilesysem / subdir / bigfile et montez maintenant un autre système de fichiers sur / myfilesystem / subdir, vous ne pouvez plus voir ce fichier et

    du -shx /myfilesystem 
    

    signalera une valeur qui ne contient pas la taille de / myfilesystem / subdir / bigfile. Le seul moyen de savoir s’il existe de tels fichiers est de démonter / mon système de fichiers / subir et de vérifier avec

    ls -la /myfilesystem/subdir 
    

    s'il contient des fichiers.

  3. Il peut y avoir des types spéciaux de systèmes de fichiers qui utilisent / réservent de l'espace sur un disque qui n'est pas visible pour la commande ls. Vous avez besoin d’outils spéciaux pour l’afficher.

Outre cette manière systématique d’utiliser la commande du, vous pouvez en utiliser d’autres. Ainsi, vous pouvez utiliser la commande find pour rechercher des fichiers dont la taille est supérieure à une valeur fournie. Vous pouvez également rechercher des fichiers dont la taille est supérieure à celle que vous avez fournie ou qui ont été récemment créés ou qui portent un nom spécial (par exemple * .log, core, * .trc). Mais vous devriez toujours faire un df comme décrit dans 1 pour pouvoir travailler sur le bon système de fichiers

    
réponse donnée miracle173 05.05.2017 - 09:12
la source
7

Si vous souhaitez également ne pas utiliser de commande, voici une application: Filelight

Il vous permet de visualiser rapidement ce qui utilise l’espace disque de n’importe quel dossier.

    
réponse donnée Gabriel 05.05.2017 - 23:32
la source
5

Essayez de sudo apt-get autoremove pour supprimer les fichiers inutilisés si vous ne l'avez pas déjà fait

    
réponse donnée Donald Shahini 05.05.2017 - 14:36
la source
3

J'utilise souvent celui-ci

du -sh /*/

Ensuite, si je trouve de gros dossiers, je vais y accéder et faire des recherches plus approfondies

cd big_dir
du -sh */

Si nécessaire, vous pouvez également le trier automatiquement avec

du -s /*/ | sort -n
    
réponse donnée phuclv 05.05.2017 - 05:05
la source
2

Ce n'est pas vraiment une réponse, mais un addendum.

Vous manquez d’espace et vous ne pouvez pas installer ncdu à partir de la réponse de @erman.

Quelques suggestions

  • sudo apt clean all pour supprimer les packages que vous avez déjà téléchargés. SÉCURITAIRE
  • sudo rm -f /var/log/*gz purger les fichiers journaux de plus d'une semaine ou deux - ne supprimera pas les journaux les plus récents / actuels. SURTOUT SÉCURITAIRE
  • sudo lsof | grep deleted liste tous les fichiers ouverts, mais filtre ceux qui ont été supprimés du disque. FAIRLY SAFE
  • sudo rm /tmp/* supprime certains fichiers temporaires - si quelque chose les utilise, vous pouvez perturber un processus. PAS VRAIMENT QUE SÉCURITAIRE

Pour que lsof puisse renvoyer des lignes comme celle-ci:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Ne peut pas faire grand chose pour la ligne init, mais la deuxième ligne suggère que salt-minion a un fichier ouvert qui a été supprimé et les blocs de disque seront retournés une fois que tous les descripteurs de fichier sont fermés par un redémarrage du service.

Parmi les autres suspects courants, citons syslog / rsyslog / syslog-ng, squid, apache ou tout processus "lourd" exécuté par votre serveur.

    
réponse donnée Criggie 05.05.2017 - 07:11
la source
2

Je trouve particulièrement utile la sortie d'outils comme Filelight, mais, comme dans votre cas, sur les serveurs, aucune interface graphique n'est installée, mais la commande du est toujours disponible.

Ce que je fais normalement est:

  • écrit le résultat du dans un fichier ( du / > du_output.txt );
  • copier le fichier sur ma machine;
  • utilisez DuFS pour "monter" la sortie de du dans un répertoire temporaire; DuFS utilise FUSE pour créer un système de fichiers virtuel (= aucun fichier n’a été créé, c’est faux) selon le du output;
  • Exécuter Filelight ou un autre outil graphique sur ce répertoire temporaire.

Clause de non-responsabilité: j'ai écrit dufs - c'est précisément parce que je dois souvent savoir ce qui est superflu sur les disques sans ordinateur.

    
réponse donnée Matteo Italia 06.05.2017 - 18:57
la source
-1

Similaire à @TopHat, mais filtre certains fichiers s’ils ont M, G ou T dans le nom. Je ne crois pas qu'il manquera de taille dans la première colonne, mais il ne correspondra pas au nom du fichier, sauf si vous nommez les fichiers de manière créative.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Les commutateurs de ligne de commande ont expliqué ici car je ne savais pas ce que le c ou a fait.

    
réponse donnée user685769 05.05.2017 - 03:16
la source

Lire d'autres questions sur les étiquettes