desarrollo-web-br-bd.com

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 un año. Desafortunadamente, cuando elimino archivos del servidor, el comando df no refleja el espacio liberado. Finalmente, el servidor se llena (df muestra 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í.

Obtuve la bandera noatime en las particiones montadas si eso hace alguna diferencia.

157
user11350

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).

249

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

[[email protected] 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

[[email protected] 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.

29
Adrián Deccico

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 (debería 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 también).

8

Si la partición se ha configurado para reservar cierta porción de espacio en disco solo para uso raíz, df no incluirá este espacio como disponible.

[[email protected]]# 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>
6
luka5z

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

  1. Correr Sudo lsof | grep deleted y 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 df para verificar si el espacio ya está liberado. Si todavía está lleno, tal vez deba esperar unos segundos y verificar nuevamente.

4
Aminah Nuraini

Como sé que muchos de ustedes están haciendo esto por redhat en /var y archivos de compresión que esperan 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.

1
user1802263

Las otras respuestas son correctas: si elimina un archivo y no se libera espacio, generalmente es porque el archivo aún 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 de la unidad: puede usar du para obtener una visió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).

1
sleske

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

0
Marcellus

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í. df en este caso simplemente no da la imagen del agujero. Use du para obtener más información.

0
Chen Levy