web-dev-qa-db-fra.com

Comment définir des fichiers sur la partition BTRFS?

Comment puis-je annuler (récupérer) un fichier supprimé sur une partition BTRFS?

Je n'ai pas encore pris un instantané, je ne peux donc pas utiliser cette fonctionnalité. Je sais qu'il y a certainsOutils pour d'autres systèmes de fichiers Linux, mais Google n'a pas encore été spécifique à BTRFS. Je suis tombé sur une vague mention que BTRFS comprend un outil non limité, mais je ne peux pas le trouver. Avant d'essayer des outils pour un autre système de fichiers, je demande ici.

Plus d'informations:

  • Les (deux) fichiers supprimés ont été supprimés par une commande distante rsync mal tournée.
  • C'étaient des petits fichiers texte simples.
  • Je connais les noms des fichiers.
  • Je pourrais peut-être me souvenir de certaines chaînes dans les fichiers.
  • Le disque est un disque dur régulier, mais il est grand (2 To).
  • Je cours Kubuntu 12.04 (BETA2) avec toutes les dernières mises à jour.
  • Je n'ai pas écrit de nouvelles données à la partition que les fichiers ont été supprimés de.
  • Je n'ai pas d'instantané ou une sauvegarde de ces fichiers. (La dernière sauvegarde n'est que quelques heures de plus que ces fichiers.)
  • Étrangement, un système de fichiers de vache semble avoir moins d'options de fichier de fichier à l'ext3/4 ...
20
MountainX

Lorsque vos fichiers sont de petit texte brut, j'essaierais de numériser la sortie des "chaînes" dans le périphérique où réside le système de fichiers, c'est-à-dire

strings /dev/sda1 | less

ensuite, utilisez "/" pour rechercher les chaînes qui pourraient être dans ce fichier. Lorsque vous trouvez le texte, délimitez le début de celui-ci avec "M" puis passez à la fin et utilisez "| CAT> Fichier" pour l'enregistrer dans un fichier.

En fait, j'ai fait cela quand j'avais une situation similaire sur un autre système de fichiers sans non -lete, quelques années de retour et cela a fonctionné très bien pour moi.

7
Durval Menezes

Si votre conduite BTRFS a des sous-volumes, vous devez transmettre le supplément -r <subvol-id> Option à btrfs restore. Malheureusement, les scripts là-bas, comme celui-ci User414471 publié ( http://oelkers.de/tips/undeletebtrfs.sh ), ne pas avoir d'option pour ce faire, mais ils peuvent probablement être adaptés pour ça.

Si vous voulez faire cela à la main, vous devez obtenir le bon sous-volant, soit avec:

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

ou alternativement avec:

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

Ensuite, vous utilisez btrfs-find-root Pour obtenir le numéro de bloc à laquelle vous souhaitez revenir (généralement celui juste avant le maximum de la racine actuelle). Pour cela, vous devez d'abord définir la sous-volume par défaut sur celle duquel vous souhaitez rétablir des fichiers (et revenir à ce changement de suite):

# 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

Vous pouvez enfin utiliser btrfs restore avec -r <subvol-id> pour la récupération (initialement avec le --dry-run argument si vous le souhaitez):

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

Plus d'informations sur tout cela ici: https://btrfs.wiki.kernel.org/index.php/restore

2
Catalin Hritcu