Comment restaurer des fichiers sur la partition btrfs?

19

Comment récupérer (récupérer) un fichier supprimé sur une partition btrfs?

Je n'ai pas encore pris d'instantané, je ne peux donc pas utiliser cette fonctionnalité. Je sais qu'il existe des outils pour d'autres systèmes de fichiers Linux, mais google n'a rien trouvé de spécifique à btrfs. Je suis tombé sur une vague mention que btrfs inclut un outil de suppression, mais je ne le trouve pas. 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 rsynccommande à distance qui a mal tourné.
  • Il s'agissait de petits fichiers en texte brut.
  • 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 ordinaire, mais il est volumineux (2 To).
  • J'utilise Kubuntu 12.04 (beta2) avec toutes les dernières mises à jour.
  • Je n'ai pas écrit de nouvelles données sur la partition à partir de laquelle les fichiers ont été supprimés.
  • Je n'ai pas d'instantané ni de sauvegarde de ces fichiers. (La dernière sauvegarde a juste quelques heures de plus que ces fichiers.)
  • Étrangement, un système de fichiers COW semble avoir moins d'options de suppression de fichiers que ext3 / 4 ...
MountainX pour Monica Cellio
la source

Réponses:

7

Étant donné que vos fichiers sont petits et en texte brut, j'essayerais 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

puis utilisez "/" pour rechercher les chaînes qui pourraient se trouver 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.

J'ai fait cela quand j'ai eu une situation similaire sur un autre système de fichiers sans restauration, il y a quelques années, et cela a très bien fonctionné pour moi.

Durval Menezes
la source
4

Jörg Walter a implémenté un btrfs-undeletescript shell en utilisant les outils find-rootet restorede btrfs-progs, qui peuvent être trouvés ici , et devrait aider les autres dans une position similaire.

Comme il est sous licence GPLv2, je ne peux pas l'inclure ici.

Sameer
la source
3
Il convient de noter que ledit script a au moins un chemin codé en dur (vraisemblablement par erreur) et présente quelques autres problèmes, de sorte que les acheteurs se méfient qu'il doit être modifié avant utilisation.
gamen
2
Voici une version nettoyée du script original: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
"Comme il est sous licence GPLv2, je ne peux pas l'inclure ici" - vous devriez peut-être lire ce que dit la GPLv2, car cela n'a aucun sens.
argot du
4
@slang vous devriez peut-être lire les conditions d'utilisation de ce site? Les contributions doivent être sous licence sous la licence Creative Commons Attribution Share Alike 3.0.
suriv
@suriv - Je suppose que je peux comprendre leurs raisons pour cela, mais c'est assez ennuyeux. D'autant plus que CC-BY-SA n'est que légèrement plus restrictif que la GPL (en dehors des brevets GPLv3).
Omnifarious
2

Si votre lecteur btrfs a des sous-volumes, vous devez passer l' -r <subvol-id>option supplémentaire à btrfs restore. Malheureusement, les scripts, comme celui publié par user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), n'ont pas d'option pour le faire, mais ils peuvent probablement être adaptés à cela.

Si vous voulez le faire à la main, vous devez obtenir le bon sous-id de vol, soit avec:

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

ou bien avec:

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

Ensuite, vous utilisez btrfs-find-rootpour obtenir le numéro de bloc auquel vous souhaitez revenir (généralement celui juste avant le maximum qui est la racine actuelle). Pour cela, vous devez d'abord définir le sous-volume par défaut sur celui à partir duquel vous souhaitez rétablir les fichiers (et annuler cette modification par la 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 restoreavec -r <subvol-id>pour la récupération (initialement avec l' --dry-runargument 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

Catalin Hritcu
la source
Testé sur un système Fedora 26 - et là, l' btrfs-find-rootétape ne se termine jamais (c'est-à-dire qu'elle fonctionne à 100% CPU pendant 3 heures sur un FS <250 Go). Voir aussi une histoire similaire spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig