df en linux no muestra el espacio libre correcto después de la eliminación del archivo

144

Tengo servidores de archivos que se utilizan para almacenar archivos. Los archivos pueden residir allí durante una semana o un año. Desafortunadamente, cuando elimino archivos del servidor, el dfcomando no refleja el espacio liberado. Finalmente, el servidor se llena ( dfmuestra el 99%) y mi script no envía más archivos allí, excepto que puede haber unas pocas docenas de GB de espacio libre allí.

Tengo noatimebandera en las particiones montadas si eso hace alguna diferencia.

Aminah Nuraini
fuente
¿Está sucediendo esto en una sola partición o en todas las particiones?
Khaled
Bueno, está sucediendo en mi partición de datos principal, que es la única que me importa, ya que solo escribo / elimino archivos en ella.
Por favor, ilumíneme con la solución, o un enlace a una.
¿Qué sistema (s) de archivos? DF hace una estadística del superbloque, puede ser que su sistema de archivos no esté actualizando el inodo sb. ¿Has intentado vaciar el caché?
frijoles
Usando ext4. ¿Cómo se limpian los cachés?

Respuestas:

237

Eliminar el nombre de archivo en realidad no elimina el archivo. Algún otro proceso mantiene el archivo abierto, lo que hace que no se elimine; reinicie o elimine ese proceso para liberar el archivo.

Utilizar

lsof +L1

para averiguar qué proceso está utilizando un archivo eliminado (no vinculado).

Ignacio Vazquez-Abrams
fuente
2
No se accedió a los archivos eliminados en más de un mes, y el único proceso que accede a ellos es nginx, por lo que es dudoso.
40
+1. Además, "lsof + L1" le dirá qué programa mantiene abiertos los archivos.
pehrs
44
como root ejecute "lsof -n | grep file", se sorprendería de cuánto tiempo pueden permanecer los archivos debido a que los procesos los mantienen abiertos por cualquier razón. Si todo lo demás falla, reinicie, me siento mal sugiriéndolo, pero definitivamente se asegurará de que nada se quede en el archivo. Por persona, lsof + L1 es probablemente la mejor manera de hacerlo.
ScottZ
3
¡Me acabas de salvar! Eliminé un archivo de registro 93G y no recuperé el espacio y no pude averiguar por qué. Gracias.
Luke Cousins
1
En la misma línea y en caso de que esto ayude a otros, borré un gran archivo nginx access.log, pero solo pude recuperar el espacio después de reiniciar nginx: service nginx restart
Nick
28

Como menciona Ignacio, eliminar el archivo no liberará espacio hasta que elimine los procesos que tienen identificadores abiertos para ese archivo.

Sin embargo, puede reclamar el espacio sin matar los procesos. Todo lo que necesita hacer es eliminar los descriptores de archivo.

Primero ejecute lsof | grep eliminado para identificar el proceso que contiene el archivo

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Luego ejecuta:

cd /proc/PID/fd

entonces

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

El "1" será el descriptor del archivo. Ahora escriba "> FD" para reclamar ese espacio

> 1

Es posible que deba repetir la operación si hay otros procesos que contienen el archivo.

Adrián Deccico
fuente
1
lo que hace el > FDhacer?
Pred
elimina el descriptor de archivo
Adrián Deccico
2
¿Este >comando tiene un nombre? Tuve que cambiar de zsh a bash para poder usarlo. ¿Es posible ejecutarlo en zsh?
Ariera
1
es una redirección de salida y, por lo tanto, trunca el archivo. El largo desde sería "echo -n> 1" o "verdadero> 1". Realmente no elimina el FD, solo apunta a un archivo vacío después.
eckes
8

Una posibilidad es que los archivos que eliminó tengan más referencias en el sistema de archivos. Si ha creado enlaces duros, varios nombres de archivo apuntarán a los mismos datos, y los datos (el contenido real) no se marcarán como libres / utilizables hasta que se hayan eliminado todas las referencias. Antes de eliminar archivos, ya sea stat (Entrada denominada Enlaces) o haga ls -l en ellos (debe ser la segunda columna).

Si resulta que los archivos están referenciados en otra parte, supongo que tendrá que usar ls -i los archivos para encontrar el número de inodo, y luego hacer una búsqueda con -inum <número de número de nodo> para encontrar el otras referencias a ese archivo (probablemente también desee usar -mount para permanecer dentro del mismo sistema de archivos).

