Como recuperar arquivos na partição btrfs?

19

Como faço para recuperar (recuperar) um arquivo excluído em uma partição btrfs?

Ainda não tirei um instantâneo, portanto não posso usar esse recurso. Eu sei que existem algumas ferramentas para outros sistemas de arquivos Linux, mas o google não encontrou nada específico para o btrfs. Me deparei com uma vaga menção de que o btrfs inclui uma ferramenta de exclusão, mas não consigo encontrá-la. Antes de tentar ferramentas para outro sistema de arquivos, estou perguntando aqui.

Mais informações:

  • Os (dois) arquivos excluídos foram excluídos por um rsynccomando remoto que deu errado.
  • Estes eram pequenos arquivos de texto simples.
  • Eu sei os nomes dos arquivos.
  • Talvez eu consiga lembrar algumas strings nos arquivos.
  • O disco é um disco rígido normal, mas é grande (2 TB).
  • Estou executando o Kubuntu 12.04 (beta2) com todas as atualizações mais recentes.
  • Não escrevi novos dados na partição em que os arquivos foram excluídos.
  • Não tenho um instantâneo ou um backup desses arquivos. (O último backup é apenas algumas horas mais antigo que esses arquivos.)
  • Estranhamente, um sistema de arquivos COW parece ter menos opções de exclusão de arquivos que ext3 / 4 ...
MountainX para Monica Cellio
fonte

Respostas:

7

Como seus arquivos são pequenos e em texto simples, eu tentaria digitalizar a saída de "strings" no dispositivo em que o sistema de arquivos reside, ou seja,

strings /dev/sda1 | less

em seguida, use "/" para procurar as strings que podem estar nesse arquivo. Quando você encontrar o texto, delimite o início dele com "m", vá para o final e use "| cat> file" para salvá-lo em um arquivo.

Na verdade, eu fiz isso quando tive uma situação semelhante em outro sistema de arquivos sem recuperar, alguns anos atrás, e funcionou muito bem para mim.

Durval Menezes
fonte
4

Jörg Walter implementou um btrfs-undeleteshell script usando as ferramentas find-roote restorede btrfs-progs, que podem ser encontradas aqui , e devem ajudar outras pessoas em uma posição semelhante.

Como está licenciado sob a GPLv2, não posso incluí-lo aqui.

Sameer
fonte
3
É importante notar que o script mencionado possui pelo menos um caminho codificado (presumivelmente por engano) e tem alguns outros problemas; portanto, os compradores devem ficar atentos ao fato de que ele deve ser editado antes do uso.
21714
2
Aqui está uma versão limpa do script original: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
"Como está licenciado sob a GPLv2, não posso incluí-lo aqui" - talvez você devesse ler o que a GPLv2 diz, porque isso não faz nenhum sentido.
gíria
4
@slang talvez você deva ler os termos de serviço deste site? As contribuições devem ser licenciadas sob a licença Creative Commons Attribution Share Alike 3.0.
suriv
@suriv - Eu acho que posso entender as razões deles para fazer isso, mas isso é muito chato. Especialmente porque o CC-BY-SA é apenas um pouco mais restritivo que a GPL (além do material de patente da GPLv3).
omniforme
2

Se a sua unidade btrfs tiver subvolumes, você precisará passar a -r <subvol-id>opção adicional para btrfs restore. Infelizmente, os scripts existentes, como o postado por user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), não têm uma opção para fazer isso, mas provavelmente podem ser adaptados a isso.

Se você quiser fazer isso manualmente, precisará obter o subvol-id correto, com:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

ou alternativamente com:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

Depois, você usa btrfs-find-rootpara obter o número do bloco ao qual deseja reverter (geralmente aquele logo antes do número máximo que é a raiz atual). Para isso, é necessário primeiro definir o subvolume padrão como aquele do qual você deseja reverter arquivos (e reverter essa alteração posteriormente):

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

Você pode finalmente usar btrfs restorecom -r <subvol-id>para a recuperação (inicialmente com o --dry-runargumento, se desejar):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

Mais informações sobre tudo isso aqui: https://btrfs.wiki.kernel.org/index.php/Restore

Catalin Hritcu
fonte
Testou isso em um sistema Fedora 26 - e a btrfs-find-rootetapa nunca termina (ou seja, roda a 100% da CPU por 3 horas em um FS de <250 GB). Veja também uma história semelhante spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig