Encontrei o inode de um arquivo usando ls -li. Então encontrei o bloco inicial a partir do qual este arquivo está gravado no disco. Copiei o conteúdo do bloco do comando dd para outro diretório. Em seguida, destruí o arquivo usando o utilitário Shred "shred -uvz -n = 10 file1.txt" e executei novamente o mesmo comando dd. arquivo foi novamente recuperado. Eu deveria obter 00000 depois que o arquivo fosse destruído. o que estou perdendo?
Na segunda iteração, não removi o arquivo e, em vez disso, executei "shred -vz -n = 10 file2.txt" Seguindo as etapas mencionadas anteriormente, consegui novamente recuperar o arquivo original usando o comando dd e a posição do bloco. No entanto, o conteúdo do arquivo fragmentado contém 00000, conforme mostrado no hexdump file2.txt. o que estou perdendo?
Supõe-se que os sistemas de arquivos tenham acesso exclusivo aos seus dispositivos de bloco. Você não deve usar
dd
diretamente no dispositivo de bloco enquanto o sistema de arquivos está montado.Quando você usa
dd
(ou qualquer outro programa de espaço do usuário) para ler bytes diretamente de um dispositivo de bloco, essa leitura é armazenada em cache. Se você repetirdd
novamente, ele lerá os dados do cache.Infelizmente, gravar dados (por meio de um sistema de arquivos) não atualiza esse cache. Então você entra nesta situação em que os dados no cache não refletem os dados no disco.
Outro exemplo onde isso acontece é TRIM. Se algum dado do dispositivo de bloco foi armazenado em cache, você ainda obterá os dados do cache, mesmo que o TRIM já os tenha removido. É por isso que você precisa descartar caches ao testar TRIM .
Faça um sistema de arquivos com alguns arquivos:
Verifique o conteúdo do arquivo e os deslocamentos físicos:
Ler do dispositivo de bloco:
Destruir:
Ler do dispositivo de bloco (em cache):
Ler do dispositivo de bloco (
iflag=nocache
):dd iflag=nocache
descarta dados do cache somente após lê-los do cache, portanto, isso deve ser feito duas vezes para ver os novos dados. Alternativamente, você pode usarsync; echo 3 > /proc/sys/vm/drop_caches
para descartar todos os caches ou tentar a sorte com E/S direta.