¿Cómo recuperar archivos en la partición btrfs?

19

¿Cómo recupero (recupero) un archivo eliminado en una partición btrfs?

Todavía no he tomado una instantánea, por lo que no puedo usar esa función. Sé que hay algunas herramientas para otros sistemas de archivos Linux, pero google no ha encontrado nada específico para btrfs. Me encontré con una vaga mención de que btrfs incluye una herramienta de recuperación, pero no puedo encontrarla. Antes de probar herramientas para otro sistema de archivos, estoy preguntando aquí.

Más información:

  • Los (dos) archivos eliminados fueron eliminados por un rsynccomando remoto que salió mal.
  • Estos eran pequeños archivos de texto sin formato.
  • Sé los nombres de los archivos.
  • Podría recordar algunas cadenas en los archivos.
  • El disco es un HDD normal, pero es grande (2 TB).
  • Estoy ejecutando Kubuntu 12.04 (beta2) con todas las últimas actualizaciones.
  • No he escrito ningún dato nuevo en la partición de la que se eliminaron los archivos.
  • No tengo una instantánea o una copia de seguridad de estos archivos. (La última copia de seguridad es unas pocas horas más antigua que estos archivos).
  • Curiosamente, un sistema de archivos COW parece tener menos opciones de recuperación de archivos que ext3 / 4 ...
MountainX para Monica Cellio
fuente

Respuestas:

7

Como sus archivos son pequeños y de texto plano, intentaría escanear la salida de "cadenas" en el dispositivo donde reside el sistema de archivos, es decir,

strings /dev/sda1 | less

luego use "/" para buscar las cadenas que podrían estar en ese archivo. Cuando encuentre el texto, delimite el comienzo con "m", luego diríjase al final y use "| cat> file" para guardarlo en un archivo.

De hecho, lo hice cuando tuve una situación similar en otro sistema de archivos sin recuperar, hace unos años, y funcionó muy bien para mí.

Durval Menezes
fuente
4

Jörg Walter implementó un btrfs-undeletescript de shell utilizando las herramientas find-rooty restorede btrfs-progs, que se pueden encontrar aquí , y debería ayudar a otros en una posición similar.

Como está licenciado bajo GPLv2, no puedo incluirlo aquí.

Sameer
fuente
3
Vale la pena señalar que dicho script tiene al menos una ruta codificada (presumiblemente por error) y tiene algunos otros problemas, por lo que los compradores deben tener en cuenta que debe editarse antes de su uso.
gamen
2
Aquí hay una versión limpia del script original: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
"Como está licenciado bajo GPLv2, no puedo incluirlo aquí" - tal vez deberías leer lo que dice la GPLv2, porque eso no tiene ningún sentido.
argot
44
@slang tal vez deberías leer los términos de servicio de este sitio? Las contribuciones deben tener licencia bajo la licencia Creative Commons Attribution Share Alike 3.0.
suriv
@suriv: creo que puedo entender sus razones para hacerlo, pero eso es bastante molesto. Especialmente porque CC-BY-SA es solo un poco más restrictivo que la GPL (aparte de las patentes de GPLv3).
Omnifarious
2

Si su unidad btrfs tiene subvolúmenes, debe pasar la -r <subvol-id>opción adicional a btrfs restore. Desafortunadamente, los scripts que existen, como el publicado por user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), no tienen una opción para hacerlo, pero probablemente se puedan adaptar a esto.

Si desea hacer esto a mano, debe obtener el id. Subvol. Correcto, ya sea con:

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

o alternativamente con:

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

Luego, utiliza btrfs-find-rootpara obtener el número de bloque al que desea revertir (generalmente el justo antes del máximo, que es la raíz actual). Para esto, primero debe establecer el subvolumen predeterminado en el que desea revertir los archivos (y revertir este cambio después):

# 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 puede usar btrfs restorewith -r <subvol-id>para la recuperación (inicialmente con el --dry-runargumento si lo desea):

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

Más información sobre todo esto aquí: https://btrfs.wiki.kernel.org/index.php/Restore

Catalin Hritcu
fuente
Probé esto en un sistema Fedora 26, y allí el btrfs-find-rootpaso nunca termina (es decir, se ejecuta al 100% de la CPU durante 3 horas en un FS <250 GB). Vea también una historia similar spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig