Situação clássica: Eu corri mal rm
e percebi imediatamente depois que havia removido os arquivos errados. (Nada crítico e eu tinha backups razoavelmente recentes, mas ainda irritantes.)
Sabendo que mais atividade em disco era minha inimiga, se eu quisesse recuperar os arquivos com extundelete
essas ferramentas, desliguei imediatamente a máquina fisicamente (por exemplo, com o botão liga / desliga, não com halt
ou com nenhum comando). Este era um laptop sem tarefas importantes em execução ou qualquer coisa aberta, por isso era uma operação aceitável. (A propósito, aprendi desde então que a primeira coisa a fazer em tal situação seria estimar primeiro se os arquivos ausentes ainda podem ser abertos por um processo https://unix.stackexchange.com/a/101247 - se estiverem, você deve recuperá-los dessa maneira, em vez de desligar a máquina.)
Ainda assim, depois que a máquina foi desligada, pensei por um tempo e decidi que os arquivos não valiam o investimento de tempo em inicializar um sistema ativo para análise forense adequada. Então, liguei a máquina novamente. E então descobri que meus arquivos ainda estavam no disco: rm
eles não haviam sido propagados para o disco antes de eu desligar. Dancei um pouco e agradeci ao deus dos administradores de sistemas por Seu inesperado perdão.
Minha pergunta agora é entender como isso foi possível e qual é o atraso típico antes que um rm
seja realmente propagado para o disco. Eu sei que as E / S do disco não são liberadas imediatamente, mas ficam na memória por algum tempo, mas pensei que o diário do disco garantiria rapidamente que as operações pendentes não fossem totalmente perdidas. https://unix.stackexchange.com/a/78766 parece sugerir um mecanismo separado para liberar páginas sujas e liberar operações do diário, mas não fornece detalhes suficientes sobre como o diário estaria envolvido em um rm
e o atraso esperado antes operações são liberadas.
Mais alguns detalhes: os dados estavam em uma partição ext4 dentro de um volume LUKS e, ao inicializar a máquina, vi o seguinte em syslog
:
Sep 24 10:24:58 gamma kernel: [ 11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [ 11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [ 11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
mas não estou confiante de que esteja relacionado ao rm
.
Outra pergunta seria se existe uma maneira de dizer ao kernel para não executar nenhuma das operações pendentes do disco (mas, digamos, despejá-las em algum lugar), em vez de desligar a máquina. (Obviamente, parece perigoso não executar as operações pendentes, mas é o que aconteceria ao desligar a máquina de qualquer maneira, e em alguns casos isso poderia salvá-lo.) Isso seria "mais limpo", é claro, e também interessante por exemplo, servidores remotos onde o desligamento físico não é uma opção fácil.
rm
ser gravado? Em outras palavras, as coisas são comprometidas com o diário apenas quando uma gravação está prestes a ser realizada? Ou a imagem é mais complexa que essa? Quanto ao alt-sysrq-u, essa é uma ideia bastante interessante. Você tem uma referência a dar para a reivindicação "Parece"? (Parece não seguir os links que você forneceu.) Obrigado! :)echo u > /proc/sysrq-trigger
(pode ser necessário ativá-lo primeiro).De: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
Veja também aqui como liberá-los: Como você esvazia os buffers e o cache em um sistema Linux?
Citado no link acima:
fonte
commit=nrsec
, é algo que ocorreria após o kernel ter decidido liberar as alterações da memória para o disco? Ou a configuraçãocommit=1
garante que todas as alterações sejam liberadas após 1 segundo, independentemente das configuraçõesdirty_expire_centisecs
edirty_writeback_centisecs
?commit=1
. Tanto quanto eu entendo,sync
força tudo a acontecer, independentemente das configurações de memória virtual, embora isso possa acontecer mais cedo.