Diga ao fs para liberar espaço dos arquivos excluídos AGORA

73

Existe uma maneira de dizer ao kernel para devolver o espaço livre em disco agora? Como escrever para algo em / proc /? Usando o Ubuntu 11.10 com ext4.

Este é provavelmente um tema antigo e muito repetido. Depois de atingir o espaço 0, notei apenas quando meu editor não pôde salvar os arquivos de código-fonte que eu abri, que para meu horror agora têm tamanho de 0 byte na listagem de pastas, fui para uma exclusão.

Excluí centenas de MB de arquivos grandes do usuário e da raiz, e também fiz alguns hardlinks.

Pouco antes, apt-get cleanhavia mais de 900 MB em / var / cache / apt / archives, agora existem apenas 108 KB:

# du
108 /var/cache/apt/archives

Uma hora depois, ainda não há espaço livre e não consigo salvar meus preciosos arquivos abertos no editor, mas observe a disparidade abaixo:

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

Alguma sugestão? Desliguei alguns serviços / processos, mas não sei como verificar quem pode estar consumindo ativamente o espaço em disco.

Mais informações

# 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
fonte
4
O sistema de arquivos libera o espaço imediatamente. No entanto, o recurso de blocos reservados à raiz do ext [234] e como o kernel mantém os arquivos abertos reservados podem dar a aparência de espaço perdido.
hhaamu
Se você tiver vários sistemas de arquivos (patições), liberar espaço em um não fará nenhum bem no outro.
21414 vonbrand
Por que fui capaz de preencher a partição antes que os blocos "reservados" 5Go se recuperassem?
Psddp

Respostas:

117

Verifique com lsofse há arquivos mantidos abertos. O espaço não será liberado até que seja fechado.

sudo /usr/sbin/lsof | grep deleted

lhe dirá quais arquivos excluídos ainda estão abertos.

Aleksandar Ivanisevic
fonte
Boa. Me mostrou alguns mysqldbloqueios em / tmp, mas muitos apport-gtusos de arquivos extintos em / var / lib / apt / lists / parcial / que aparentemente estão se acumulando. Então eu poderia, killall apport-gtmas vou investigar primeiro.
Marcos
11
Marcar como resposta mais próxima, embora nunca tenha "devolvido" o espaço imediatamente após o fechamento de identificadores / processos de arquivo usando-os. Procurando outras abordagens baseadas em kernel / proc / fs.
Marcos
18
Você também pode usar lsof +L1(selecione os arquivos abertos que foram desvinculados).
Martin Fido 24/05
As informações nesta resposta estão corretas, mas o problema que o OP estava tendo provavelmente não foi causado por isso, mas pelo espaço reservado raiz (que uma outra resposta aborda).
marcelm
37

Use lsofpara encontrar o arquivo excluído, mas aberto, que ainda consome espaço:

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

Localize a entrada /proc/<pid>/fd/nesse campo correspondente ao tratamento de arquivos:

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

Agora, apenas cat /dev/nullno fd:

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

Observe que o inode ainda está aberto, mas agora tem 0 comprimento

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
BillQ
fonte
5
Uso supérfluo de catpara truncar. No shell Bourne, apenas > /proc/3446/fd/128serve.
200
2
NÃO faça isso se for esperado que seu programa releia qualquer parte do arquivo no futuro que possa estar ou não disponível no cache da página.
Michael R. Hines
13

dfnão mostrará o espaço reservado para root(mesmo quando executado como root):

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

Como alterar "porcentagem de bloco reservado"

  1. Reduza o espaço reservado para 4%

    # tune2fs -m4 /dev/sda4

df -h agora mostrou 45 milhões grátis.

  1. Salvei meus arquivos rapidamente
  2. Coloque de volta para 5%

    # tune2fs -m5 /dev/sda4

