Como desfazer a exclusão de arquivos na partição btrfs?

18

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

Ainda não tirei um instantâneo, por isso não posso usar esse recurso. Eu sei que existem alguns ferramentas para outros sistemas de arquivos Linux, mas o google não disponibilizou nada específico para o btrfs. Me deparei com uma menção vaga de que o btrfs inclui uma ferramenta undelete, mas não consigo encontrá-lo. 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 comando rsync remoto que deu errado.
  • Estes eram pequenos arquivos de texto simples.
  • Eu sei os nomes dos arquivos.
  • posso 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.
  • Eu não escrevi nenhum dado novo na partição da qual os arquivos foram excluídos.
  • Eu 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 arquivo do que ext3 / 4 ...
por MountainX 21.04.2012 / 19:59

3 respostas

7

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

strings /dev/sda1 | less

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

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

    
por 22.04.2012 / 18:38
4

Jörg Walter implementou um script btrfs-undelete usando as ferramentas find-root e restore de btrfs-progs , que podem ser encontradas aqui , e deve ajudar os outros em uma posição similar.

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

    
por 01.06.2013 / 18:58
2

Se sua unidade btrfs tiver subvolumes, você precisará passar a opção -r <subvol-id> adicional para btrfs restore . Infelizmente os scripts lá fora, como o que o user414471 postou ( link ), não tem uma opção para fazer isso, mas eles provavelmente podem se adaptar a isso.

Se você quiser fazer isso manualmente, você precisa 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-root para obter o número do bloco ao qual deseja reverter (geralmente o número imediatamente anterior ao número máximo que é a raiz atual). Para isso, você precisa primeiro definir o subvolume padrão para o qual deseja reverter os arquivos (e reverter essa alteração depois):

# 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

Finalmente, você pode usar btrfs restore com -r <subvol-id> para a recuperação (inicialmente com o argumento --dry-run , 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: link

    
por 08.02.2015 / 16:25