Kjetil Joergensen
fuente
4

El archivo todavía está bloqueado por el proceso que lo abre. Para liberar espacio, siga estos pasos:

  1. Ejecute sudo lsof | grep deletedy vea qué proceso contiene el archivo. Resultado de ejemplo:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Mata el proceso usando sudo kill -9 {PID}. En la muestra anterior, el PID es 1623.

    $ sudo kill -9 1623
    
  3. Ejecute dfpara verificar si el espacio ya está liberado. Si todavía está lleno, tal vez necesite esperar unos segundos y verificar nuevamente.

Aminah Nuraini
fuente
4

Si la partición ha sido configurada para reservar cierta porción de espacio en disco solo para uso raíz, dfno incluirá este espacio disponible.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Incluso después de que se recupere el espacio eliminando archivos / directorios, el usuario no root no podrá escribir en una partición particular.

Puede verificar fácilmente si ese es su caso al intentar crear un archivo en un dispositivo como usuario root y no root.

Además, puede verificar la configuración del sistema de archivos ejecutando

tune2fs -l <device> | egrep "Block count|Reserved block count

y calculando el% real por su cuenta.

Para cambiar el disco% reservado para uso exclusivo de root, ejecute

tune2fs -m <percentage> <device>
luka5z
fuente
1

Las otras respuestas son correctas: si elimina un archivo y no se libera espacio, generalmente es porque el archivo todavía se mantiene abierto o hay otros enlaces duros.

Para ayudar en la resolución de problemas, use una herramienta que le indique dónde se está gastando el espacio en disco: puede usar dupara obtener una descripción general de hacia dónde va el espacio. Aún mejor, use una herramienta gráfica como xdiskusage (hay muchas como esta) para cazar al culpable. xdiskusage y sus amigos te permiten profundizar en los cerdos espaciales más grandes para descubrir a dónde va el espacio.

De esa manera, encontrará rápidamente archivos que aún ocupan espacio debido a un segundo enlace duro. También mostrará el espacio ocupado por archivos eliminados, pero abiertos (como (permiso denegado), creo, ya que no puede leer el nombre del archivo).

sleske
fuente
1

Como sé que muchos de ustedes están haciendo esto para redhat /vary descomprimir archivos esperando que el FS se reduzca, pero en cambio crece, solo asegúrese de mantener el reinicio de syslog. y

lsof -v file

te mostraría esto de todos modos.

usuario1802263
fuente
1
Esto realmente no agrega mucho; la respuesta aceptada cubrió la lógica detrás de eso en 2001. Cuando tenga 50 repeticiones, use comentarios si desea agregar calificadores a las respuestas existentes.
Andrew B
0

Una opción más: el disco podría estar lleno debido a un proceso que crea datos continuamente: registros, núcleos y similares. Es posible que el espacio se esté liberando pero se llene de inmediato. De hecho, he visto un caso así. dfen este caso simplemente no da la imagen del agujero. Use dupara aprender más.

Chen Levy
fuente
0

Estoy usando EXT2, FSCK me ayudó en esta situación. Pruebe shudown -F ahora, después de algunos reinicios y fscks, veo espacio medio usado.

Marcelo
fuente
1
Querido Marcelo, tu solución está incluida en la respuesta aceptada; y a veces no quieres reiniciar si no estás obligado a ...
Deer Hunter
-1

Para verificar qué archivos eliminados han ocupado la memoria, ingrese el comando

 $ sudo lsof | grep deleted

Mostrará los archivos eliminados que contienen memoria.

Luego mata el proceso con pid o name

$ sudo kill <pid>
$ df -h

compruebe ahora tendrá la misma memoria

Si no, escriba el comando a continuación para ver qué archivo está ocupando memoria

# cd /
# du --threshold=(SIZE)

mencione cualquier tamaño, mostrará qué archivos están ocupando por encima del umbral y elimine el archivo, encontrará la memoria retenida

Javeed Shakeel
fuente
-4

abra la terminal intente este comando df -Th luego use este comando sudo du -h --max-depth = 1 / en este comando encontrará detalles del uso del disco y luego abra como usuario root eliminar el archivo (root-local-share-trash) y borra tu archivo

rilson
fuente