Marcos
fonte
2
Atualmente, o espaço reservado para raiz é quase sempre muito grande. Você pode reduzi-lo para alguns poucos por cento. dfexibe o espaço utilizável do usuário normal. Como o apt é executado como root, o espaço reservado é útil apenas para proteção contra preenchimentos causados ​​por usuários não root (= usuários e serviços normais que possuem seu próprio usuário).
Jofel
Concordo; e mkfsesses dias devem reservar, por exemplo. 5% ou 300 MB, o que for menor . Acabei de voltar a sintonizar alguns dos meus servidores para 2% e liberar GBs de volta!
Marcos
3
@ jofel, não, não é. Sempre que você ultrapassa 90% de utilização, começa a obter muita fragmentação. Você precisa liberar mais espaço, para não correr mais perto da utilização de 100%.
psusi
@psusi Você é verdadeiro, obrigado pelo seu comentário. Mas a oportunidade de usar (temporária) de espaço quase todo disponível como usuário normal pode ser muito prático e com ext4, as coisas não são mais assim tão mau, ver unix.stackexchange.com/a/7965/15241
Jofel
7

No Ubuntu, se você excluiu arquivos usando sua lixeira, é mais provável que seus arquivos não sejam completamente removidos.

Mesmo depois de esvaziar sua lixeira, seus arquivos permanecerão ~/.local/share/Trash/expungedaté depois de uma reinicialização e talvez até mais.

Não encontrei um bom motivo para isso, mas, se ficar sem espaço, sempre manualmente rmos arquivos de lixo eliminados.

kwarrick
fonte
11
Bom ponto. Mesmo sendo um dos que vivem e morrem pela linha de comando, raramente uso o gerenciador de arquivos gráficos. No entanto, ainda não notei a pasta excluída como um esconderijo - um clique em Empty Trash sempre foi final e retornava meu espaço em disco quando necessário.
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

Explicação: Saída
Grep lsofpara extrair apenas arquivos excluídos. Sed extrair a identificação do processo e a identificação do filedescriptor de cada linha e criar uma string no formato {pid}/fd/{fid}. Enquanto loop e saída nada para cada arquivo, definindo-os como vazio.

Sepero
fonte
3
Eu recebi um erro "erro de sintaxe próximo ao token inesperado` ('"
Majid Golshadi 8/17/17
5

Gostaria de saber se syncé de alguma ajuda aqui - mas não deveria ser, como o IIRC na maioria ("muitos"?) Dos sistemas, sistemas de arquivos são sincronizados a cada 30 s.

Eu verificaria o log do kernel (assim dmesg) para descobrir se algo desagradável está acontecendo e correria lsofpara ver se algum arquivo grande e excluído ainda está aberto (na verdade, acho que os arquivos excluídos serão marcados como tal na lsofsaída).

Duas razões (uma delas apontada na pergunta que você vincula) que podem fazer com que os arquivos excluídos não liberem espaço são

  • arquivos que não foram realmente excluídos: você excluiu unlink()um arquivo com um link físico em outro lugar (mais precisamente, editou um arquivo com mais de um link)
  • arquivos que ainda estão abertos: os arquivos abertos são mantidos em livro usando, bem, arquivos, inodes , não entradas de diretório, se você excluir a entrada, o inode permanecerá lá enquanto ainda estiver aberto.

Mas não sei de um motivo específico para isso acontecer com tantos arquivos ...

njsg
fonte
syncnunca ajudou. Quanto aos logs, é um sistema Ubuntu, por isso é bastante complicado, então sim, eles são tipicamente barulhentos. apportestá sendo implantado com frequência porque todas as atualizações noturnas do apt-get travam, embora / var / crash tenha apenas 77 MB. Verificamos também atdinundou / var / log / syslog com repetição de linhas como atd[8892]: File a0015c0152ab76 is in wrong format - abortingprovavelmente desde os poucos arquivos em / var / spool / cron / atspool eram todos 0 tamanho, tornando a circular problema é claro
Marcos
1

O CentOS 6.3 também faz a coisa de não esvaziar a lata de lixo quando você esvazia a lata de lixo. Não consegui encontrar uma maneira de recuperar o espaço até correr rm -rf ~/.local/share/Trash/expunged/. Causou muito coçar a cabeça.

Biggles
fonte