Dile a fs que libere espacio de los archivos eliminados AHORA

73

¿Hay alguna manera de decirle al núcleo que devuelva el espacio libre en el disco ahora? ¿Como escribir a algo en / proc /? Usando Ubuntu 11.10 con ext4.

Este es probablemente un tema antiguo y muy repetido. Después de presionar 0 espacio, solo me di cuenta de que mi editor no podía guardar los archivos de código fuente que he abierto, que para mi horror ahora tienen un tamaño de 0 bytes en la lista de carpetas, fui a eliminarlo.

Eliminé cientos de MB de archivos grandes tanto del usuario como de la raíz, y también hice algunos enlaces permanentes.

Justo antes de hacerlo, apt-get cleanhabía más de 900 MB en / var / cache / apt / archives, ahora solo hay 108 KB:

# du
108 /var/cache/apt/archives

Una hora después todavía no hay espacio libre y no puedo guardar mis preciosos archivos abiertos en el editor, pero observe la disparidad a continuación:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

¿Alguna sugerencia? Apagué algunos servicios / procesos, pero no estoy seguro de cómo verificar quién podría estar comiendo activamente el espacio en disco.

Más información

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096
Marcos
fuente
44
El sistema de archivos libera el espacio de inmediato. Sin embargo, la característica de bloques reservados de raíz de ext [234] y cómo el núcleo mantiene reservados los archivos abiertos puede dar la apariencia de espacio perdido.
hhaamu
Si tiene varios sistemas de archivos (paticiones), liberar espacio en uno no servirá de nada en el otro.
vonbrand
¿Por qué pude llenar la partición antes de que los bloques 5Go "reservados" se recuperen?
Psddp

Respuestas:

117

Verifique lsofsi hay archivos abiertos. El espacio no se liberará hasta que estén cerrados.

sudo /usr/sbin/lsof | grep deleted

le dirá qué archivos eliminados aún se mantienen abiertos.

Aleksandar Ivanisevic
fuente
Bueno. Me mostró algunos mysqldbloqueos en / tmp, pero muchos apport-gtusos de archivos extintos en / var / lib / apt / lists / partial / que aparentemente se han ido acumulando. Entonces podría killall apport-gtpero lo investigaré primero.
Marcos
1
Marcar como respuesta más cercana, aunque nunca realmente "devolvió" el espacio inmediatamente después de cerrar los identificadores / procesos de archivo que los utilizan. Buscando otros enfoques basados ​​en kernel / proc / fs.
Marcos
18
También puede usar lsof +L1(seleccione archivos abiertos que se han desvinculado).
Martin Fido
La información en esta respuesta es correcta, pero el problema que estaba teniendo el OP probablemente no fue causado por esto, sino por el espacio reservado raíz (que responde otra respuesta).
marcelm
37

Use lsofpara encontrar el archivo eliminado, pero abierto, que todavía consume espacio:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

Encuentre la entrada en /proc/<pid>/fd/ese cooresponds al identificador de archivo:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

Ahora, justo cat /dev/nullen el fd:

cat /dev/null > /proc/3446/fd/128

Tenga en cuenta que el inodo todavía está abierto, pero ahora es de longitud 0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
BillQ
fuente
55
Uso superfluo de cattruncar. En Bourne shell, simplemente > /proc/3446/fd/128servirá.
200_success
2
NO haga esto si se espera que su programa vuelva a leer cualquier parte del archivo en el futuro que pueda o no estar disponible en la memoria caché de la página.
Michael R. Hines
13

dfno mostrará el espacio reservado para root(incluso cuando se ejecuta como root):

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

Cómo cambiar el "porcentaje de bloque reservado"

  1. Reduce el espacio reservado al 4%

    # tune2fs -m4 /dev/sda4

df -h ahora mostró 45 millones gratis.

  1. Guarde mis archivos rápidamente
  2. Ponlo de nuevo al 5%

    # tune2fs -m5 /dev/sda4

