No más espacio en disco: ¿cómo puedo encontrar lo que está ocupando el espacio?

81

Me he encontrado con un problema en uno de mis servidores que ejecutan 16.04: no queda espacio en disco.

No tengo idea de lo que está ocupando el espacio. ¿Hay un comando para enumerar los tamaños de directorio actuales, para que pueda recorrer y terminar en el directorio ocupando todo el espacio?

Karl Morrison
fuente
1
Compruebe el analizador de uso del disco
Pranal Narayan
@PranalNarayan Sin GUI, ya que está en mi servidor, me temo :(
Karl Morrison
1
Maldición, ahora fui a buscar, encontré este bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 y desearía que fuera algo.
Sam
1
wrt "no GUI, is a server": puede instalar la aplicación GUI (suponiendo que esté satisfecho con ella y que las bibliotecas de soporte estén en un servidor) y usarla en su pantalla local a través de X11-tunnelled-through-SSH con algo como export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(reemplace filelightcon su herramienta preferida). Por supuesto, sin absolutamente ningún espacio, si aún no tiene la herramienta instalada, ¡necesitará usar otra cosa de todos modos!
David Spillett
44
@DavidSpillett Como se indicó, no queda espacio en el servidor . Entonces no puedo instalar nada.
Karl Morrison

Respuestas:

93

Como siempre en Linux, hay más de una forma de hacer el trabajo. Sin embargo, si necesita hacerlo desde CLI, este es mi método preferido:

Empiezo ejecutando esto como root o con sudo:

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

El grep es limitar las líneas de retorno a aquellas que regresan con valores en el rango de Megabyte o Gigabyte. Si sus discos son lo suficientemente grandes, también puede agregarlos |Tpara incluir cantidades de terabytes. Puede obtener algunos errores en /proc, /sysy / o /devya que no son archivos reales en el disco. Sin embargo, aún debe proporcionar una salida válida para el resto de los directorios en la raíz. Después de encontrar los más grandes, puede ejecutar el comando dentro de ese directorio para reducir su camino hacia el culpable. Entonces, por ejemplo, si /varfuera el más grande, podría hacerlo así a continuación:

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

¡Eso debería llevarlos al problema, niños!

consideraciones adicionales

Si bien el comando anterior ciertamente hará el truco, tuve algunas críticas constructivas en los comentarios a continuación que señalaron algunas cosas que también podría incluir.

  1. Lo grepque proporcioné podría ocasionar que se devuelva el valor ocasional de "K" si el nombre del directorio o archivo tiene una G o una M mayúscula. Si no desea que se muestre ninguno de los directorios con valor de K, le gustaría subir tu juego regex para ser más creativo y complejo. p.ejgrep -E "^[0-9\.]*[MG]"
  2. Si sabe qué unidad es el problema y tiene otras unidades montadas encima que no desea perder el tiempo, incluso en su búsqueda, puede agregar el -xindicador a su ducomando. Descripción de la página de manual de esa bandera:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Puede ordenar la salida del ducomando para que el valor más alto esté en la parte inferior. Solo agregue esto al final del comando:| sort -h

Sombrero de copa
fuente
Esto es exactamente lo que hago.
ligereza corre en órbita
55
Su grep devuelve todas las carpetas con las letras M o G en sus nombres también, una expresión regular creativa debería golpear los números con un punto opcional + M | G, tal vez"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
44
Si sabe que el problema es una unidad, puede usar la -xopción para duquedarse en esa unidad (proporcionada en la línea de comandos). También puede canalizar sort -hpara ordenar correctamente los valores legibles por megabyte / gigabyte. Por lo general, dejaría la --max-depthopción y solo buscaría en toda la unidad de esta manera, clasificando adecuadamente para obtener las cosas más grandes en la parte inferior.
Muzer
1
@alexis Mi experiencia es que a veces termino con otra basura montada debajo del punto de montaje en el que estoy interesado (especialmente si es así /), y el uso -xme da la garantía de que no contaré mal las cosas. Si /está lleno y tiene un dispositivo montado por separado /homeo lo que sea, usarlo -xes prácticamente una necesidad para deshacerse de las cosas irrelevantes. Así que creo que es más fácil usarlo todo el tiempo, por si acaso.
Muzer
1
Si tiene el tipo que no necesita el grep.
OrangeDog
77

Puedes usar ncdupara esto. Funciona muy bien.

sudo apt install ncdu

ingrese la descripción de la imagen aquí

Duncan
fuente
34
Me estoy pateando a mí mismo ya que normalmente uso este programa, sin embargo, dado que no queda espacio no puedo instalarlo jaja
Karl Morrison
@KarlMorrison veo varias soluciones posibles, simplemente móntelo sobre sshfs en otra computadora y ejecute ncdu allí (suponiendo que ya tenga un servidor ssh en él ...), o si no tiene un servidor ssh, puede hacerlo a la inversa, instale ncdu en otro servidor y móntelo con sshfs y ejecute ncdu desde el soporte (suponiendo que ya tenga sshfs en el servidor), o si no tiene ninguno, ... si ncdu es un solo script, usted puede simplemente curl http://path/to/ncdu | sh, y se ejecutará en un caché stdin IO en memoria, pero eso requerirá algo de suerte. Probablemente también haya una manera de hacer un disco RAM
Hanshenrik
@KarlMorrison o puede iniciar una imagen en vivo de Linux e instalarla allí.
una vez instalado, escriba sudo ncdu /desde la línea de comandos. sudoporque si no pone sudo, no informará los tamaños de las carpetas propiedad de root, y /porque si no escribe eso solo informará de forma recusiva desde la carpeta en la que se encuentra
Max Carroll
19

Yo uso este comando

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

Ocasionalmente, necesito ejecutarlo desde el /directorio, ya que he colocado algo en una ubicación extraña.

Charles Green
fuente
¡Te da un +1 para que funcione! Sin embargo, la solución TopHats en realidad lee mi disco más rápido.
Karl Morrison
A menudo me resulta más útil hacer esto sin el -d 1interruptor (y generalmente con en lesslugar de head -20), para obtener una lista completa recursivamente enumerada de todos los archivos y directorios ordenados por el espacio que consumen. De esa manera, si veo un directorio que ocupa mucho espacio, simplemente puedo desplazarme hacia abajo para ver si la mayor parte del espacio está realmente ocupado por algún archivo o subdirectorio específico. Es una buena manera de encontrar algunos archivos y directorios innecesarios para eliminar para liberar espacio: simplemente desplácese hacia abajo hasta que vea algo que está seguro de que no desea conservar, elimínelo y repita.
Ilmari Karonen
@KarlMorrison no lo lee más rápido, es solo que sortespera a que se complete la salida antes de comenzar la salida.
Muru
@muru Ah, está bien. Sin embargo, obtengo información más rápido para poder comenzar a recorrer más rápido si ese es un mejor término.
Karl Morrison
13

Ya hay muchas buenas respuestas sobre formas de encontrar directorios que ocupan la mayor parte del espacio. Si tiene razones para creer que el problema principal son pocos archivos grandes, en lugar de muchos pequeños, podría usar algo como esto find / -size +10M.

Luca Citi
fuente
11

No conozco Ubuntu y no puedo verificar mi respuesta, pero publico aquí mi respuesta en función de mi experiencia como administrador de Unix hace mucho tiempo.

  1. Descubre qué sistema de archivos se queda sin espacio

    df -h
    

    enumerará todo el sistema de archivos, su tamaño y su espacio libre. Solo pierdes tiempo si investigas los sistemas de archivos que tienen suficiente espacio. Suponga que el sistema de archivos completo es / myfilesystem. compruebe la salida de df si hay sistemas de archivos montados en subdirecciones de / myfilesystems. Si es así, los siguientes speps deben adaptarse a esta situación.

  2. Descubra cuánto espacio usan los archivos de este sistema de archivos

    du -sh /myfilesystem
    

    La opción -x puede usarse para garantizar que solo se tengan en cuenta los archivos que son miembros de este sistema de archivos. Algunas variantes de Unix (por ejemplo, Solaris) no conocen la opción -x para du. Luego debe usar algunas soluciones para encontrar el du de su sistema de archivos.

  3. Ahora verifique si el du de los archivos visibles es aproximadamente del tamaño del espacio utilizado mostrado por df. Si es así, puede comenzar a buscar los archivos / directorios grandes del sistema de archivos / myfilesystem para limpiar.

  4. para encontrar los subdirectorios más grandes de un directorio /.../dir use

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

    La opción -k obliga a du a generar el sie en kilobytes sin ninguna unidad. Este puede ser el valor predeterminado en algunos sistemas. Entonces puedes omitir esta opción. Los archivos / subdirectorios más grandes se mostrarán en la parte inferior de la salida.

  5. Si ha encontrado un archivo / directorio grande que ya no necesita, puede eliminarlo de la manera adecuada. No te preocupes por los pequeños directorios en la parte superior de la salida. No resolverá su problema si los elimina. Si aún no tiene suficiente espacio, puede repetir el paso 4 en los subdirectorios más grandes que se muestran al final de la lista.

Pero, ¿qué sucede si la salida du no es aproximadamente el espacio disponible que muestra df?

Si la salida du es mayor, entonces se ha perdido un subdirectorio donde está montado otro sistema de archivos. Si la salida du es mucho más pequeña, los archivos som no se muestran en ningún directorio que inspeccione. Puede haber diferentes razones para sus fenómenos.

  1. Algunos procesos están utilizando un archivo que ya fue eliminado. Por lo tanto, estos archivos se eliminaron del directorio y no pueden verlos. Pero para el sistema de archivos, sus bloques siguen en uso hasta que los procesos cierran los archivos. Puede intentar averiguar los procesos relevantes (por ejemplo, con lsof) y obligarlos a cerrar estos archivos (por ejemplo, deteniendo la aplicación o eliminando los procesos). O simplemente reinicia su máquina.

  2. hay archivos en los directorios que ya no son visibles porque en uno de sus directorios principales se monta otro sistema de archivos. Entonces, si tiene un archivo / myfilesysem / subdir / bigfile y ahora monta otro sistema de archivos en / myfilesystem / subdir, ya no podrá ver este archivo y

    du -shx /myfilesystem 
    

    informará un valor que no contiene el tamaño de / myfilesystem / subdir / bigfile. La única forma de averiguar si existen dichos archivos es desmontar / myfilesystem / subir y consultar con

    ls -la /myfilesystem/subdir 
    

    si contiene archivos

  3. Puede haber tipos especiales de sistemas de archivos que usan / reservan espacio en un disco que no es visible para el comando ls. Necesita herramientas especiales para mostrar esto.

Además de esta forma sistemática de usar el comando du, hay otras que puedes usar. Por lo tanto, puede usar el comando find para buscar archivos que sean más grandes que algún valor que proporcione, puede buscar archivos que sean más grandes que algún valor que proporcione o que se hayan creado recientemente o tengan un nombre especial (por ejemplo, * .log, core, * .trc). Pero siempre debe hacer un df como se describe en 1 para trabajar en el sistema de archivos correcto

milagro173
fuente
En un servidor ocupado no siempre se pueden desmontar cosas. Pero puede enlazar el montaje del directorio superior a una ubicación temporal y no incluirá los otros montajes y permitirá el acceso a los archivos ocultos.
Zan Lynx
Antes de systemd, a menudo tenía fallas de montaje, lo que llenaba el / mount con basura. Escribir una copia de seguridad en / mnt / backup sin la unidad USB conectada, por ejemplo. Ahora me aseguro de que esas unidades de trabajo tengan requisitos de montaje.
Zan Lynx
@ZanLynx Gracias, nunca había oído de montaje de vínculos antes
miracle173
@ZanLynx: no solo en servidores ocupados. Imagine que tiene /tmpun sistema de archivos separado (por ejemplo, un tmpfs) y algo creó archivos /tmpantes de que se convirtiera en un punto de montaje para un sistema de archivos diferente. Ahora estos archivos se encuentran en el sistema de archivos raíz, sombreados por un punto de montaje y no puede acceder a ellos sin reiniciar el modo de recuperación (que no se procesa /etc/fstab) o, como sugiere, un montaje de enlace.
David Foerster
9

En caso de que también esté interesado en no usar un comando, aquí hay una aplicación: Filelight

Le permite visualizar rápidamente qué está utilizando el espacio en disco en cualquier carpeta.

ingrese la descripción de la imagen aquí

Gabriel
fuente
Es un servidor en el que utilizo SSH, sin GUI.
Karl Morrison
@KarlMorrison Creo que hay formas de ejecutar programas GUI a través de ssh, pero esa es una idea para más adelante cuando tenga espacio para instalar paquetes
Xen2050
@David Oh, sí, estoy tratando de salir de eso. Solía ​​ser necesario en otra plataforma que utilicé. Arreglaré ese comentario.
@Karl sí, es fácil si X ya está instalado en el cliente: ssh -X <your host>y luego ejecuta tu programa desde la línea de comandos
@MarkYisri el punto es que necesitas instalar el programa y sus dependencias. Y el caso de Filelight requiere al menos KDElibs y Qt, que no son realmente pequeños. Vea, por ejemplo, esta página para el paquete de Ubuntu Filelight , observe cuántas dependencias tiene.
Ruslan
5

Intente sudo apt-get autoremoveeliminar los archivos no utilizados si aún no lo ha hecho.

Donald Shahini
fuente
1
Ya lo hice antes :( ¡Pero buena idea para los demás!
Karl Morrison
3

A menudo uso este

du -sh /*/

Luego, si encuentro algunas carpetas grandes, lo cambiaré y haré más investigaciones

cd big_dir
du -sh */

Si es necesario, también puede ordenarlo automáticamente con

du -s /*/ | sort -n
phuclv
fuente
2

No es realmente una respuesta, sino un apéndice.

Se te acaba el espacio y no puedes instalar ncdu a partir de la respuesta de @erman.

Algunas sugerencias

  • sudo apt clean allpara eliminar paquetes que ya ha descargado. SEGURO
  • sudo rm -f /var/log/*gzpurgar archivos de registro anteriores a una o dos semanas: no eliminará los registros más recientes / actuales. MUY SEGURO
  • sudo lsof | grep deletedenumere todos los archivos abiertos, pero filtre a los que se han eliminado del disco. BASTANTE SEGURO
  • sudo rm /tmp/*elimine algunos archivos temporales; si algo los está utilizando, podría alterar un proceso. NO ES TAN SEGURO

Que `uno de ellos puede devolver líneas como esta:

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)

No se puede hacer mucho por la línea de inicio, pero la segunda línea sugiere que salt-minion tiene un archivo abierto que se eliminó, y los bloques de disco se devolverán una vez que se reinicien todos los identificadores de archivos.

Otros sospechosos comunes aquí incluirían syslog / rsyslog / syslog-ng, squid, apache o cualquier proceso que ejecute su servidor que sea "pesado".

Criggie
fuente
2

Encuentro particularmente valioso el resultado de herramientas como Filelight, pero, como en su caso, en los servidores normalmente no hay GUI instalada, pero el ducomando siempre está disponible.

Lo que normalmente hago es:

  • escribe la dusalida en un archivo ( du / > du_output.txt);
  • copiar el archivo en mi máquina;
  • se usa DuFSpara "montar" la dusalida en un directorio temporal; DuFSusa FUSE para crear un sistema de archivos virtual (= no se crean realmente archivos, todo es falso) de acuerdo con la dusalida;
  • ejecute Filelight u otra herramienta GUI en este directorio temporal.

Descargo de responsabilidad: escribí dufs, exactamente porque a menudo tengo que averiguar qué ocupa el espacio en disco en las máquinas sin cabeza.

Matteo Italia
fuente
Podrías simplemente ordenar -n du_output.txt
Zan Lynx
La visualización gráfica del espacio utilizado me parece más intuitiva.
Matteo Italia
-1

Similar a @TopHat, pero filtra algunos archivos si tienen M, G o T en el nombre. No creo que pierda tamaño en la primera columna, pero no coincidirá con el nombre del archivo a menos que nombre los archivos de manera creativa.

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

Los interruptores de la línea de comando se explican aquí, ya que no sabía qué hacía el c o a.

usuario685769
fuente