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

43

TL; DR:

Tenho notado que, se eu fizer uma alteração no registro e, em seguida, desligar meu sistema Windows 10, a alteração do 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". Em seguida, desacelero a caixa pressionando o botão liga / desliga por 5 segundos.
  • Quandoeupuxooregistrodevolta,essachaveeseusvaloresdesaparecem:
  • (Essas imagens foram editadas para fins de formatação)

Exemplo 2 :

  • Faça uma alteração no registro (usando regedit)
  • Hibernar o sistema
  • Inicialize em uma ferramenta de recuperação do 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 desapareceu.

Isso parece equivalente a um desligamento strong na caixa.

Exemplo 3:

Eu vejo o comportamento estranho quando eu:

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

Essas alterações também não estã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?

Esperando obter algum esclarecimento!

    
por Shrout1 14.06.2018 / 19:58

3 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 pressionado para o disco para que seja lido novamente e a operação seja retomada exatamente onde sistema deixado de lado.

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

A razão pela qual as mudanças não são persistentes é porque elas não são gravadas no disco ainda 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-chave do sistema de arquivos que talvez não tenham sido gravadas no disco e estejam na RAM. O sistema, ao sair da hibernação, espera que o disco esteja em um estado muito particular e é possível que os caches de disco e os 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, em seguida, desmontará o disco antes de desligá-lo.

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

shutdown /s /f /t 0

/s é "shutdown", /f forçar e /t 0 significa "agora" (tempo = 0 segundos)

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

Leia mais em HowtoGeek : Desligar não encerra totalmente o Windows 10 (mas reinicia)

Relacionado a você fazer um desligamento forçado, o problema é que não é garantido que o Windows grave qualquer alteração no disco no mesmo milésimo de segundo (ou mesmo minuto) que você fez na alteração. Quase certamente será escrito dentro de alguns minutos , mas a probabilidade de ter sido escrita aumentará com o tempo. É improvável que seja escrito imediatamente, então próximo ao momento em que você faz a mudança, a probabilidade aumenta acentuadamente, e quase certamente terá sido escrita dentro de uma hora.

O problema é que, ao forçar um encerramento forçado, você não está dando ao sistema uma chance de gravar alterações com segurança 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 foram referidos como "atômicos", como na mudança ou aconteceu ou não.

Hoje os conhecemos como Sistemas de arquivos Journalled porque eles mantêm um registro das operações que serão acontecem que podem ser revertidos ou rolados para frente no caso de falha do sistema e reinicialização. Na inicialização de 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 se estão "bons". Se for então, a transação avança e é completada, se não, então volta para os dados antigos.

Ao usar este pedido, o disco quase sempre fica em um estado fácil de reparar.

Mas ao forçar o desligamento inesperado do seu sistema, você não pode garantir se a transação progrediu o suficiente para ser reparada, e é provável que um sistema operacional como o Linux não se importe com o histórico de transações e com o Windows. é mais provável que apenas faça alterações que retrocedem tudo em vez de avançar.

Se você reinicializou o Windows, ele pode tentar reparar o disco adequadamente, pois ele tem um conhecimento mais íntimo do sistema de arquivos.

    
por 14.06.2018 / 20:16
39

Conforme documentado na página do MSDN sobre RegFlushKey :

Calling RegFlushKey is an expensive operation that significantly affects system-wide performance as it consumes disk bandwidth and blocks modifications to all keys by all processes in the registry hive that is being flushed until the flush operation completes. RegFlushKey should only be called explicitly when an application must guarantee that registry changes are persisted to disk immediately after modification. All modifications made to keys are visible to other processes without the need to flush them to disk.

Alternatively, the registry has a 'lazy flush' mechanism that flushes registry modifications to disk at regular intervals of time. In addition to this regular flush operation, registry changes are also flushed to disk at system shutdown. Allowing the 'lazy flush' to flush registry changes is the most efficient way to manage registry writes to the registry store on disk.

Isso sugere que, além de liberar uma chave específica para o disco imediatamente (que bloqueia todos os outros para fora do registro até que o flush seja concluído), o registro é automaticamente liberado periodicamente: um horário não é fornecido , mas presumivelmente é pelo menos mais do que o tempo que você esperou entre escrever a chave e o desligamento. Além disso, é liberado no desligamento, como você já havia descoberto.

Você pode usar a função RegFlushKey no software que manipula a dita chave ou criar uma ferramenta adicional para forçar a gravação de uma chave do registro no disco imediatamente, se isso for crucial para o seu caso de uso.

    
por 15.06.2018 / 10:43
14

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

A documentação em FSCTL_MARK_AS_SYSTEM_HIVE tem isto a dizer:

The FSCTL_MARK_AS_SYSTEM_HIVE control code informs the file system that the specified file contains the registry's system hive. The file system must flush system hive data to disk at just the right moment to avoid deadlocks and to ensure data integrity.

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

Lembre-se de que liberar o sistema de arquivos não significa liberar o registro , porque o registro pode executar o armazenamento em cache no topo do arquivo sistema. Para liberar o registro primeiro, você precisa de alguma forma fazer com que NtFlushKey ou ZwFlushKey seja chamado em sua chave de interesse.

    
por 15.06.2018 / 07:44