Quando o Windows grava as alterações do registro no disco?

43

TL; DR:

Observei que, se eu fizer uma alteração no registro e, em seguida, desligar o sistema Windows 10, a alteração no registro não aparecerá após a reinicialização.

Também notei que a exclusão de um arquivo de hibernação pode afetar a capacidade de uma ferramenta de recuperação do Linux fazer alterações no registro do Windows em um estado offline. A ferramenta parece incapaz de fazer alterações persistentes após a exclusão de um arquivo de hibernação. Vou listar exemplos específicos abaixo.

Exemplo 1:

  • Eu adiciono uma chave chamada "1111" em "HKLM \ SOFTWARE". Então desligo minha caixa com força, pressionando o botão liga / desliga por 5 segundos.
  • Chave de teste
  • Quando puxo o registro de volta, essa chave e seus valores desaparecem:
  • Chave de teste desaparecida
  • (Estas imagens foram editadas para fins de formatação)

Exemplo 2 :

  • Faça uma alteração no registro (usando o regedit)
  • Hibernar o sistema
  • Inicialize em uma ferramenta de recuperação Linux
  • Exclua o arquivo de hibernação para montar o disco.
  • Leia o registro do Windows (na ferramenta de recuperação)
  • A alteração do registro se foi.

Isso parece equivalente a um desligamento difícil na caixa.

Exemplo 3:

Vejo um comportamento estranho quando:

  • Hibernar a caixa
  • Inicialize em uma ferramenta de recuperação Linux e exclua o arquivo de hibernação
  • Faça alterações no registro (na ferramenta de recuperação)
  • Reinicie a caixa

Essas alterações também não são refletidas no registro.

Então, o que está acontecendo aqui?

  • Quando o Windows 10 grava as alterações do registro no disco?
  • Por que a exclusão de um arquivo de hibernação (no Exemplo 3) impede que as alterações no registro feitas na ferramenta de recuperação sejam refletidas na próxima inicialização?

Na esperança de obter alguns esclarecimentos!

Shrout1
fonte
2
"a alteração do registro não aparece após a reinicialização." - A alteração do registro não entra em vigor até a reinicialização e, normalmente, apenas o File Explorer precisa ser reiniciado. Tudo depende do comportamento da alteração do registro se uma reinicialização for realmente necessária. A chave real é modificada, quando modificada, o que responde à sua pergunta.
Ramhound 14/06
8
O que você quer dizer com um desligamento difícil? Segurando o botão liga / desliga até desligar? Esse processo ignora a gravação de qualquer gravação de cache de disco pendente.
DavidPostill
2
@ Ramhound Eu entendo que ele não entra em vigor, mas por que não foi gravado no disco? Eu faço a edição, desligo com força e depois a mudança não existe mais. Se é ou não entrou em vigor na memória não importa em que ponto
Shrout1
2
@ Shrout1 - Por que você está forçando a máquina a desligar, em vez de desligar a máquina com segurança?
Ramhound 14/06
6
@ Ramhound Estou executando testes para ver o que acontece se o sistema não desligar normalmente. Aleatória, eu sei, mas preciso saber exatamente como isso é comprometido com a memória, para não perdermos nada em nossos sistemas se não for tratado corretamente.
Shrout1

Respostas:

54

TL; DR: Desligue o sistema corretamente.


A hibernação não tem nada a ver com o desligamento, está intimamente relacionada à suspensão para RAM (suspensão), exceto com o conteúdo da RAM enviado para o disco para que seja lida novamente e a operação reiniciada exatamente de onde o sistema parou .

Se você deseja que as alterações persistam, é necessário desativar a hibernação e o Windows Fastboot (que é um subconjunto da hibernação). Ou você pode realmente reiniciar em vez de hibernar e reiniciar.

O motivo das alterações não persistirem é porque elas ainda não foram gravadas no disco, exceto no arquivo de hibernação. Que você está excluindo, o que significa que o sistema de arquivos pode ter que se reparar e voltar ao estado "último bem conhecido".

Enquanto o sistema estiver em hibernação, haverá várias estruturas principais do sistema de arquivos que podem não ter sido gravadas no disco e estão na RAM. O sistema, após sair da hibernação, espera que o disco esteja em um estado muito particular e é possível que caches de disco e arquivos importantes do sistema sejam salvos no arquivo de hibernação e não no disco real.

Se você fizer um desligamento adequado , o Windows liberará adequadamente a memória de trabalho no disco e desmontará o disco corretamente antes de desligar.

Para forçar um desligamento adequado, abra um prompt de comando e digite

shutdown /s /f /t 0

/sé "desligamento", /fforçar e /t 0significar "agora" (tempo = 0 segundos)

Ou você pode simplesmente desativar o fastboot e a hibernação.

Leia mais em HowtoGeek: O desligamento não encerra totalmente o Windows 10 (mas a reinicialização)


Relacionado a você fazer um desligamento forçado, o problema é que não há garantia de que o Windows grave as alterações em disco no mesmo milissegundo (ou mesmo minuto) que você faz a alteração. Quase certamente será escrito em alguns minutos, mas a probabilidade de realmente ter sido escrita aumentará com o tempo. É improvável que ser escrito imediatamente, em seguida, próximo ao tempo que você fazer a mudança a probabilidade aumenta bruscamente, e quase certamente foram escritos dentro de uma hora.

O problema é que, ao forçar um desligamento forçado, você não está dando ao sistema a chance de gravar com segurança as alterações no disco.

A maioria dos sistemas de arquivos modernos são escritos para fazer alterações da maneira mais segura possível. No passado, eles eram referidos como "atômicos", como na mudança aconteceu ou não.

Hoje, nós os conhecemos como sistemas de arquivos com registro diário, porque eles mantêm um log de operações que podem acontecer, que podem ser revertidas ou revertidas em caso de falha do sistema e reinicialização. Na inicialização, após uma falha de energia, o sistema verifica o diário e, para cada transação, verifica se os dados reais do arquivo estão gravados no disco e estão "em boas condições". Se for, a transação será encaminhada para a frente e concluída, caso contrário, será revertida para os dados antigos.

Ao usar essa ordem, o disco está quase sempre em um estado fácil de reparar.

Mas, ao forçar o sistema a desligar inesperadamente, você não pode garantir se a transação avançou o suficiente para avançar no reparo, e as chances são de que um sistema operacional como o Linux não se importe tanto quanto o Windows com o histórico de transações e seja mais provável do que não apenas fazer alterações que revertam tudo para trás e não para frente.

Se você reiniciou o Windows, ele pode tentar consertar o disco corretamente, pois possui um conhecimento mais íntimo do sistema de arquivos.

Mokubai
fonte
Obrigado! Agradeço sua resposta :) Desliguei a hibernação, reiniciei e refiz o mesmo teste. O exemplo 1 tem o mesmo resultado, nenhum arquivo de hibernação envolvido. Parece que as alterações no registro são gravadas apenas em algum momento durante o logoff / desligamento ... Também concordo que o sistema possa estar procurando um "último estado bom" ao acordar de uma hibernação quebrada - ele tende a executar verificações de integridade.
Shrout1
1
Hmmm ... Então eu baixei o sysinternals "sync", que força o cache de gravação no disco e isso não fez nada (ainda perdi as chaves / valores no hard shut off). Também executei o Process Explorer e examinei a E / S de disco nas propriedades do Regedit. Ele lera E / S, mas não gravava E / S. Isso me faz pensar que pode estar aguardando o desligamento ... Você conhece alguma documentação M $ extremamente seca que possa explicar isso claramente? Obrigado novamente por toda a sua ajuda!!
Shrout1
11
O diário NTFS não oferece garantias sobre os dados do arquivo. É apenas para manter os metadados do NTFS consistentes, para que você não acabe com um sistema de arquivos quebrado . Arquivos individuais ainda podem ter alterações parciais gravadas, quebrando o arquivo. Há NTFS transacional, mas isso não é recomendado e muito raramente usado. É também por isso que os mecanismos de banco de dados mantêm seu próprio diário para consistência dos dados. Consulte também blogs.msdn.microsoft.com/oldnewthing/20130101-00/?p=5673
Bob
2
@ Shrout1 Supondo que as alterações do registro estejam pendentes no cache de write-back. É perfeitamente possível que eles sejam gerenciados separadamente e que isso não tenha nada a ver com o sistema de arquivos, com o cache ou de outra forma. Por exemplo, Última configuração válida conhecida é atualizada apenas na inicialização bem-sucedida. (Eu não sei o suficiente sobre o funcionamento interno de registo para ter certeza de quando as mudanças são salvas e então. TxR pode estar envolvido.)
Bob
1
Existe uma razão para você estar forçando o desligamento? AFAIK que apenas força o fechamento de aplicativos em execução, o que não faz muito além de matar aplicativos que você não pode fechar e aumenta a probabilidade de perder algumas alterações não salvas em algum lugar se não souber o que está fazendo. fazendo ou que você colocaria algum aplicativo em um estado irrecuperável - eu realmente não chamaria isso de desligamento "adequado".
NotThatGuy
39

Conforme documentado na página MSDN paraRegFlushKey :

Chamar RegFlushKey é uma operação cara que afeta significativamente o desempenho de todo o sistema, pois consome largura de banda do disco e bloqueia modificações em todas as chaves por todos os processos na seção do registro que está sendo liberada até que a operação de liberação seja concluída. RegFlushKey só deve ser chamado explicitamente quando um aplicativo deve garantir que as alterações do registro sejam persistidas no disco imediatamente após a modificação. Todas as modificações feitas nas chaves são visíveis para outros processos sem a necessidade de liberá-las para o disco.

Como alternativa, o registro possui um mecanismo de 'liberação lenta' que libera as modificações do registro no disco em intervalos regulares de tempo. Além dessa operação regular de liberação, as alterações do registro também são liberadas para o disco no desligamento do sistema. Permitir que a 'liberação lenta' libere alterações no registro é a maneira mais eficiente de gerenciar gravações no registro no armazenamento em disco.

Isso sugere que, além de liberar imediatamente uma chave específica para o disco (que bloqueia todo mundo fora do registro até que a liberação seja concluída), o registro é liberado automaticamente periodicamente: não é dado um tempo, mas, presumivelmente, é pelo menos mais do que o tempo que você esperou entre escrever a chave e o desligamento forçado. Além disso, ele é liberado no desligamento, como você já havia descoberto.

Você pode usar a RegFlushKeyfunção no software que manipula a chave mencionada ou criar uma ferramenta adicional para forçar a gravação imediata de uma chave do Registro no disco, se isso for crucial para o seu caso de uso.

user914877
fonte
Ei! Darei a você este se você inserir um link para o seguinte artigo do MSDN: Salvar alterações no registro do aplicativo no Windows 8 ou Windows Server 2012 e adicionar uma breve citação. Sua resposta me levou até a toca do coelho até aquele artigo e basicamente diz a mesma coisa que você. Muito obrigado!
Shrout1
Mas alguém sabe como um usuário pode chamar RegFlushKey ?
Scott
@ Scott Parece que isso precisa ser feito em código ... O artigo do MSDN listado no post tem um exemplo de C ++ e eu o vi implementado em C # em outro lugar. Não tenho certeza se isso pode ser feito na linha de comando.
Shrout1
3
@ Scott: Eu ficaria chocado se sync fez corar o registro para o disco. Isso simplesmente não faria sentido. Por que liberar o cache do sistema de arquivos (que é usado pelo gerenciador de configuração, e não o contrário) repentinamente liberou o cache do próprio gerenciador de configuração? Ele nem sabe qual é a estrutura do cache de nível superior, se é que existe algum.
Mehrdad 16/06
1
@ Scott Existe um caminho. A API já foi vinculada. Existem ferramentas por aí que oferecem uma GUI para chamar funções Win32 arbitrárias. A coisa é ... É um detalhe de implementação. Se você expô-lo, as pessoas confiam nele e então você não pode mudá-lo. Também é importante notar que o disco do sistema é um animal totalmente diferente da mídia removível. O disco do sistema é usado para muitas coisas que exigem que um identificador esteja sempre aberto (por exemplo, arquivo de paginação). O Windows não suporta a desmontagem da partição do sistema, portanto, não é necessário esse "recurso". Além disso ... tente manter os comentários neutros. Você odeia o Windows, nós entendemos.
Basic
14

TL; DR: É muito cuidadoso fazer isso no momento certo .

A documentação em FSCTL_MARK_AS_SYSTEM_HIVEtem isto a dizer:

O FSCTL_MARK_AS_SYSTEM_HIVEcódigo de controle informa ao sistema de arquivos que o arquivo especificado contém a seção do sistema do registro. O sistema de arquivos deve liberar os dados da seção do sistema no disco no momento certo para evitar conflitos e garantir a integridade dos dados.

Não acredito que haja mais detalhes disponíveis publicamente do que isso.

Lembre-se de que liberar o sistema de arquivos não implica liberar o registro , porque o registro pode executar o armazenamento em cache na parte superior do sistema. Para liberar o registro primeiro, você precisa causar de alguma forma NtFlushKeyou ZwFlushKeyser chamado pela sua chave de interesse.

Mehrdad
fonte
Oh boa captura! Esse é o meu novo MSDN-ism favorito: o momento certo . Meu favorito anterior era "Tenha cuidado ao especificar a cláusula TOP em uma consulta que contenha um operador UNION, UNION ALL, EXCEPT ou INTERSECT. É possível escrever uma consulta que retorne resultados inesperados ", que era um eufemismo para "esse recurso é gravemente quebrado e não faz o que qualquer pessoa razoável esperaria e, em vez de corrigi-lo, vamos documentá-lo ".
Davidbak 17/06/19
@davidbak: muitas gargalhadas, na defesa do MSDN, eu realmente não vejo em quais detalhes eles poderiam fornecer que um usuário deveria confiar.
Mehrdad
Oh, você está certo; claramente isso era apenas algo documentado como uma conseqüência do acordo da UE há muito tempo em que a Microsoft era obrigada a documentar todas as APIs - não importa quão internas elas sejam. Esta página que você vinculou até diz "Somente os componentes no nível do kernel podem usar este código de controle do sistema de arquivos", o que é uma boa dica para manter as mãos afastadas. Ainda assim, " o momento certo " - um dia eu vou documentar alguns API de mina com "chamar esse método somente no momento certo " e ver o que acontece ....
davidbak
@davidbak: Eu acho que você está um pouco ... animado. :-P Meu palpite é que isso foi documentado para permitir que os drivers do sistema de arquivos saibam qual arquivo contém a seção do registro SYSTEM, o que pode ser importante, pois eles não tentariam gravar nada no registro ao mesmo tempo em que esse arquivo está sendo liberado para o disco. Não tenho provas disso; é apenas uma razão que acho concebível. Uma dúvida que tenho sobre isso, no entanto, é por que um driver de disco não precisaria saber disso também.
Mehrdad