Come ripristinare i file sulla partizione btrfs?


19

Come posso ripristinare (ripristinare) un file eliminato su una partizione btrfs?

Non ho ancora fatto un'istantanea, quindi non posso usare quella funzione. So che ci sono alcuni strumenti per altri file system Linux, ma Google non ha trovato nulla di specifico per btrfs. Mi sono imbattuto in una vaga menzione che btrfs include uno strumento non ripristinato, ma non riesco a trovarlo. Prima di provare strumenti per un altro file system, chiedo qui.

Ulteriori informazioni:

  • I (due) file eliminati sono stati eliminati da un rsynccomando remoto andato storto.
  • Questi erano piccoli file di testo semplice.
  • Conosco i nomi dei file.
  • Potrei essere in grado di ricordare alcune stringhe nei file.
  • Il disco è un normale HDD, ma è grande (2 TB).
  • Sto eseguendo Kubuntu 12.04 (beta2) con tutti gli ultimi aggiornamenti.
  • Non ho scritto nuovi dati nella partizione da cui sono stati eliminati i file.
  • Non ho un'istantanea o un backup di questi file. (L'ultimo backup è di qualche ora più vecchio di questi file.)
  • Stranamente, un file system COW sembra avere meno opzioni di recupero file rispetto a ext3 / 4 ...

Risposte:


7

Dato che i tuoi file sono piccoli e semplici, proverei a scansionare l'output di "stringhe" nel dispositivo in cui risiede il filesystem, cioè

strings /dev/sda1 | less

quindi usa "/" per cercare le stringhe che potrebbero essere in quel file. Quando trovi il testo, delimita l'inizio con "m", quindi vai alla fine e usa "| cat> file" per salvarlo in un file.

In realtà l'ho fatto quando ho avuto una situazione simile su un altro filesystem senza ripristinare, qualche anno fa, e ha funzionato benissimo per me.


4

Jörg Walter ha implementato uno btrfs-undeletescript di shell usando gli strumenti find-roote restoreda btrfs-progs, che può essere trovato qui , e dovrebbe aiutare gli altri in una posizione simile.

Dato che è concesso in licenza in GPLv2, non posso includerlo qui.


3
Vale la pena notare che detto script ha almeno un percorso hardcoded (presumibilmente per errore) e presenta alcuni altri problemi, quindi gli acquirenti devono fare attenzione che deve essere modificato prima dell'uso.
gamen

2
Ecco una versione ripulita dello script originale: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco

"Dato che è concesso in licenza con GPLv2, non posso includerlo qui" - forse dovresti leggere ciò che dice GPLv2, perché non ha alcun senso.
slang

4
@slang forse dovresti leggere i termini di servizio di questo sito? I contributi devono essere concessi in licenza con la licenza Creative Commons Attribution Share Alike 3.0.
Suriv

@suriv - Immagino di poter capire le loro ragioni per farlo, ma è piuttosto fastidioso. Soprattutto dal momento che CC-BY-SA è solo leggermente più restrittivo della GPL (a parte la documentazione sui brevetti GPLv3).
Onnipotente l'

2

Se l'unità btrfs ha sottovolumi è necessario passare l' -r <subvol-id>opzione aggiuntiva a btrfs restore. Sfortunatamente gli script là fuori, come quello pubblicato da user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), non hanno un'opzione per farlo, ma probabilmente possono essere adattati a questo.

Se vuoi farlo a mano, devi ottenere il subvol-id giusto, con:

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

o in alternativa con:

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

Successivamente si utilizza btrfs-find-rootper ottenere il numero di blocco a cui si desidera ripristinare (di solito quello appena prima di quello massimo che è la radice corrente). Per questo è necessario prima impostare il volume secondario predefinito su quello da cui si desidera ripristinare i file (e ripristinare questa modifica in seguito):

# 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

Puoi finalmente usare btrfs restorecon -r <subvol-id>per il recupero (inizialmente con l' --dry-runargomento se lo desideri):

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

Maggiori informazioni su tutto questo qui: https://btrfs.wiki.kernel.org/index.php/Restore


Ho provato questo su un sistema Fedora 26 - e lì il btrfs-find-rootpassaggio non termina mai (vale a dire gira al 100% della CPU per 3 ore su un <250 GB FS). Vedi anche una storia simile spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.