web-dev-qa-db-fra.com

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

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 occupe l'espace. Existe-t-il une commande pour répertorier les tailles de répertoire actuelles, afin que je puisse parcourir et finir dans le répertoire occupant tout l'espace?

71
Karl Morrison

Comme toujours sous Linux, il y a 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 exécuter ceci en tant que root ou avec Sudo:

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

Le grep consiste à limiter les lignes renvoyées à celles qui renvoient avec des valeurs comprises dans la plage des mégaoctets ou des gigaoctets. Si vos disques sont suffisamment volumineux, 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 pourriez le faire comme suit:

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

Cela devrait vous conduire aux enfants à problèmes!

Considérations supplémentaires

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

  1. Le grep que j'ai fourni peut entraîner le renvoi occasionnel de la valeur "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 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 qu'il contient d'autres lecteurs montés que vous ne voulez 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 la sortie de la commande du de sorte que la valeur la plus élevée soit en bas. Il suffit d’ajouter ceci à la fin de la commande: | sort -h

84
TopHat

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

Sudo apt install ncdu

enter image description here

65
Duncan

J'utilise cette commande

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

De temps en temps, je dois l'exécuter à partir du répertoire /, car j'ai placé quelque chose dans un emplacement impair.

17
Charles Green

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 fichiers volumineux, plutôt que plusieurs petits, vous pouvez utiliser quelque chose comme find / -size +10M.

13
Luca Citi

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 ya 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 existe des systèmes de fichiers montés sur des sous-répertoires de/myfilesystems. Si tel est le cas, les tâches suivantes doivent être adaptées à cette situation.

  2. Découvrez combien d'espace est utilisé 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 (Solaris, par exemple) ne connaissent pas l'option -x pour du. Ensuite, vous devez utiliser des solutions de contournement pour trouver le du de votre système de fichiers.

  3. Maintenant, vérifiez si le 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. trouver les plus grands sous-répertoires d'un répertoire /.../dir

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

    l'option -k oblige du à produire le 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 fichiers/sous-répertoires les plus volumineux 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 embêtez pas sur les 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 se passe-t-il 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 machine.

  2. il y a des fichiers dans des répertoires qui ne sont plus visibles car sur l'un de leurs répertoires parents, un autre système de fichiers est monté. 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.

En plus de cette manière systématique en utilisant la commande du, vous pouvez en utiliser d’autres. Vous pouvez donc 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

10
miracle173

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.

enter image description here

9
Gabriel

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

5
Donald Shahini

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 faire trier automatiquement avec

du -s /*/ | sort -n
3
phuclv

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 c'est:

  • écrire la sortie du dans un fichier (du / > du_output.txt);
  • copier le fichier sur ma machine;
  • utilisez DuFS pour "monter" la sortie du dans un répertoire temporaire; DuFS utilise Fuse pour créer un système de fichiers virtuel (= aucun fichier n'est créé, tout est faux) conformément à la sortie du;
  • exécutez Filelight ou un autre outil graphique sur ce répertoire temporaire.

Disclaimer: J'ai écrit dufs - justement parce que je dois souvent savoir ce qui ne fonctionne pas sur le disque sur des machines sans tête.

2
Matteo Italia

Pas vraiment une réponse - mais un addenda.

Vous êtes vraiment à court 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ÛR
  • 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. LE PLUS SÛR
  • Sudo lsof | grep deleted répertorie tous les fichiers ouverts, mais filtrez ceux qui ont été supprimés du disque. FAIRLY SAFE
  • Sudo rm /tmp/* supprimer des fichiers temporaires - si quelque chose les utilise, vous pouvez perturber le processus. PAS VRAIMENT QUE SÉCURITAIRE

Que `lsof on puisse retourner des lignes comme ceci:

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 d'initialisation, mais la deuxième ligne suggère que salt-minion a un fichier ouvert qui a été supprimé et les blocs de disque seront renvoyé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.

2
Criggie