Comment cloner le système de fichiers btrfs sur différents supports en préservant les données de partage des instantanés

9

J'ai décidé d'essayer les capacités de raid de btrfs. J'ai mis en place un btrfs avec

sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

Maintenant, je veux cloner ma partition btrfs existante (qui se trouve au-dessus de linux-raid). ne peut pas utiliser un simple cp -a, car il y a plus de 40 sauvegardes basées sur des instantanés (que je souhaite conserver), et je satisferais simplement tout le stockage que je peux épargner plusieurs fois.

Jusqu'à présent, je peux voir deux options:

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

et je suppose que je devrais aussi btrfs balance start /dev/sda9

et

faire: copier de cp -amanière incrémentielle avec autant que possible dans le stockage, puis utiliser beduppour dédoublonner les fichiers et boucler.

Quelle est la méthode préférée (c'est-à-dire les meilleures pratiques)? Je préférerais de beaucoup le premier; cela devrait prendre beaucoup moins de temps. Ou peut-être y a-t-il du mal à se cacher dans l'une de ces procédures (à côté du fait que btrfs est expérimental, bien sûr)


La première question est tout simplement hors de question; partclone.btrfsquel que soit le merveilleux outil , il ne prend évidemment pas en charge les systèmes de fichiers multi-périphériques. :-(

Adam Ryczkowski
la source

Réponses:

7

J'ai posé une question similaire il y a 2 ans.

Cependant, dans mon cas, je prévoyais seulement de copier un seul appareil sur raid0.

J'ai finalement trouvé une solution . À l'époque, vous ne pouviez pas convertir de raid0 en raid10, mais il ressemble à cela depuis le noyau 3.3, vous pouvez maintenant. Donc, cette solution peut fonctionner pour vous à la fin.

Un problème avec cette approche est qu'elle copie le fsuid. Ce qui signifie que vous ne pouvez pas monter à la fois le FS et sa copie sur la même machine. À l'époque, il n'y avait pas d'outil pour changer le fsuidFS, mais il aurait pu changer maintenant.

L'idée est d'ajouter une couche de copie sur écriture au-dessus du périphérique d'origine afin qu'elle puisse être écrite, mais toute modification est effectuée ailleurs que vous pouvez supprimer plus tard. Cela signifie que vous avez besoin d'espace de stockage supplémentaire (par exemple sur un disque externe).

Montez ensuite ce COW'd FS au lieu de l'original, ajoutez les périphériques pour la copie FS et retirez le périphérique du COW.

Pour la copie sur écriture, vous pouvez utiliser le mappeur de périphériques.

Pour la copie jetable sur la zone d'écriture, j'utilise ici un périphérique en boucle.

Disons que vous voulez cloner /dev/sdasur /dev/sd[bcde]:

Créez l'arrière boutique COW:

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store

Démontez maintenant le FS d'origine s'il est monté et modprobe -r btrfspour vous assurer qu'il ne va pas interférer et lui faire oublier son scan de périphérique.

Faites ensuite l'appareil COW:

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed

Maintenant , /dev/mapper/cowedest comme ceci /dev/sdaprès que rien écrit à elle finira dans /dev/loop0et /dev/sdasera intacte.

Maintenant, vous pouvez le monter:

mount /dev/mapper/cowed /mnt

Ajoutez les autres appareils:

btrfs dev add /dev/sd[bcde] /mnt

Et retirez l'ancien:

btrfs dev del /dev/mapper/cowed /mnt

Une fois cette opération terminée, vous souhaiterez peut-être arrêter et débrancher ou effectuer une /dev/sdalecture seule car, car il a le même fsuid que les autres, il btrfspourrait toujours gâcher.

Maintenant, si je comprends bien, en supposant que vous avez un btrfs-prog récent, vous devriez pouvoir faire:

btrfs balance start -d convert=raid10 /mnt

Pour convertir en raid10. En théorie, cela devrait garantir que chaque bloc de données est copié sur au moins 2 disques.

Je vous recommande fortement de faire des tests sur un btrfs factice sur des périphériques en boucle d'abord car tout ce qui est de la mémoire et je me suis peut-être trompé (voir par exemple ma réponse initiale avant ma modification).

Notez que depuis le noyau 3.6, btrfs implémente l'envoi / la réception un peu comme dans zfs. Cela pourrait être une option pour vous.

Stéphane Chazelas
la source
Excellente réponse, merci. Je vais le tester. Maintenant, j'expérimente avec l'envoi / la réception.
Adam Ryczkowski
@ Stéphane Chazelas Les liens gmane sont morts (probablement pour toujours). Pourriez-vous ajuster votre réponse?
Jonas Stein
4

L'idée de Stéphane peut être réalisée à l'aide des outils intégrés de btrfs (c'est pourquoi c'est cool): faire des anciens btrfs un périphérique de départ via btrfstune -S 1 /dev/device, ajouter des périphériques, supprimer le périphérique de départ, faire btrfs balance start. Un périphérique d'amorçage est un périphérique en lecture seule qui peut faire partie d'un système de fichiers accessible en écriture.

ignis
la source
1

J'ai essayé de suivre la suggestion de @ ignis d'utiliser l'amorçage mais j'ai eu des problèmes avec cela; le système a lancé une erreur en essayant de retirer le dispositif d'amorçage et je n'ai pas pu surmonter cela. Ensuite, j'ai trouvé qu'il y avait (maintenant - btrfs-progs v3.19-64-g19a806f, peut-être pas plus tôt) la commande:

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

ce qui a fait du clonage de mon système de fichiers btrfs existant (qui était dans un volume logique LVM) sur une nouvelle partition un jeu d'enfant. Notez qu'en mai 2015, cela ne fonctionne pas pour les profils RAID5 / 6 - consultez la page de manuel pour plus d'informations.

gogoud
la source
1
Ne jamais utiliser btrfs replace startà des fins de sauvegarde !! Il corrompt l'arborescence de votre appareil et rend le lecteur démontable! Il était impossible pour moi de récupérer des erreurs, j'ai donc restauré une copie d'image à partir d'un autre périphérique de bloc avec l' outil dd . À utiliser uniquement btrfs replacepour la migration finale du lecteur.
Karmus
0

Option 1 - Copie des données puis modification de l'UUID

Assurez-vous que la partition source n'est pas montée et ne sera pas montée automatiquement.

Utilisez dd(lent, stupide) oupartclone.btrfs -b -s /dev/src -o /dev/target

Utilisez btrfstune -upour changer l'UUID après la copie et avant le montage.

Avertissement de perte de données : N'essayez PAS de (auto) monter l' original ou la copie jusqu'à ce que l'UUID ait changé


Option 2 - btrfs-clone

Je n'ai pas personnellement essayé btrfs-clone, mais il prétend cloner un système de fichiers BTRFS existant vers un nouveau, en clonant chaque sous-volume dans l'ordre.

Tom Hale
la source