Costumo usar instantâneos de mapeador de dispositivos não persistentes. Uma tabela de exemplo é semelhante a esta:
0 10485760 snapshot /dev/sdc3 /dev/sdc6 N 16
Em caso de falha, ainda tenho os dois /dev/sdc3
e /dev/sdc6
porque os discos não são voláteis. Mas é possível recuperar esse snapshot
dispositivo ou pelo menos recuperar as alterações de /dev/sdc6
alguma forma? Eu sei que existem instantâneos persistentes para o meu propósito, mas ainda estou curioso. Obrigado.
Não é realmente possível. Alguns dados ainda podem estar lá, mas não de uma forma que faça sentido para um sistema de arquivos...
Um instantâneo considera seu dispositivo de bloco como blocos de dados, com um determinado tamanho de bloco. À medida que as gravações chegam, cada parte afetada é preservada, copiando-a para o dispositivo de instantâneo.
As gravações do sistema de arquivos geralmente são bastante aleatórias, portanto, isso pode acontecer em qualquer ordem. O pedaço copiado acaba tendo um deslocamento diferente.
Portanto, o instantâneo armazena metadados, que é a relação entre (deslocamento antigo <-> novo deslocamento).
Com um instantâneo transitório, esse armazenamento existe apenas na memória. Ele é perdido quando você reinicia ou desativa o snapshot.
Sem esses metadados, o que você tem?
Essencialmente, você está olhando para "pedaços aleatórios de dados".
Para recuperar esse dispositivo de instantâneo, você teria que ser capaz de determinar de alguma forma o deslocamento original de cada pedaço que foi copiado.
Mas isso geralmente não pode ser feito. Você não sabe de onde vieram esses pedaços originalmente. Você nem sabe se esses são pedaços ou apenas dados antigos que existiam antes da criação do instantâneo.
E mesmo que você pudesse resolver esse quebra-cabeça, ele só funcionaria se não ocorresse mais nenhuma gravação no dispositivo de origem enquanto o instantâneo não estivesse ativo. Se o dispositivo foi montado para leitura e gravação e partes de dados que não estão no instantâneo foram substituídas, você não estará mais perdendo metadados. Estão faltando dados.
Portanto, em suma, é considerado irrecuperável.
Exceções são possíveis.
Se vários pedaços foram copiados em ordem, ou se os dados que você está procurando forem pequenos o suficiente para caber em um único pedaço, você ainda poderá ter sorte e encontrá-los. Da mesma forma, você pode ter sorte e recuperar algo de um único disco de um conjunto raid5 com falha, se for pequeno o suficiente para caber em um único bloco de dados. Se você estiver satisfeito com a recuperação de bits de dados sem a ajuda de um sistema de arquivos.
Você poderia ter dados que de alguma forma conhecessem seu próprio deslocamento. Por exemplo, se você gravar a saída
hexdump -C
em um dispositivo de bloco e, em seguida, tirar um instantâneo disso. hexdump imprime deslocamentos em cada linha para que você possa derivar deslocamentos dos dados. Isso presumindo que o hexdump não pulou nenhuma linha ...Se você estiver usando criptografia completa de disco (LUKS) e fizer um snapshot de todo o dispositivo LUKS. Seu instantâneo terá pedaços de dados completamente aleatórios (criptografados). O LUKS também não conhece o deslocamento desses dados, mas contanto que você ainda tenha o cabeçalho LUKS e conheça a chave, você pode tentar descriptografar cada pedaço para cada deslocamento; e se você encontrar um deslocamento onde ele descriptografa dados não aleatórios, esse deve ser o correto. Mas isso pressupõe que todos os dados criptografados sejam de texto simples. Depois de criptografar dados aleatórios, você não sabe de nenhuma maneira.
Se você tiver um caso de uso em que as gravações não são aleatórias, mas completamente determinísticas, você poderá reproduzir metadados repetindo as mesmas ações em um novo instantâneo. Se você sabe que usou apenas dd para gravar dados com busca e contagem, e em que ordem, talvez isso possa ser feito.
Mas estes são casos que você normalmente não encontra na prática. Simplesmente não funciona muito bem. Não existem ferramentas para ajudá-lo nessa empreitada.