Marcos
fuente
2
El espacio reservado para root es hoy en día casi siempre demasiado grande. Puede reducirlo a unos pocos por ciento. dfmuestra el espacio utilizable por el usuario normal. Como apt se ejecuta como root, el espacio reservado solo es útil para proteger contra los rellenos causados ​​por usuarios no root (= usuarios normales y servicios que tienen su propio usuario).
jofel
Estoy de acuerdo; Un mkfsestos días debe reservar por ejemplo. 5% o 300 MB, lo que sea menor . ¡Simplemente reajuste algunos de mis servidores al 2% y liberé los GB de nuevo!
Marcos
3
@jofel, no, no lo es. Cada vez que supera el 90% de utilización, comienza a obtener mucha fragmentación. Necesita liberar más espacio, no correr más cerca del 100% de utilización.
psusi
@psusi Eres verdad, gracias por tu comentario. Pero la oportunidad de usar (temporal) casi todo el espacio disponible como usuario normal podría ser realmente práctica y con ext4, las cosas ya no son tan malas, consulte unix.stackexchange.com/a/7965/15241
jofel
7

En Ubuntu, si eliminó archivos usando su papelera, es muy probable que sus archivos no se eliminen por completo.

Incluso después de vaciar la papelera, sus archivos permanecerán ~/.local/share/Trash/expungedhasta después de un reinicio y tal vez incluso más tiempo.

No he encontrado una buena razón para esto, pero si me quedo sin espacio, siempre rmelimino manualmente los archivos de basura eliminados.

kwarrick
fuente
1
Buen punto. Aunque soy uno de los que viven y mueren en la línea de comandos, y rara vez uso el administrador de archivos gráfico. Sin embargo, todavía no me he dado cuenta de que la carpeta borrada es un lugar oculto: un clic en la Papelera vacía siempre ha sido final y me devolvió el espacio en el disco cuando fue necesario.
Marcos
6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

Explicación: Salida de
Grep lsofpara extraer solo archivos eliminados. Sed extrae la identificación del proceso y la identificación del descriptor de archivo de cada línea, y crea una cadena en formato {pid}/fd/{fid}. Mientras realiza un bucle y no genera nada en cada archivo, configurándolos como vacíos.

Sepero
fuente
3
Recibí un error "error de sintaxis cerca del token inesperado` ('"
Majid Golshadi
5

Me pregunto si synces de alguna ayuda aquí, pero no debería serlo, como IIRC en la mayoría de los sistemas (¿"muchos"?), Los sistemas de archivos se sincronizan cada 30 s.

Verificaría el registro del kernel (así dmesg) para ver si algo desagradable está sucediendo y lo ejecutaré lsofpara ver si algún archivo grande y eliminado aún está abierto (en realidad, creo que los archivos eliminados se marcarán así en la lsofsalida).

Hay dos razones (una de ellas señalada en la pregunta que vincula) que pueden hacer que los archivos eliminados no liberen espacio.

  • archivos que no se eliminaron realmente: eliminó un archivo que está vinculado en otro lugar (más precisamente, unlink()editó un archivo con más de un enlace)
  • archivos que aún están abiertos: los archivos abiertos se guardan en libros usando, bueno, archivos, inodos en sí mismos, no entradas de directorio, si elimina la entrada, el inodo permanecerá allí mientras esté abierto.

Pero no sé de una razón específica por la que eso podría suceder con tantos archivos ...

njsg
fuente
syncNunca ayudó. En cuanto a los registros, es un sistema Ubuntu, por lo que es bastante defectuoso, por lo que sí, suelen ser ruidosos. apportse ha implementado a menudo porque cada actualización de apt-get se bloquea cada noche, aunque / var / crash tiene solo 77 MB. También noté que atdha inundado / var / log / syslog con líneas repetidas, como atd[8892]: File a0015c0152ab76 is in wrong format - abortingprobablemente porque los pocos archivos en / var / spool / cron / atspool eran todos de tamaño 0, por lo que el problema era circular, por supuesto
Marcos
1

CentOS 6.3 también hace lo que realmente no se vaciando-bote de basura cuando-vacias-bote de basura. No pude encontrar una manera de recuperar el espacio hasta que simplemente corrí rm -rf ~/.local/share/Trash/expunged/. Causó mucho rascarse la cabeza.

Biggles
fuente