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

82

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?

Karl Morrison
la source
1
Vérifiez l'analyseur d'utilisation du disque
Pranal Narayan
@PranalNarayan Pas de GUI car c'est sur mon serveur, j'ai bien peur :(
Karl Morrison,
1
Bon sang , maintenant que je cherchais, j'ai trouvé ceci bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 et j'aimerais que ce soit une chose.
Sam
1
wrt "no GUI, c’est un serveur": vous pouvez installer l’application GUI (en supposant que vous en soyez satisfait et que les bibliothèques de support soient sur un serveur) et l’utiliser est sur votre écran local via X11-tunnelled-through-SSH avec quelque chose comme export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(remplacez filelightpar votre outil préféré). Bien sûr, avec absolument aucun espace disponible, si vous n'avez pas déjà installé l'outil, vous devrez quand même utiliser quelque chose d'autre!
David Spillett
4
@DavidSpillett Comme indiqué, il ne reste plus d'espace sur le serveur . Donc je ne peux rien installer.
Karl Morrison

Réponses:

95

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 |Tdes montants en téraoctets. Vous risquez d’obtenir des erreurs sur /proc, /syset / ou /devpuisque 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 /varvous étiez le plus gros, vous pouvez 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

Tandis que la commande ci-dessus va certainement faire 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 grepI fourni pourrait entraîner la valeur occasionnelle « K » étant retourné si le nom du répertoire ou fichier a un G majuscule ou M. Si vous ne voulez absolument pas des répertoires d'une valeur K Révéler que vous voudriez en votre jeu regex pour être plus créatif et complexe. par exemplegrep -E "^[0-9\.]*[MG]"
  2. Si vous savez quel lecteur est le problème et s'il contient d'autres lecteurs montés que vous ne voulez pas perdre de temps, y compris dans votre recherche, vous pouvez ajouter l' -xindicateur à votre ducommande. 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 ducommande de sorte que la valeur la plus élevée soit en bas. Il suffit d’ajouter ceci à la fin de la commande:| sort -h

Haut-de-forme
la source
C'est exactement ce que je fais.
Courses de légèreté avec Monica
5
Votre grep renvoie également tous les dossiers avec les lettres M ou G dans leurs noms. Une expression rationnelle créative doit taper des chiffres avec un point facultatif + M | G, peut"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
4
Si vous savez que le problème est lié à un lecteur, vous pouvez utiliser l' -xoption permettant de durester sur ce lecteur (fourni sur la ligne de commande). Vous pouvez également effectuer un sort -htri direct des valeurs lisibles par l'homme en mégaoctets / gigaoctets. Je laisserais généralement cette --max-depthoption de côté et chercherais tout le disque de cette façon, en triant de manière appropriée pour obtenir les choses les plus importantes en bas.
Muzer
1
@ alexis Mon expérience est que je finis parfois avec d'autres ordures montées en dessous du point de montage qui m'intéresse (surtout si c'est le cas /), et en -xme donnant la garantie de ne pas me tromper de choses. Si vous êtes /plein et que vous avez un montage séparé /homeou autre, l’utilisation -xest quasiment une nécessité pour vous débarrasser des éléments non pertinents. Donc, je trouve que c'est juste plus facile de l'utiliser tout le temps, juste au cas où.
Muzer
1
Si vous en avez le genre, vous n'avez pas besoin du grep.
Cessez de nuire à Monica
77

Vous pouvez utiliser ncdupour cela. Il fonctionne très bien.

sudo apt install ncdu

entrez la description de l'image ici

Duncan
la source
34
Je me donne un coup de pied alors que j'utilise normalement ce programme. Cependant, comme il n'y a plus d'espace disponible, je ne peux pas l'installer. Haha
Karl Morrison
@KarlMorrison je vois plusieurs solutions possibles, montez-le simplement sur sshfs sur un autre ordinateur et lancez ncdu là-bas (en supposant que vous avez déjà un serveur ssh dessus) - ou si vous n'avez pas de serveur ssh dessus, vous pouvez le faire inversement, installez ncdu sur un autre serveur et montez-le avec sshfs et exécutez ncdu à partir du montage (en supposant que vous avez déjà sshfs sur le serveur) - ou si vous n’avez pas l’un, ... si ncdu est un script unique, vous peut simplement curl http://path/to/ncdu | sh, et il fonctionnera dans un cache stine IO en mémoire, mais cela nécessitera un peu de chance. il y a probablement un moyen de faire un disque
virtuel
@KarlMorrison ou vous pouvez démarrer une image en direct de Linux et l'installer à l'intérieur.
une fois installé, tapez en sudo ncdu /ligne de commande. sudoparce que si vous ne mettez pas sudo, il ne signalera pas la taille des dossiers appartenant à la racine, et /parce que si vous ne tapez pas, il ne signalera que de manière récurrente vers le bas du dossier dans lequel vous vous trouvez
Max Carroll
19

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 étrange.

Charles Green
la source
En vous donnant un +1 pour que cela fonctionne! Cependant, la solution TopHats lit mon disque plus rapidement!
Karl Morrison
Je trouve souvent plus utile de faire cela sans le -d 1commutateur (et généralement avec lessau lieu de head -20), de façon à obtenir une liste complète énumérée de manière récursive de tous les fichiers et répertoires triés par l'espace qu'ils consomment. Ainsi, si je vois un répertoire occuper beaucoup d’espace, je peux simplement faire défiler vers le bas pour voir si la plus grande partie de l’espace est effectivement occupée par un fichier ou un sous-répertoire spécifique. C'est un bon moyen de rechercher des fichiers et des répertoires inutiles à supprimer pour libérer de l'espace: faites simplement défiler l'écran jusqu'à ce que vous voyiez quelque chose que vous ne voulez pas conserver, supprimez-le et répétez l'opération.
Ilmari Karonen
@KarlMorrison, il ne le lit pas plus rapidement, il sortattend simplement que la sortie soit terminée avant de commencer la sortie.
Muru
@muru Ah bien. Cependant, je reçois des informations plus rapidement afin de pouvoir commencer plus rapidement si le terme est meilleur!
Karl Morrison
13

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 penser que le problème principal est le nombre de gros fichiers plutôt que de nombreux petits, vous pouvez utiliser quelque chose du genre find / -size +10M.

Luca Citi
la source
11

Je ne connais pas Ubuntu et je ne peux pas vérifier ma réponse, mais postez 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 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 (par exemple, Solaris) 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 tuant 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

miracle173
la source
Sur un serveur occupé, vous ne pouvez pas toujours démonter des objets. Mais vous pouvez lier le répertoire supérieur à un emplacement temporaire. Les autres montages ne seront pas inclus et l'accès aux fichiers cachés sera autorisé.
Zan Lynx
Avant Systemd, les échecs de montage entraînaient souvent le remplissage de / mount avec la corbeille. Écrire une sauvegarde sur / mnt / backup sans connecter le lecteur USB, par exemple. Maintenant, je m'assure que ces unités de travail ont des exigences de montage.
Zan Lynx
@ZanLynx Merci, je jamais entendu parler de supports bind avant
miracle173
@ZanLynx: Pas seulement sur des serveurs occupés. Imaginez que vous ayez /tmpun système de fichiers séparé (par exemple, un fichier tmpfs) et que quelque chose ait créé des fichiers /tmpavant de devenir un point de montage sur un autre système de fichiers. Désormais, ces fichiers se trouvent dans le système de fichiers racine, ombragés par un point de montage et vous ne pouvez pas y accéder sans redémarrer en mode de récupération (ce qui ne permet pas de traitement /etc/fstab) ou, comme vous le suggérez, un montage lié.
David Foerster
9

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.

entrez la description de l'image ici

Gabriel
la source
C'est un serveur dans lequel je suis SSH, sans interface graphique.
Karl Morrison
@KarlMorrison Je pense qu'il y a moyen d'exécuter des programmes d'interface graphique sur ssh, mais c'est une idée pour plus tard, quand vous aurez de la place pour installer des paquets
Xen2050
@ David Oh oui, j'essaie de me sortir de ça. Il était nécessaire sur une autre plate-forme que j'ai utilisée. Je vais réparer ce commentaire.
@ Karl oui, c'est facile si X est déjà installé sur le client: ssh -X <your host>puis exécutez votre programme à partir de la ligne de commande
@MarkYisri le fait est que vous devez installer le programme et ses dépendances. Et le cas de Filelight nécessite au moins KDElibs et Qt, qui ne sont pas vraiment petits. Voir par exemple cette page pour le paquet filelight Ubuntu , notez le nombre de dépendances dont il dispose.
Ruslan
5

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

Donald Shahini
la source
1
Déjà fait cela avant :( Mais bonne idée pour les autres!
Karl Morrison
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 faire trier automatiquement avec

du -s /*/ | sort -n
phuclv
la source
2

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 allsupprimer les paquets que vous avez déjà téléchargés. SÛR
  • sudo rm -f /var/log/*gzpurger 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 deletedré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 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 autre processus exécuté par votre serveur qui est "lourd".

Criggie
la source
2

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

Ce que je fais normalement c'est:

  • écrire la dusortie dans un fichier ( du / > du_output.txt);
  • copier le fichier sur ma machine;
  • utiliser DuFSpour "monter" la dusortie dans un répertoire temporaire; DuFSutilise FUSE pour créer un système de fichiers virtuel (= aucun fichier n'est créé, tout est faux) en fonction du durésultat;
  • Exécutez Filelight ou un autre outil graphique sur ce répertoire temporaire.

Clause de non-responsabilité: j’ai écrit dufs- justement parce que je dois souvent savoir ce qui optimise l’espace disque sur des machines sans tête.

Matteo Italia
la source
Vous pouvez simplement trier -n du_output.txt
Zan Lynx
Je trouve l'affichage graphique de la manière spatiale utilisée plus intuitif.
Matteo Italia
-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 sont expliqués ici car je ne savais pas ce que c ou a faisait.

utilisateur685769
la source