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


Tengo servidores de archivos que se utilizan para almacenar archivos. Los archivos pueden residir allí durante una semana, o durante un año. Desafortunadamente, cuando elimino archivos del servidor, df comando no refleja el espacio liberado. Así que eventualmente, el servidor se llena (df muestra 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 noatime bandera en las particiones montadas si eso hace alguna diferencia.


107
2018-02-08 07:36


origen


¿Esto sucede 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 uno.
¿Qué sistemas de archivos? DF realiza una estadística del superbloque, puede ser que su sistema de archivos no esté actualizando el inodo sb. ¿Has intentado enjuagar caché? - beans
Utilizando ext4. ¿Cómo se vacían los cachés?


Respuestas:


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

Utilizar

lsof +L1

para averiguar qué proceso está utilizando un archivo eliminado (sin vincular).


181
2018-02-08 07:48



No se accedió a los archivos que se eliminaron en más de un mes, y el único proceso que accede a ellos es nginx, por lo que es dudoso.
+1. Además, "lsof + L1" le dirá qué programa mantiene abiertos los archivos. - pehrs
como root ejecute "lsof -n | grep file", se sorprenderá de cuánto tiempo pueden permanecer los archivos debido a que los procesos los mantienen abiertos por cualquier motivo. Si todo lo demás falla, reinicie, me siento mal al sugerirlo pero definitivamente se asegurará de que no haya nada en el archivo. Per pehrs, lsof + L1 es probablemente la mejor manera de hacerlo. - ScottZ
¡Me acabas de salvar! Se eliminó un archivo de registro 93G y no se recuperó el espacio y no se pudo averiguar por qué. Gracias. - Luke Cousins
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


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

Sin embargo, puedes recuperar el espacio sin matar los procesos. Todo lo que necesitas hacer es eliminar los descriptores de archivos.

Primero ejecuta 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 escribe "> FD" para reclamar ese espacio

> 1

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


21
2018-02-07 01:24



lo que hace el > FD ¿hacer? - Pred
elimina el descriptor de archivo - Adrián Deccico
Haz esto > comando tiene un nombre? Tuve que cambiar de zsh a bash para poder usarlo. ¿Es posible ejecutarlo en zsh? - ariera
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


Una posibilidad es que los archivos que eliminó tengan más referencias en el sistema de archivos. Si ha creado enlaces físicos, varios nombres de archivos apuntarán a los mismos datos, y los datos (el contenido real) no se marcarán como libres / utilizables hasta que se eliminen todas las referencias a ellos. Antes de eliminar archivos, haga una estadística (entrada denominada Enlaces) o haga ls -l en ellos (debería ser la segunda columna).

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


8
2018-02-08 10:01





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

  1. correr sudo lsof | grep deleted y ver qué proceso está sosteniendo 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. correr df para comprobar si el espacio ya está liberado. Si todavía está lleno, tal vez deba esperar unos segundos y volver a verificar.


3
2018-02-16 05:31





Si la partición se ha configurado para reservar cierta porción de espacio en disco solo para uso de la raíz, df No incluirá este espacio como 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 reclame el espacio mediante la eliminación de archivos / directorios, el usuario no root no podrá escribir en una partición en particular.

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

Adicionalmente puedes verificar la configuración del sistema de archivos ejecutando

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

y calculando el% real por tu cuenta.

Para cambiar el disco% reservado para uso de solo raíz, ejecute

tune2fs -m <percentage> <device>

2
2018-05-08 10:31





Las otras respuestas son correctas: si elimina un archivo y el espacio no se libera, generalmente se debe a que el archivo todavía se mantiene abierto o existen 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 el disco: Puede usar du para obtener una visión general de dónde va el espacio. Aún mejor, usa una herramienta gráfica como xdiskusage (hay muchos como este) para cazar al culpable. xdiskusage y tus amigos te permiten profundizar en los cerdos espaciales más grandes para encontrar a dónde va el espacio.

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


1
2018-02-08 10:11





Como sé que muchos de ustedes están haciendo esto por Red Hat en /var y gzipping los archivos que esperan que el FS se reduzca, pero en lugar de eso crece, solo asegúrese de realizar el reinicio de syslog. y

lsof -v file

Te mostraría esto de todos modos.


1
2018-03-23 15:02



Esto realmente no agrega mucho; la respuesta aceptada cubría la lógica detrás de eso en 2001. Cuando tenga 50 representantes, use comentarios si desea agregar calificadores a las respuestas existentes. - Andrew B